Gründe für Fehlgeschlagene Client-Verbindungen
Bei fehlgeschlagenen Verbindungen gibt es generell zwei Arten von Fehlermeldungen: connection refuse und connection timeout.
connection refuse (Verbindung abgelehnt)
In der Regel sind folgende Gründe dafür verantwortlich:
- Der vom Client verwendete Port ist falsch.
- Der vom Client verwendete Domainname oder die IP-Adresse ist falsch.
- Wenn der Client eine Verbindung über einen Domainnamen herstellt, könnte der Domainname auf die falsche Server-IP zeigen.
- Der Server verwendet ein CDN oder andere Accelerationsproxies, was dazu führt, dass die tatsächlich verwendete IP von der erwarteten IP abweicht.
- Der Server ist nicht gestartet oder der Port wird nicht überwacht.
- Es wird eine NetzwerProxy-Software verwendet.
- Die IP-Adresse, die der Server überwacht, und die Zugriffsadresse sind nicht im gleichen Adressbereich. Beispielsweise, wenn der Server auf 127.0.0.1 hört, kann der Client nur über 127.0.0.1 eine Verbindung herstellen und nicht über die LAN-IP oder die externe IP. Es wird empfohlen, die Überwachungsadresse auf 0.0.0.0 zu setzen, damit lokale, interne und externe Verbindungen möglich sind.
connection timeout (Verbindung timeout)
In der Regel sind folgende Gründe dafür verantwortlich:
- Die Firewall des Servers blockiert die Verbindung. Versuchen Sie, die Firewall vorübergehend zu deaktivieren.
- Wenn es sich um einen Cloud-Server handelt, kann die Sicherheitsgruppe auch die Etablierung der Verbindung blockieren, und es müssen die entsprechenden Ports im Verwaltungsbereich geöffnet werden.
- Wenn ein Panel wie 宝塔 verwendet wird, müssen die entsprechenden Ports in diesem Panel geöffnet werden.
- Der Server existiert nicht oder ist nicht gestartet.
- Wenn der Client eine Verbindung über einen Domainnamen herstellt, könnte der Domainname auf die falsche Server-IP zeigen.
- Die IP-Adresse, die der Client anruft, ist die interne Server-IP, und der Client und der Server befinden sich nicht im gleichen lokalen Netzwerk.
cannot assign requested address (Angeforderte Adresse kann nicht zugewiesen werden)
Als Client benötigt jede eingehende Verbindung einen vorübergehenden lokalen Port. Ein Server hat standardmäßig etwa 20.000 bis 30.000 verfügbare temporäre Ports. Wenn die Anzahl der Verbindungen zu einem bestimmten Server diesen Wert überschreitet, kann kein verfügbarer Port mehr zugewiesen werden, was zu diesem Fehler führt.
Die Anzahl der lokalen temporären Ports kann durch Ändern des Kernel-Parameters in /etc/sysctl.conf im Feld net.ipv4.ip_local_port_range erhöht werden, zum Beispiel auf 10000 65535 (was die Anzahl der lokalen Ports auf 55.535 erhöht). Nach der Änderung sollte sysctl -p ausgeführt werden, um die neuen Einstellungen wirksam zu machen.
Zusätzlich, nach dem Abbruch einer Verbindung, wird die Verbindung in den Zustand TIME_WAIT versetzt und belegt für eine Zeitspanne den entsprechenden lokalen Port. Daher kann das Initiieren einer großen Anzahl von (über 20.000) Kurzverbindungen auch den Fehler Cannot assign requested address verursachen. In diesem Fall kann das Problem durch schnelles Rückgewinnen des TIME_WAIT-Zustands des Kernels gelöst werden. Weitere Informationen finden Sie in den Kernel-Optimierungen.
Hinweis
Die Einschränkung der Anzahl lokaler Ports gilt nur für Clients. Server haben keine lokale Portbeschränkung, und solange genügend Ressourcen vorhanden sind, kann die Anzahl der Verbindungen des Servers als unbegrenzt betrachtet werden.
Andere Fehlermeldungen
Wenn bei einer Fehlermeldung nicht connection refuse und connection timeout auftritt, sind in der Regel folgende Gründe verantwortlich:
1. Das verwendete Kommunikationsprotokoll des Clients stimmt nicht mit dem des Servers überein.
Zum Beispiel, wenn der Server das HTTP-Kommunikationsprotokoll verwendet und der Client über das WebSocket-Kommunikationsprotokoll zugreift, kann keine Verbindung hergestellt werden. Wenn der Client das WebSocket-Protokoll verwendet, muss auch der Server das WebSocket-Protokoll unterstützen. Wenn der Server ein HTTP-Protokolldienst ist, muss der Client über das HTTP-Protokoll zugreifen.
Das Prinzip hier ist ähnlich wie das, wenn Sie sich mit einem Engländer unterhalten möchten, müssten Sie Englisch verwenden. Wenn Sie mit einem Japaner kommunizieren möchten, müssten Sie Japanisch verwenden. Dabei repräsentieren die Sprachen die Kommunikationsprotokolle, und beide Parteien (Client und Server) müssen dieselbe "Sprache" verwenden, um miteinander kommunizieren zu können; andernfalls ist eine Kommunikation nicht möglich.
Häufige Fehlermeldungen aufgrund von Inkonsistenzen im Kommunikationsprotokoll sind:
WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: Unexpected response code: xxx
WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE
Lösungsansatz:
Aus den oberen beiden Fehlermeldungen geht hervor, dass der Client eine WebSocket-Verbindung über das WS-Protokoll verwendet. Der Server muss ebenfalls das WebSocket-Protokoll verwenden, um zu kommunizieren. Beispielsweise muss der Teil des Codes, der den Server überwacht, für das WebSocket-Protokoll festgelegt werden, wie folgendermaßen:
Wenn es sich um gatewayWorker handelt, sieht der Überwachungs部分 so aus:
// websocket协议,这样客户端才能用ws://...来连。xxxx为端口不用改动
$gateway = new Gateway('websocket://0.0.0.0:xxxx');
Wenn es sich um Workerman handelt, dann ist es:
// websocket协议,这样客户端才能用ws://...来连。xxxx为端口不用改动
$worker = new Worker('websocket://0.0.0.0:xxxx');