In letzter Zeit sind wir auf ein TCP-Verbindungsproblem aufmerksam geworden, das sich hauptsächlich auf Mac- und Linux-Benutzer beschränkt, die auf unseren Websites surfen.
Aus Benutzersicht ergibt sich eine sehr lange Verbindungszeit zu unseren Websites (> 11 Sekunden).
Wir haben es geschafft, die technische Signatur dieses Problems zu finden, können aber nicht herausfinden, warum es passiert oder wie es behoben werden kann.
Grundsätzlich passiert, dass der Client das SYN-Paket sendet, um die TCP-Verbindung herzustellen, und der Webserver es empfängt, aber nicht mit dem SYN / ACK-Paket antwortet. Nachdem der Client viele SYN-Pakete gesendet hat, antwortet der Server schließlich mit einem SYN / ACK-Paket und für den Rest der Verbindung ist alles in Ordnung.
Und natürlich der Kicker des Problems: Es tritt nur sporadisch auf und kommt nicht immer vor (obwohl es in 10-30% der Fälle vorkommt).
Wir verwenden Fedora 12 Linux als Betriebssystem und Nginx als Webserver.
Screenshot der Wireshark-Analyse
Aktualisieren:
Das Deaktivieren der Fensterskalierung auf dem Client hat das Problem verhindert. Jetzt brauche ich nur eine serverseitige Auflösung (wir können nicht alle Clients dazu bringen, dies zu tun) :)
Endgültiges Update:
Die Lösung bestand darin, sowohl die TCP-Fensterskalierung als auch die TCP-Zeitstempel auf unseren öffentlich zugänglichen Servern zu deaktivieren.
quelle
Antworten:
Wir hatten genau das gleiche Problem. Nur das Deaktivieren von TCP-Zeitstempeln löste das Problem.
Um diese Änderung dauerhaft zu machen, geben Sie einen Eintrag in ein
/etc/sysctl.conf
.Seien Sie sehr vorsichtig beim Deaktivieren der TCP Window Scale-Option. Diese Option ist wichtig, um eine maximale Leistung über das Internet zu erzielen. Jemand mit einer 10-Megabit / Sek.-Verbindung hat eine suboptimale Übertragung, wenn die Umlaufzeit (im Grunde wie Ping) mehr als 55 ms beträgt.
Wir haben dieses Problem wirklich bemerkt, als sich mehrere Geräte hinter demselben NAT befanden. Ich vermute, dass der Server möglicherweise verwirrt war, wenn Zeitstempel von Android-Geräten und OSX-Computern gleichzeitig angezeigt wurden, da sie völlig unterschiedliche Werte in die Zeitstempelfelder eingaben.
quelle
In meinem Fall hat der folgende Befehl das Problem mit fehlenden SYN / ACK-Antworten vom Linux-Server behoben:
Ich denke, es ist richtiger als das Deaktivieren von TCP-Zeitstempeln, da TCP-Zeitstempel für eine hohe Leistung (PAWS, Fensterskalierung usw.) nützlich sind .
In der Dokumentation zu wird
tcp_tw_recycle
ausdrücklich darauf hingewiesen, dass die Aktivierung nicht empfohlen wird, da bei vielen NAT-Routern Zeitstempel beibehalten werden und daher PAWS aktiviert wird, da Zeitstempel derselben IP nicht konsistent sind.quelle
net.ipv4.tcp_tw_recycle
ist das der wahre Grund. Vielen Dank.Ich frage mich nur, warum für das SYN-Paket (Frame # 539; das, das akzeptiert wurde) die Felder WS und TSV in der Spalte "Info" fehlen?
WS ist TCP Window Scaling und TSV ist Timestamp Value . Beide befinden sich im Feld tcp.options und Wireshark sollte sie weiterhin anzeigen, wenn sie vorhanden sind. Vielleicht hat der TCP / IP-Stapel des Clients beim achten Versuch ein anderes SYN-Paket gesendet, und aus diesem Grund wurde es plötzlich bestätigt?
Können Sie uns interne Werte für Frame 539 bereitstellen? Kommt das SYN / ACK immer für ein SYN-Paket, für das WS nicht aktiviert ist?
quelle
Wir sind auf genau dasselbe Problem gestoßen (es hat wirklich eine ganze Weile gedauert, es an den Server anzuheften, der keine Synchronisierung sendet).
"Die Lösung bestand darin, die TCP-Windows-Skalierung und die TCP-Zeitstempel auf unseren öffentlich zugänglichen Servern zu deaktivieren."
quelle
Um weiterzumachen, was Ansis gesagt hat, habe ich Probleme wie diese gesehen, wenn die Firewall TCP Windows Scaling nicht unterstützt. Welche Marken- / Modell-Firewall befindet sich zwischen diesen beiden Hosts?
quelle
Das fehlende SYN / ACK kann durch zu niedrige Grenzwerte Ihres SYNFLOOD-Schutzes auf der Firewall verursacht werden. Dies hängt davon ab, wie viele Verbindungen Ihr Serverbenutzer herstellt. Die Verwendung von spdy würde die Anzahl der Verbindungen verringern und könnte in Situationen hilfreich sein, in denen das
net.ipv4.tcp_timestamps
Ausschalten nicht hilft.quelle
Dies ist das Verhalten eines empfangsbereiten TCP-Sockets, wenn sein Rückstand voll ist.
In Ngnix kann das Backlog-Argument zum Abhören in der Konfiguration festgelegt werden: http://wiki.nginx.org/HttpCoreModule#listen
listen 80 backlog = num
Versuchen Sie, num auf einen Wert zu setzen, der größer als der Standardwert ist, z. B. 1024.
Ich kann nicht garantieren, dass eine vollständige Warteschlange tatsächlich Ihr Problem ist, aber dies ist eine gute erste Sache, die Sie überprüfen sollten.
quelle
Ich habe gerade festgestellt, dass Linux-TCP-Clients ihr SYN-Paket nach drei Versuchen ändern und die Option für die Fensterskalierung entfernen. Ich denke, die Kernel-Entwickler haben herausgefunden, dass dies eine häufige Ursache für Verbindungsfehler im Internet ist
Hier wird erklärt, warum diese Clients nach 11 Sekunden eine Verbindung herstellen können (die fensterlose TCP-SYN erfolgt nach 9 Sekunden in meinem kurzen Test mit den Standardeinstellungen).
quelle
Ich hatte ein ähnliches Problem, aber in meinem Fall wurde die TCP-Prüfsumme falsch berechnet. Der Client war hinter einem veth und das Ausführen von ethtool -Kveth0 rx off tx off hat den Trick gemacht.
quelle