Principaux mystères des connexions TCP Network Packet Broker : Explication de la nécessité de la triple négociation

Configuration de la connexion TCP
Lorsque nous naviguons sur Internet, envoyons un courriel ou jouons à un jeu en ligne, nous ne pensons généralement pas à la complexité de la connexion réseau sous-jacente. Pourtant, ce sont ces étapes, en apparence anodines, qui garantissent une communication stable entre nous et le serveur. L'une des plus importantes est l'établissement de la connexion TCP, dont le cœur est la poignée de main en trois temps.

Cet article abordera en détail le principe, le processus et l'importance de la poignée de main en trois étapes. Nous expliquerons étape par étape pourquoi cette poignée de main est nécessaire, comment elle garantit la stabilité et la fiabilité de la connexion, et son rôle crucial dans le transfert de données. Une meilleure compréhension de la poignée de main en trois étapes nous permettra de mieux appréhender les mécanismes sous-jacents de la communication réseau et d'avoir une vision plus claire de la fiabilité des connexions TCP.

Processus de négociation TCP en trois étapes et transitions d'état
TCP est un protocole de transport orienté connexion, qui nécessite l'établissement d'une connexion avant toute transmission de données. Ce processus d'établissement de connexion s'effectue par une poignée de main en trois étapes.

 Échange de clés TCP en trois étapes

Examinons de plus près les paquets TCP envoyés lors de chaque connexion.

Initialement, le client et le serveur sont tous deux fermés. Le serveur écoute activement sur un port et est à l'état d'écoute, ce qui signifie qu'il doit être démarré. Ensuite, le client est prêt à accéder à la page web. Il doit établir une connexion avec le serveur. Le format du premier paquet de connexion est le suivant :

 Paquet SYN

