Übermäßiges 'TCP Dup ACK' und 'TCP Fast Retransmission' verursachen Probleme im Netzwerk. Was verursacht das?

7

Ich erhalte übermäßige TCP Dup ACK- und TCP Fast Retransmission in unserem Netzwerk, wenn ich Dateien über die MetroEthernet-Verbindung übertrage. Die beiden Standorte sind über einen Sonicwall-Router verbunden, sodass die Standorte nur einen Sprung entfernt sind.

Hier ist ein Screenshot von Wireshark und hier ist die gesamte Aufnahme. In dieser Erfassung lautet der Client 192.168.2.153 und der Server 192.168.1.101. Hier ist eine Traceroute von meinem System zum Server (die Ping-Zeiten liegen normalerweise unter 10 ms):

user@pc567:~$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:e0:b8:c8:0c:7e  
          inet addr:192.168.2.153  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::2e0:b8ff:fec8:c7e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:244994 errors:0 dropped:0 overruns:0 frame:0
          TX packets:149148 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:319571991 (319.5 MB)  TX bytes:12322180 (12.3 MB)
          Interrupt:16 

user@pc567:~$ traceroute -n 192.168.1.101
traceroute to 192.168.1.101 (192.168.1.101), 30 hops max, 60 byte packets
 1  192.168.2.254  0.747 ms  0.706 ms  0.806 ms
 2  192.168.1.101  8.995 ms  9.217 ms  9.477 ms
user@pc567:~$

Jede Hilfe zu den Ursachen wäre hilfreich! Ich kann weitere Details posten.

UPDATE: Seitdem habe ich die Sonicwall durch einen 1800 Cisco Router ersetzt. Die Paketerfassung mit installierter Version hatte die gleichen Ergebnisse. Da es sich um eine Metro-Ethernet-Verbindung handelt, ist kein Router erforderlich. Daher habe ich auch versucht, an beiden Standorten eine direkte Verbindung zu Laptops in die Geräte der Dienstanbieter herzustellen und diese in dasselbe Subnetz zu stellen. Auf diese Weise sieht die Paketerfassung genauso aus. Dies lässt mich glauben, dass es ein Problem mit der Metro-Ethernet-Schaltung gibt, obwohl sie weiterhin sagen, dass nichts falsch ist und alles in Ordnung ist.

Ingram
quelle

Antworten:

4

Mir ist klar, dass diese Antwort vereinfacht und nicht so explizit ist, wie ich es gerne hätte. Wenn Sie also Fragen zu einem Schritt haben, fragen Sie bitte!

Wenn Sie nach dem Öffnen dieser Datei in Wireshark ein wenig nach unten scrollen, sehen Sie einige Frames in verschiedenen Farben. Sieht wirklich schlecht aus, oder? Nun, es ist nicht so schlimm. Warte, wir kommen dorthin.

Wenn wir das SYN-Paket (Frame 37) überprüfen, sehen wir SACK und Fensterskalierung in den TCP-Optionen. Gut. Gleiches gilt für die SYN / ACK- (Frame 38), SACK- und Windows-Skalierung. Genial. Sehen Sie nichts Seltsames in Bezug auf SACK.

Eine Schätzung der entladenen RTT ist die Zeit zwischen dem SYN-Paket und der ersten ACK (Rahmen 39). Es sind ungefähr 9,3 ms, was Ihren Ergebnissen entspricht. Beachten Sie, dass die Zeit zwischen SYN / ACK und ACK (Frames 38 und 39) viel kürzer ist als zwischen SYN und SYN / ACK (37 und 38). Dies bedeutet, dass diese Erfassungsdatei am Empfänger aufgenommen wird. Um zu sehen, warum dies nicht ideal ist, müssen wir wieder zur Schule gehen.

Zwischen dem Sender und dem Empfänger befindet sich ein Teil des Netzwerkpfads, der am kleinsten ist, wodurch die Bandbreite begrenzt wird. Die RTT-Schätzung, die wir gerade vom Handshake erhalten haben, gibt uns eine Schätzung der Länge dieses Netzwerkpfads. Ein Maß dafür, wie viele Pakete in diese Pipe passen, ist die Rohrkapazität oder das Bandbreitenverzögerungsprodukt - PC [Bits] = R [Bits / s] * RTT [s], wobei R die kleinste Bandbreite ist. Die Rohrkapazität ist dann ein Maß für das Volumen.

