Bricht die Sequenznummer der TCP-Paket-Header um?


16

Ich habe mich gefragt, was nach 2 ^ 32 - initial_seq_no-Übertragungen passiert, da die Sequenznummer in einem TCP-Header-Feld während des Handshakes zufällig ausgewählt und schrittweise erhöht wird, wenn Pakete ausgetauscht werden. Wird die Sequenznummer umbrochen und zu 0 oder wird der ursprüngliche Wert wiederverwendet (oder wird eine neue Verbindung an der Stelle initialisiert, an der die vorherige gestoppt wurde)?

Antworten:


19

Es dreht sich alles um 0. Laut RFC 793 :

Es ist wichtig, sich daran zu erinnern, dass der tatsächliche Sequenznummernraum endlich ist, obwohl er sehr groß ist. Dieser Raum reicht von 0 bis 2 ** 32 - 1. Da der Raum endlich ist, muss die gesamte Arithmetik, die sich mit Folgenummern befasst, modulo 2 ** 32 ausgeführt werden. Diese vorzeichenlose Arithmetik behält die Beziehung der Folgenummern bei, wenn sie wieder von 2 ** 32 - 1 auf 0 wechseln. Da die Computermodularithmetik einige Feinheiten aufweist, sollte der Vergleich dieser Werte mit größter Sorgfalt programmiert werden. Das Symbol "= <" bedeutet "kleiner oder gleich" (Modulo 2 ** 32).


3
Jede Zahl ist kleiner oder gleich jeder anderen Zahl, modulo 2 ** 32 ...
user253751

2
@ user20574 Aus diesem Grund darf die Größe des TCP-Fensters nicht größer als 1 GB werden, und der Vergleich von Folgenummern muss auf kürzestem Wege erfolgen (dh der Unterschied muss im Bereich von -2 ^ 31 bis 2 ^ 31 liegen).
Kasperd

17

Wird die Sequenznummer umbrochen und zu 0?

Ja. Alle Details finden Sie in der TCP-Spezifikation RFC 793 - Transmission Control Protocol .


Folgenummern

Es ist wichtig sich daran zu erinnern, dass der tatsächliche Sequenznummernraum endlich ist, obwohl er sehr groß ist. Dieser Bereich reicht von 0 bis 2 32 - 1.

Da der Raum begrenzt ist, müssen alle arithmetischen Umgang mit Sequenznummern Modulo 2 durchgeführt werden 32 . Diese vorzeichenlose Arithmetik behält die Beziehung der Folgenummern bei, wenn sie wieder von 2 32 - 1 auf 0 wechseln.

Da die Computermodularithmetik einige Feinheiten aufweist, sollte der Vergleich dieser Werte mit größter Sorgfalt programmiert werden. Das Symbol "= <" bedeutet "kleiner oder gleich" (Modulo 2 32 ).

Quell- RFC 793 - Übertragungssteuerungsprotokoll


1
Ich will nicht den Boten erschießen, sondern "kleiner oder gleich (modulo N)"? Offensichtlich hat der RFC-Autor die "Feinheiten der Arithmetik für Computermodule" übersehen.
Ben Voigt

In Fällen, in denen das maximale Fenster kleiner als 2 ^ 31 ist, und wenn xund vom yTyp sind, ist uint32_tes praktisch, zu definieren x<=y, um zu bedeuten (uint32_t)(y-x) < 0x80000000.
Supercat

@ BenVoigt, wahrscheinlich hielten sie es für selbstverständlich, was später in einem RFC- Tool
Carsten S

@Carsten das ist eine nützliche Arithmetik, aber es ist nicht "arithmetic modulo N"
Ben Voigt

1
@ BenVoigt, ja, was auch immer. Übrigens ist mir klar, dass die Gruppen Z / (n) nicht geordnet sind, aber ich bin auch in der Lage, Aussagen im Kontext zu interpretieren.
Carsten S

7

Ja, es wickelt sich um. Sie können es auf Wikipedia oder in RFC1323 lesen , in dem gezeigt wird, wie Sie sich vor umbrochenen Folgenummern schützen können.

Lassen Sie mich zitieren:

TCP-Zeitstempel werden in einem Algorithmus verwendet, der als Protection Against Wrapped Sequence Numbers oder PAWS bezeichnet wird (Details siehe RFC 1323). PAWS wird verwendet, wenn das Empfangsfenster die Umlaufgrenze der Sequenznummer überschreitet. Falls ein Paket möglicherweise erneut übertragen wurde, beantwortet es die Frage: "Befindet sich diese Sequenznummer in den ersten 4 GB oder der zweiten?" Und der Zeitstempel wird verwendet, um das Band zu lösen.

Und:

PAWS verwendet dieselbe TCP-Zeitstempeloption wie der zuvor beschriebene RTTM-Mechanismus und geht davon aus, dass jedes empfangene TCP-Segment (einschließlich Daten- und ACK-Segmente) einen Zeitstempel SEG.TSval enthält, dessen Werte zeitlich nicht monoton abnehmen. Die Grundidee ist, dass ein Segment als ein altes Duplikat verworfen werden kann, wenn es mit einem Zeitstempel SEG.TSval empfangen wird, der kleiner ist als ein Zeitstempel, der kürzlich für diese Verbindung empfangen wurde.

Sowohl im PAWS- als auch im RTTM-Mechanismus sind die "Zeitstempel" vorzeichenlose 32-Bit-Ganzzahlen in einem modularen 32-Bit-Raum. Daher wird "kleiner als" genauso wie für TCP-Sequenznummern definiert, und es gelten dieselben Implementierungstechniken. Wenn s und t Zeitstempelwerte sind, ist s <t, wenn 0 <(t - s) <2 ** 31, berechnet in vorzeichenloser 32-Bit-Arithmetik.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.