Lorsqu'un client initie une connexion, il génère un numéro de séquence initial aléatoire (client_isn) et le place dans le champ « Numéro de séquence » de l'en-tête TCP. Simultanément, le client positionne l'indicateur SYN à 1 pour indiquer que le paquet sortant est un paquet SYN. ​​En envoyant ce premier paquet SYN au serveur, le client manifeste son intention d'établir une connexion. Ce paquet ne contient aucune donnée de la couche application (c'est-à-dire aucune donnée envoyée). À ce stade, le statut du client est marqué comme SYN-SENT.

Paquet SYN+ACK

Lorsqu'un serveur reçoit un paquet SYN d'un client, il initialise aléatoirement son propre numéro de série (server_isn) et l'insère dans le champ « Numéro de série » de l'en-tête TCP. Ensuite, il saisit client_isn + 1 dans le champ « Numéro d'accusé de réception » et positionne les bits SYN et ACK à 1. Enfin, le serveur envoie le paquet au client ; ce paquet ne contient aucune donnée de la couche application (et aucune donnée à envoyer par le serveur). À ce stade, le serveur est à l'état SYN-RCVD.

Paquet ACK

Une fois que le client reçoit le paquet du serveur, il doit effectuer les optimisations suivantes pour répondre au paquet de réponse final : premièrement, le client positionne le bit ACK de l’en-tête TCP du paquet de réponse à 1 ; deuxièmement, il saisit la valeur server_isn + 1 dans le champ « Numéro de confirmation de réponse » ; enfin, il envoie le paquet au serveur. Ce paquet peut transporter des données du client vers le serveur. Une fois ces opérations terminées, le client passe à l’état ESTABLISHED.

Une fois que le serveur reçoit le paquet de réponse du client, il passe également à l'état ÉTABLI.

Comme vous pouvez le constater, lors d'une négociation en trois étapes, seule la troisième étape peut transmettre des données, contrairement aux deux premières. Cette question est fréquemment posée en entretien d'embauche. Une fois la négociation terminée, les deux parties passent à l'état ESTABLISHED, indiquant que la connexion est établie. Le client et le serveur peuvent alors commencer à échanger des données.

Pourquoi trois poignées de main ? Pas deux, quatre ?
La réponse courante est : « La triple authentification garantit la possibilité d’envoyer et de recevoir des messages. » Cette réponse est correcte, mais elle n’apporte qu’une explication superficielle, sans aborder la raison principale. J’analyserai donc ci-dessous les raisons de cette triple authentification sous trois angles afin d’approfondir notre compréhension de ce sujet.

La poignée de main en trois étapes permet d'éviter efficacement l'initialisation de connexions historiquement répétées (la raison principale).
La procédure de validation en trois étapes garantit que les deux parties ont reçu un numéro de séquence initial fiable.
La poignée de main tripartite permet d'éviter le gaspillage de ressources.

Raison 1 : Éviter les jointures de doublons historiques
En résumé, la principale raison d'être de la poignée de main en trois étapes est d'éviter toute confusion due à l'initialisation de connexions redondantes. Dans un environnement réseau complexe, la transmission des paquets de données ne s'effectue pas toujours dans les délais impartis, et d'anciens paquets peuvent parvenir à destination avant les autres en raison de la congestion du réseau ou d'autres facteurs. Pour pallier ce problème, le protocole TCP utilise une poignée de main en trois étapes pour établir la connexion.

La poignée de main en trois étapes évite les connexions historiques dupliquées

Lorsqu'un client envoie plusieurs paquets d'établissement de connexion SYN successivement, dans des situations telles que la congestion du réseau, les événements suivants peuvent se produire :

1- Les anciens paquets SYN arrivent au serveur avant les derniers paquets SYN.
2- Le serveur répondra au client par un paquet SYN + ACK après avoir reçu l'ancien paquet SYN.
3- Lorsque le client reçoit le paquet SYN + ACK, il détermine que la connexion est une connexion historique (numéro de séquence expiré ou délai d'attente dépassé) selon son propre contexte, puis envoie le paquet RST au serveur pour interrompre la connexion.

Avec une connexion en deux étapes, il est impossible de déterminer si la connexion actuelle est une connexion historique. La connexion en trois étapes permet au client de le déterminer en fonction du contexte lorsqu'il est prêt à envoyer le troisième paquet.

1- S'il s'agit d'une connexion historique (numéro de séquence expiré ou délai d'attente dépassé), le paquet envoyé par la troisième poignée de main est un paquet RST destiné à interrompre la connexion historique.
2- S'il ne s'agit pas d'une connexion historique, le paquet envoyé pour la troisième fois est un paquet ACK, et les deux parties communicantes établissent avec succès la connexion.

Par conséquent, la principale raison pour laquelle TCP utilise la poignée de main en trois temps est qu'elle initialise la connexion afin d'empêcher les connexions historiques.

Raison 2 : Pour synchroniser les numéros de séquence initiaux des deux parties
Les deux extrémités du protocole TCP doivent conserver un numéro de séquence, élément essentiel pour garantir une transmission fiable. Les numéros de séquence jouent un rôle important dans les connexions TCP. Ils permettent notamment :

Le récepteur peut éliminer les données en double et garantir l'exactitude des données.

Le récepteur peut recevoir les paquets dans l'ordre du numéro de séquence afin de garantir l'intégrité des données.

● Le numéro de séquence permet d'identifier le paquet de données reçu par l'autre partie, assurant ainsi une transmission de données fiable.

Ainsi, lors de l'établissement d'une connexion TCP, le client envoie des paquets SYN contenant le numéro de séquence initial et attend du serveur une réponse ACK confirmant la bonne réception de ce paquet. Le serveur renvoie ensuite au client le paquet SYN contenant le même numéro de séquence initial et attend sa réponse, une fois pour toutes, afin de garantir la synchronisation fiable des numéros de séquence initiaux.

Synchronisez les numéros de série initiaux des deux parties

Bien qu'une authentification en quatre étapes permette également de synchroniser de manière fiable les numéros de séquence initiaux des deux parties, les deuxième et troisième étapes peuvent être combinées en une seule, aboutissant à une authentification en trois étapes. Cependant, cette dernière ne garantit que la réception du numéro de séquence initial d'une partie par l'autre, sans assurer la confirmation des numéros de séquence initiaux des deux parties. Par conséquent, l'authentification en trois étapes est la meilleure option pour garantir la stabilité et la fiabilité des connexions TCP.

Raison 3 : Éviter le gaspillage des ressources
En cas de simple « deuxième prise de contact », si la requête SYN du client est bloquée sur le réseau, le client ne peut recevoir le paquet ACK envoyé par le serveur et la requête SYN est donc renvoyée. Cependant, en l'absence d'une troisième prise de contact, le serveur ne peut déterminer si le client a reçu un accusé de réception (ACK) pour établir la connexion. Par conséquent, le serveur ne peut établir une connexion de manière proactive qu'après réception de chaque requête SYN. ​​Ceci entraîne les conséquences suivantes :

Gaspillage de ressources : Si la requête SYN du client est bloquée, entraînant la transmission répétée de plusieurs paquets SYN, le serveur établira de multiples connexions invalides et redondantes après réception de la requête. Ceci engendre un gaspillage inutile des ressources du serveur.

Rétention des messages : En l’absence d’une troisième étape de connexion, le serveur ne peut pas vérifier si le client a bien reçu l’accusé de réception (ACK) nécessaire à l’établissement de la connexion. Par conséquent, si des messages restent bloqués sur le réseau, le client envoie des requêtes SYN en boucle, obligeant le serveur à établir constamment de nouvelles connexions. Ceci accroît la congestion et la latence du réseau, et nuit à ses performances globales.

Éviter le gaspillage des ressources

Par conséquent, afin de garantir la stabilité et la fiabilité de la connexion réseau, TCP utilise une procédure d'établissement de connexion en trois étapes pour établir la connexion et éviter ainsi l'apparition de ces problèmes.

Résumé
LeCourtier de paquets réseauL'établissement d'une connexion TCP s'effectue en trois étapes. Lors de cette procédure, le client envoie d'abord un paquet SYN au serveur pour indiquer sa volonté d'établir une connexion. Après réception de cette requête, le serveur répond par un paquet SYN et ACK, confirmant l'acceptation de la demande de connexion, et envoie son propre numéro de séquence initial. Enfin, le client répond par un paquet ACK pour indiquer que la connexion a été établie. Les deux parties passent alors à l'état ESTABLISHED et peuvent échanger des données.

En général, le processus de poignée de main en trois étapes pour l'établissement d'une connexion TCP est conçu pour garantir la stabilité et la fiabilité de la connexion, éviter toute confusion et tout gaspillage de ressources sur les connexions historiques, et garantir que les deux parties sont en mesure de recevoir et d'envoyer des données.


Date de publication : 8 janvier 2025