Stellen Sie sich einen Gartenschlauch vor. Sein gemessenes Volumen wird auf die gleiche Weise durch seine Länge und seine Breite definiert, oder? Um das meiste Wasser herauszuholen, muss es vollständig mit Wasser gefüllt sein, da sonst Luftspalte den Wasserfluss einschränken. Falls es uns gelingt, es vollständig zu füllen, kann es überlaufen. Wir können einen Eimer verwenden, damit der Boden nicht nass wird und wenn der Eimer überläuft, wirkt sich dies nicht auf den Wasserfluss aus.

Es stellt sich heraus, dass es im Netzwerkpfad genau dasselbe ist. Wir müssen das Rohr füllen ... Mit anderen Worten, die Rohrkapazität ist das kleinste Byte im Flug (wie viel Wasser wir im Rohr + Eimer haben) zwischen dem Sender und dem Empfänger, das die kleinste Bandbreite voll ausnutzt (verursacht nicht) Luftspalte). Also, wenn die Bytes im Flug> PC sind, dann sind wir gut!

Wenn wir uns die TCP-Trace- Statistik -> TCP StreamGraph -> Zeitsequenzdiagramm (tcptrace) ansehen, sehen wir Bytes auf der Y-Achse und die Zeit auf der X-Achse. Die Ableitung dieser Kurve ist Bytes / Sekunde oder Durchsatz. Beachten Sie, wie flach die schwarze "Linie" ist, was bedeutet, dass der Durchsatz stabil ist! Es wird zwar einige Male durch blaue Linien unterbrochen (dies sind die SACK-Bereiche in den doppelten ACKs), aber wie zu sehen ist, hat dies keinen Einfluss auf den Durchsatz.

Sehen Sie, wie die graue durchgezogene Linie unten rechts (etwas zoomen, das sind die ACKs) den schwarzen TCP-Segmenten wirklich nahe kommt? Die Zeit zwischen dem TCP-Segment und dem ACK ist die RTT, hier ist es fast 0! Dies bedeutet, dass nicht viele Segmente im Flug diesen Erfassungspunkt passieren. Dies bedeutet wiederum, dass wir das nicht verwenden können, um die Bytes im Flug zu schätzen, und deshalb ist eine senderseitige Paketerfassung viel besser.

Pakete hier gehen natürlich vor dem Erfassungspunkt verloren. Jedes Datensegment, das zum Zeitpunkt des Verlusts im Flug war, löst eine doppelte ACK aus. Daher können wir die Anzahl der doppelten ACKs verwenden, um die Bytes im Flug zum Zeitpunkt des Paketverlusts zu schätzen. Hier sehen wir ungefähr 9, 16 und 23 Segmente. Jedes Segment verfügt über 1448 Datenbytes. Dies ergibt einen Flugbyte zwischen 13 KB und 33 KB. Der Durchsatz betrug hier ungefähr 3 Mbit / s (aus dem E / A- Diagramm ) und mit der RTT haben wir gemessen, bevor wir eine Rohrkapazität von weniger als 3e6 [Bits / s] * 10e-3 [s] / 8 Bytes = 3750 Bytes oder erhalten haben weniger als 3 Segmente.

Da die zum Zeitpunkt dieser Verluste im Flug befindlichen Bytes nicht wirklich gleich sind (hier mit so wenigen Stichproben schwer zu sagen), kann ich nicht wirklich sagen, ob es sich um zufällige Verluste (die schlecht, schlecht, schlecht sind) oder um Verluste aufgrund einer Warteschlange handelt / Bucket läuft über, aber sie treten auf, wenn Bytes im Flug> PC sind, sodass der Durchsatz nicht beeinträchtigt wird.

Ihre Antwort scheint darauf hinzudeuten, dass sie zwar zufällig waren, aber nicht so viele, um einen geringen Durchsatz zu verursachen.

Bytesinflight
quelle
3

