Raisons de l'échec de la connexion du client

Lorsqu'une connexion échoue, le client peut généralement avoir deux types d'erreurs, connection refuse et connection timeout.

connection refuse (Connexion refusée)

Les raisons sont généralement les suivantes :

  1. Le port utilisé par le client pour se connecter est incorrect.
  2. Le nom de domaine ou l'IP auquel le client se connecte est incorrect.
  3. Si le client utilise un nom de domaine pour se connecter, le nom de domaine peut pointer vers une mauvaise IP de serveur.
  4. Le serveur utilise un CDN ou un proxy d'accélération, ce qui entraîne une divergence entre l'IP réelle connectée et l'IP attendue.
  5. Le serveur n'est pas démarré ou le port n'est pas à l'écoute.
  6. Un logiciel de proxy réseau est utilisé.
  7. L'IP écoutée par le serveur et l'adresse d'accès ne se trouvent pas dans le même segment. Par exemple, si le serveur écoute 127.0.0.1, le client ne peut se connecter qu'à 127.0.0.1, et ne peut pas se connecter à l'IP du réseau local ou à l'IP externe. Il est conseillé de définir l'adresse d'écoute sur 0.0.0.0, afin que la machine locale, le réseau interne et le réseau externe puissent tous se connecter.

connection timeout (Délai de connexion dépassé)

Les raisons sont généralement les suivantes :

  1. Le pare-feu du serveur bloque la connexion, essayez de désactiver temporairement le pare-feu.
  2. Si c'est un serveur cloud, le groupe de sécurité peut également bloquer la création de connexions, vous devez ouvrir le port correspondant dans le tableau de bord de gestion.
  3. Si vous utilisez un panneau comme Baota, vous devez ouvrir le port correspondant dans Baota.
  4. Le serveur n'existe pas ou n'a pas démarré.
  5. Si le client utilise un nom de domaine pour se connecter, le nom de domaine peut pointer vers une mauvaise IP de serveur.
  6. L'IP à laquelle le client accède est une IP interne du serveur, et le client et le serveur ne sont pas sur le même réseau local.

cannot assign requested address (Impossible d'assigner l'adresse demandée)

En tant que client, chaque fois qu'une connexion est initiée, un port temporaire local est occupé. Un serveur dispose par défaut d'environ 20 000 à 30 000 ports temporaires disponibles. Si le nombre de connexions vers un serveur spécifique dépasse cette valeur, il ne sera plus possible d'assigner un port disponible, ce qui entraînera cette erreur.
Vous pouvez augmenter le nombre de ports temporaires locaux en modifiant le paramètre du noyau dans /etc/sysctl.conf en ajustant net.ipv4.ip_local_port_range, par exemple en le configurant comme 10000 65535 (ce qui augmenterait le nombre de ports locaux à 55 535), puis en exécutant sysctl -p pour appliquer les changements.
De plus, après la déconnexion, la connexion passe à l'état TIME_WAIT, ce qui occupe encore le port local correspondant pendant un certain temps. Cela signifie que initier un grand nombre de courtes connexions (plus de 20 000 à 30 000) en peu de temps peut également entraîner l'erreur Cannot assign requested address. Si c'est le cas, vous pouvez résoudre ce problème en configurant le noyau pour un recyclage rapide de TIME_WAIT, voir optimisation du noyau.

Attention
La restriction du nombre de ports locaux s'applique uniquement au client, il n'y a pas de restriction sur le nombre de ports locaux côté serveur. Tant que les ressources sont suffisantes, le nombre de connexions côté serveur peut être considéré comme illimité.

Autres erreurs

Si l'erreur rencontrée n'est pas connection refuse ou connection timeout, elle est généralement due aux raisons suivantes :

1. Le protocole de communication utilisé par le client ne correspond pas à celui du serveur.
Par exemple, si le serveur utilise le protocole de communication HTTP, le client utilisant le protocole de communication WebSocket ne pourra pas se connecter. Si le client se connecte avec le protocole WebSocket, le serveur doit également utiliser le protocole WebSocket. Si le serveur est un service HTTP, alors le client doit accéder en utilisant le protocole HTTP.

Le principe ici est similaire à si vous souhaitez communiquer avec un Britannique, alors vous devrez utiliser l'anglais. Si vous souhaitez communiquer avec un Japonais, alors vous devrez utiliser le japonais. Les langues ici sont semblables aux protocoles de communication, les deux parties (client et serveur) doivent utiliser le même langage pour communiquer ; sinon, la communication échouera.

Les erreurs courantes dues à l'incohérence des protocoles de communication incluent :

La connexion WebSocket à 'ws://xxx.com:xx/' a échoué : Erreur lors de la poignée de main WebSocket : code de réponse inattendu : xxx

La connexion WebSocket à 'ws://xxx.com:xx/' a échoué : Erreur lors de la poignée de main WebSocket : net::ERR_INVALID_HTTP_RESPONSE

Solutions :
D'après les deux erreurs ci-dessus, nous pouvons voir que le client utilise une connexion ws selon le protocole WebSocket. Le serveur doit également utiliser le protocole WebSocket pour établir la communication, par exemple, le code d'écoute du serveur doit spécifier le protocole WebSocket comme suit :

Si c'est un gatewayWorker, le code d'écoute ressemblera à

// protocole websocket, de cette façon le client peut utiliser ws://... pour se connecter. xxxx ne nécessite pas de modification
$gateway = new Gateway('websocket://0.0.0.0:xxxx');

Si c'est un Workerman, alors ce sera

// protocole websocket, de cette façon le client peut utiliser ws://... pour se connecter. xxxx ne nécessite pas de modification
$worker = new Worker('websocket://0.0.0.0:xxxx');