Le numéro de séquence des en-têtes de paquets TCP est-il bouclé?

16

Je me demandais, puisque le numéro de séquence dans un champ d'en-tête TCP est choisi au hasard pendant la prise de contact et est progressivement incrémenté à mesure que les paquets sont échangés, que se passe-t-il après 2 ^ 32 - transmissions initiales_seq_no? Le numéro de séquence s'enroule-t-il et devient-il 0 ou la valeur initiale est-elle réutilisée (ou une nouvelle connexion est-elle initialisée à partir de l'endroit où la précédente s'est arrêtée)?

Sebi
la source

Réponses:

19

Il passe à 0. Selon la RFC 793 :

Il est essentiel de se rappeler que l'espace réel du numéro de séquence est fini, bien que très grand. Cet espace varie de 0 à 2 ** 32 - 1. Puisque l'espace est fini, toute l'arithmétique traitant des numéros de séquence doit être effectuée modulo 2 ** 32. Cette arithmétique non signée préserve la relation entre les numéros de séquence lorsqu'ils passent de 2 ** 32 - 1 à 0 à nouveau. Il y a quelques subtilités dans l'arithmétique modulo informatique, donc un grand soin doit être pris dans la programmation de la comparaison de telles valeurs. Le symbole "= <" signifie "inférieur ou égal" (modulo 2 ** 32).

jcbermu
la source
3
Chaque nombre est inférieur ou égal à tout autre nombre, modulo 2 ** 32 ...
user253751
2
@ user20574 C'est pourquoi la taille de la fenêtre TCP n'est pas autorisée à dépasser 1 Go, et la comparaison des numéros de séquence doit prendre le chemin le plus court (c'est-à-dire que la différence doit être comprise entre -2 ^ 31 et 2 ^ 31).
kasperd
17

Le numéro de séquence s'enroule-t-il et devient-il 0?

Oui. Tous les détails peuvent être trouvés dans la spécification TCP RFC 793 - Transmission Control Protocol .


Numéros de séquence

Il est essentiel de se rappeler que l'espace réel du numéro de séquence est fini, bien que très grand. Cet espace varie de 0 à 2 32 - 1.

Puisque l'espace est fini, toute arithmétique traitant des numéros de séquence doit être effectuée modulo 2 32 . Cette arithmétique non signée préserve la relation entre les numéros de séquence lorsqu'ils passent de 2 32 - 1 à 0 à nouveau.

Il y a quelques subtilités dans l'arithmétique modulo informatique, donc un grand soin doit être pris dans la programmation de la comparaison de telles valeurs. Le symbole "= <" signifie "inférieur ou égal" (modulo 2 32 ).

Source RFC 793 - Protocole de contrôle de transmission

DavidPostill
la source
1
Je ne veux pas tirer sur le messager, mais "inférieur ou égal (modulo N)"? De toute évidence, l'auteur de la RFC a raté les «subtilités de l'arithmétique des modules informatiques».
Ben Voigt
Dans les cas où la fenêtre maximale sera inférieure à 2 ^ 31, et si xet ysont de type, uint32_til est pratique de définir x<=ycomme signifiant (uint32_t)(y-x) < 0x80000000.
supercat
@BenVoigt, plus probablement ils ont pris pour acquis ce qui a été décrit plus tard dans un RFC tools.ietf.org/html/rfc1982
Carsten S
@Carsten qui est une arithmétique utile mais qui n'est pas "modulo arithmétique N"
Ben Voigt
1
@BenVoigt, oui, peu importe. Au fait, je suis bien conscient que les groupes Z / (n) ne sont pas ordonnés, mais je suis également capable d'interpréter les déclarations dans leur contexte.
Carsten S
7

Oui, ça s'enroule. Vous pouvez le lire sur Wikipedia ou sur RFC1323 , qui montre comment se protéger contre les numéros de séquence encapsulés .

Permettez-moi de citer:

Les horodatages TCP sont utilisés dans un algorithme connu sous le nom de protection contre les numéros de séquence enveloppés, ou PAWS (voir RFC 1323 pour plus de détails). PAWS est utilisé lorsque la fenêtre de réception traverse la limite enveloppante du numéro de séquence. Dans le cas où un paquet a été potentiellement retransmis, il répond à la question: "Ce numéro de séquence est-il dans les 4 premiers Go ou le second?" Et l'horodatage est utilisé pour briser le lien.

Et:

PAWS utilise la même option TCP Timestamps que le mécanisme RTTM décrit précédemment et suppose que chaque segment TCP reçu (y compris les données et les segments ACK) contient un horodatage SEG.TSval dont les valeurs sont monotones sans diminution dans le temps. L'idée de base est qu'un segment peut être rejeté comme un ancien duplicata s'il est reçu avec un horodatage SEG.TSval inférieur à un horodatage récemment reçu sur cette connexion.

Dans le mécanisme PAWS et RTTM, les «horodatages» sont des entiers non signés 32 bits dans un espace modulaire 32 bits. Ainsi, "moins de" est défini de la même manière que pour les numéros de séquence TCP, et les mêmes techniques de mise en œuvre s'appliquent. Si s et t sont des valeurs d'horodatage, s <t si 0 <(t - s) <2 ** 31, calculées en arithmétique 32 bits non signée.

MariusMatutiae
la source