2012-10-18 14 views
48

Die Wikipedia article on TCP zeigt an, dass die IP-Pakete, die TCP-Segmente transportieren, manchmal verloren gehen können, und dass TCP "erneute Übertragung von verlorenen Daten anfordert".Was sind die Übertragungswiederholungsregeln für TCP?

Was genau sind die Regeln für die Anforderung der Übertragung von verlorenen Daten? Zu welcher Zeit werden die Wiederholungsanfragen durchgeführt? Gibt es eine obere Grenze für die Nummer? Gibt es eine Funktionalität für den Client, um dem Server mitzuteilen, dass er das gesamte TCP-Segment vergessen hat, für das ein Teil fehlte, als das IP-Paket verloren ging?

+0

normalerweise die Retransmissionszeit = Umlaufzeit * einige Konstante und eine feste Verzögerung (die ziemlich pessimistisch ist) für das 'syn' Paket. –

Antwort

44

Was genau sind die Regeln für die Anforderung der Übertragung von verlorenen Daten?

Der Empfänger fordert die Neuübertragung nicht an. Der Absender wartet auf einen ACK für den Bytebereich, der an den Client gesendet wird, und sendet die Pakete nach einem bestimmten Intervall erneut, wenn er nicht empfangen wird. Dies ist ARQ (Automatic Repeat reQuest). Es gibt mehrere Möglichkeiten, wie dies implementiert wird.

Stop-and-wait ARQ 
Go-Back-N ARQ 
Selective Repeat ARQ 

sind in der RFC 3366 detailliert.

Zu welcher Zeit werden die Wiederholungsanforderungen durchgeführt?

Die Retransmissions-Zeiten und die Anzahl der Versuche wird vom Standard nicht erzwungen. Es wird von verschiedenen Betriebssystemen unterschiedlich implementiert, aber die Methodik ist fest. (Eine der Möglichkeiten, um das Betriebssystem zu überprüfen?)

Die Timeouts werden in Bezug auf die RTT (Round Trip Time) Zeiten gemessen. Aber das wird nicht sehr oft wegen Fast-Retransmit benötigt, welches eintritt, wenn 3 Duplicate ACKs empfangen werden.

Gibt es eine Obergrenze für die Nummer?

Ja, es gibt. Nach einer bestimmten Anzahl von Wiederholungen wird der Host als "down" betrachtet und der Sender gibt auf und reißt die TCP-Verbindung ab.

Gibt es eine Funktion für den Client, um dem Server anzuzeigen, dass er das gesamte TCP-Segment vergessen hat, für das ein Teil fehlte, als das IP-Paket fehlte?

Der springende Punkt ist eine zuverlässige Kommunikation. Wenn Sie möchten, dass der Client ein Teil vergessen hat, würden Sie TCP gar nicht erst verwenden. (UDP vielleicht?)

7

Es gibt keine feste Zeit für die Neuübertragung. Einfache Implementierungen schätzen die RTT (Round-Trip-Time) und wenn kein ACK zum Senden von Daten in 2x dieser Zeit empfangen wurde, senden sie erneut.

Sie dann double die Wartezeit und erneut senden, wenn es wieder keine Antwort gibt. Spülen. Wiederholen.

Ausgereiftere Systeme machen bessere Schätzungen, wie lange es für die ACK dauern sollte, und schätzen genau ab, welche Daten verloren gegangen sind.

Die Quintessenz ist, dass es keine Hard-und-Fast-Regel über genau, wann neu zu übertragen gibt. Es liegt an der Implementierung.Alle Neuübertragungen werden nur vom Sender ausgelöst, wenn der Empfänger nicht antwortet.

TCP nie Daten fallen so, nein, es gibt keine Möglichkeit, einen Server anzugeben sollten einige Segmente vergessen.

+0

"Vermutungen über genau welche Daten verloren gegangen sind" SACK (selektive Bestätigung) ist nicht raten. Ich hoffe du meinst nicht SACK. –

+0

Der Empfänger kann frühere Daten erneut bestätigen, wenn ein Segment außerhalb der Reihenfolge empfangen wurde. Dies weist den Sender darauf hin, dass einige, aber nicht alle der anstehenden Pakete verloren gegangen sind und der Absender sich daher dafür entscheiden kann, nur eine Teilmenge dessen, was in seinem ausgehenden Fenster ist, erneut zu übertragen (und somit ein kleineres Netzwerkpaket und weniger Gesamtbandbreitenbenutzung) anstatt ein größeres Paket zu senden, das Daten enthält, die zuvor in einem späteren Paket gesendet wurden (was andernfalls die Latenz und die Anzahl der gesendeten Pakete im Falle mehrerer Verluste verringern würde). Es gibt keine Gewissheit, also nennen wir es eine "fundierte Vermutung". –

+1

siehe SACK. Es ist ein zusätzlicher Header, der dem Absender genau mitteilt, was der Empfänger hat. Ich glaube, fast alle heutigen TCP-Stacks implementieren SACK heutzutage –

Verwandte Themen