Ich poste gerade, was ich herausgefunden habe. Der MetroEthernet-Anbieter kam an einem Samstag in unser Hauptbüro. Dort trennten sie das Netzwerk und hatten auch jemanden in einer Filiale in der Nähe. Sie schlossen an beiden Enden Netzwerktestgeräte an und konnten schnell feststellen, dass tatsächlich ein Problem aufgetreten war. Einige Stunden später konnten sie das Problem eingrenzen. Es war ein Problem mit den Kupferleitungen von der Zentrale des Anbieters zu unserer Hauptniederlassung. Sie sagten, dass Frames wie verrückt abfielen, was die erneuten Übertragungen verursachte. Sie haben das Problem mit dem Kupferdraht in ihrer Zentrale behoben (sie sagten, sie müssten jeden Draht einzeln auseinander ziehen. Klingt für mich nach BS), aber nachdem sie dies in ihrer Zentrale getan hatten, war das Problem gelöst.

Ingram
quelle
2
Wenn das Problem dadurch tatsächlich behoben wurde, markieren Sie es bitte als behoben, indem Sie auf das Häkchen klicken. Andernfalls denken andere, dass es sich um eine offene Frage handelt.
Michael Hampton
2

Wenn ich mir die von Ihnen bereitgestellte Aufnahme ansehe (danke, dass Sie das getan haben!), Kann ich zu Beginn ein ziemlich klassisches Muster für die erneute Übertragung erkennen. Sie können es um Paket 50 herum sehen. Es fehlt ein Paket zwischen 51 und 52. Was passiert, ist Folgendes:

  1. -> Paket 50 Daten
  2. <- Paket 51 ACK-Paket 50.
  3. -> Paket 52 Daten
  4. <- Paket 53 ACK-Paket 50.
  5. -> Paket 54 Daten
  6. <- Paket 55 ACK-Paket 50.

Ein Datenpaket wurde verworfen, und der Empfänger zeigt dies an, indem er das Paket bis zu dem, was es bisher gesehen hat, weiter bestätigt. Interessant ist hier, dass beide Seiten TCP SACK Permitted Option = Truebei der Aushandlung der Verbindung festgelegt hatten, sodass Paket 55 einen SACK-Header enthalten sollte und dies nicht der Fall ist. Durch selektive Bestätigungen kann ein Empfänger "Ich habe alles bis zu 51, aber auch 53-55 gesehen" anzeigen, wodurch die Anzahl der erneuten Übertragungen verringert wird, die erforderlich sind, um die Dinge wieder auf volle Geschwindigkeit zu bringen.

Was passiert, da SACK nicht verwendet werden kann, ist, dass es auf die Standard-TCP-Neuübertragungsmethode zurückgreift, bei der "Ich habe bis zu 50 gesehen" wiederholt wird, bis die andere Seite es herausfindet und alles 50 und höher erneut überträgt.

In Paket 66 gibt es eine erneute Übertragung, auf die unmittelbar eine Bestätigung bis zum Paket 56 folgt. Nach der zweiten erneuten Übertragung (Paket 72) ist die Verbindung wieder auf dem richtigen Weg.

Zunächst einmal ist es wahrscheinlich, dass die SACK-Header von den Sonicwalls entfernt werden, wodurch verhindert wird, dass Neuübertragungen so schnell wiederhergestellt werden, wie sie verhandelt haben. Persönlich bin ich der Meinung, dass SACK-Strippen sinnlos ist, aber andere mögen anderer Meinung sein.

Nach allem, was ich bei dieser Erfassung feststellen kann, tritt gelegentlich ein Paketverlust auf, der dazu führt, dass die TCP-Verbindungen normale Neuübertragungsprotokolle durchlaufen. Die Firewalls stören, da eine von beiden Seiten ausgehandelte Neuübertragungsmethode nicht zulässig ist.

sysadmin1138
quelle
Danke für die Antwort. Entschuldigung für die späte Antwort. Seitdem habe ich die Sonicwall durch einen Cisco-Router der 1800er-Serie ersetzt. Ich habe genau die gleichen Ergebnisse bei der Paketerfassung gesehen.
Ingram
@Ingram SACK-Stripping ist etwas, was Firewalls oft tun. SACKs können in bestimmten Edge-Cases für DoS-Angriffe verwendet werden .
sysadmin1138