web-dev-qa-db-fra.com

TCP Numéro de séquence

J'essaie de comprendre comment les numéros de séquence de l'en-tête TCP sont générés.

Dans certains endroits, j'ai lu que c'est "l'index du premier octet du paquet" ( lien ici ), sur certains autres sites, c'est un nombre généré au hasard sur 32 bits qui est ensuite incrémenté.

Je ne sais pas vraiment lequel est lequel, alors voici quelques questions:

  • Comment le numéro de séquence initial est-il généré? (Veuillez fournir un numéro RFC s'il y en a un)
  • Comment est-il incrémenté?
  • Comment la clé secrète est-elle générée?

J'ai lu certains des RFC comme RFC 6528 , RFC 79 et RFC 1948 mais je n'arrive pas à comprendre lequel est réellement mis en œuvre .

J'ai lu sur le statut "std" mais quand même ...

Merci d'avance!

28
m_vdbeek

Chaque point d'extrémité d'une connexion TCP établit un numéro de séquence de départ pour les paquets qu'il envoie et envoie ce numéro dans le paquet SYN qu'il envoie dans le cadre de l'établissement d'une connexion.

Il n'y a pas exigence pour que chaque extrémité suive une procédure particulière dans le choix du numéro de séquence de départ. Le système d'exploitation est libre d'utiliser n'importe quel mécanisme qu'il souhaite, mais il est généralement préférable de choisir un nombre aléatoire, car il est plus sûr.

À partir de ce point de départ, chaque paquet envoyé par l'une ou l'autre extrémité contient deux numéros de séquence - un pour spécifier où se trouve le paquet et un numéro de séquence ACK qui signifie le nombre d'octets reçus . Les deux nombres sont compensés par le numéro de séquence de départ.

Lisez tout à ce sujet dans Wikipedia bien sûr - recherchez "numéro de séquence" dans cette page pour obtenir tous les détails sanglants.

38
Michael Slade

Dans 4.4BSD (et la plupart des implémentations dérivées de Berkeley) lorsque le système est initialisé, le numéro de séquence d'envoi initial est initialisé à 1. Cette pratique viole le RFC des exigences de l'hôte. (Un commentaire dans le code reconnaît que cela est faux.) Cette variable est ensuite incrémentée de 64 000 toutes les demi-secondes et revient à 0 toutes les 9,5 heures environ. (Cela correspond à un compteur qui est incrémenté toutes les 8 microsecondes, pas toutes les 4 microsecondes.) De plus, chaque fois qu'une connexion est établie, cette variable est incrémentée de 64 000.

2
Joy

Il s'agit d'un nombre aléatoire compris entre 0 et 4 294 967 295. Mais dans l'outil Wireshark, vous pouvez voir syn comme 0 (car il utilise un affichage relatif), mais vous pouvez le faire pour afficher le numéro de séquence d'origine en faisant Edition -> Préférences. et décocher les numéros de séquence relatifs et la mise à l'échelle de la fenêtre sous TCP. Le numéro de séquence suivant serait incrémenté en fonction du numéro ACK (a) qui est reçu (devient a + 1). ACK est augmenté en fonction de la charge utile len (l) qu'il a reçue (devient l + 1) .Notez qu'aucune donnée/charge utile n'est envoyée pendant que l'indicateur SYN/FIN est actif (ne fait incrémenter l'ACK que d'un seul pendant SYN et FIN).

1
Khrusos