Les mystères clés des connexions TCP du Network Packet Broker : la nécessité du Triple Handshake démystifiée

Configuration de la connexion TCP
Lorsque nous naviguons sur le Web, envoyons un e-mail ou jouons à un jeu en ligne, nous oublions souvent la complexité de la connexion réseau qui se cache derrière. Pourtant, ce sont ces étapes, apparemment simples, qui assurent une communication stable entre nous et le serveur. L'une des étapes les plus importantes est la configuration de la connexion TCP, et son cœur est le protocole de communication à trois.

Cet article détaille le principe, le processus et l'importance du protocole de communication en trois étapes. Nous expliquerons étape par étape pourquoi il est nécessaire, comment il garantit la stabilité et la fiabilité des connexions, et son importance pour le transfert de données. Une compréhension approfondie du protocole de communication en trois étapes nous permettra de mieux comprendre 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 à trois voies et transitions d'état
TCP est un protocole de transport orienté connexion qui requiert l'établissement d'une connexion avant la transmission des données. Ce processus d'établissement de connexion s'effectue par un protocole de transfert à trois voies.

 Poignée de main TCP à trois voies

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

Initialement, le client et le serveur sont tous deux fermés. Le serveur écoute activement sur un port et est en é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 établit 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. Parallèlement, le client définit la position de l'indicateur SYN à 1 pour indiquer que le paquet sortant est un paquet SYN. ​​Le client indique qu'il souhaite établir une connexion avec le serveur en lui envoyant le premier paquet SYN. ​​Ce paquet ne contient pas de données de couche application (c'est-à-dire de données envoyées). À 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'inscrit dans le champ « Numéro de série » de l'en-tête TCP. Ensuite, le serveur saisit client_isn + 1 dans le champ « Numéro d'accusé de réception » et met les bits SYN et ACK à 1. Enfin, le serveur envoie le paquet au client, qui ne contient aucune donnée de la couche application (ni aucune donnée à transmettre). À ce stade, le serveur est en état SYN-RCVD.

Paquet ACK

Une fois le paquet reçu du serveur, le client doit effectuer les optimisations suivantes pour répondre au paquet de réponse final : il définit d'abord le bit ACK de l'en-tête TCP du paquet de réponse à 1 ; il saisit ensuite la valeur server_isn + 1 dans le champ « Confirmer le numéro 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 ESTABLISHED.

Comme le montre le processus ci-dessus, lors d'une négociation à trois voies, la troisième négociation est autorisée à transmettre des données, contrairement aux deux premières. C'est une question souvent posée lors des entretiens. Une fois la négociation à trois voies terminée, les deux parties passent à l'état ÉTABLISSÉ, indiquant que la connexion a été établie avec succès. Le client et le serveur peuvent alors commencer à s'échanger des données.

Pourquoi trois poignées de main ? Pas deux, mais quatre ?
La réponse courante est : « Parce que la triple poignée de main garantit la réception et l'envoi. » Cette réponse est correcte, mais elle n'en est qu'une explication superficielle, sans mettre en avant la raison principale. Dans ce qui suit, j'analyserai les raisons de la triple poignée de main sous trois angles afin d'approfondir notre compréhension de ce problème.

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

Raison 1 : éviter les doublons historiques
En résumé, la principale raison d'être du protocole de transfert à trois voies est d'éviter toute confusion due à l'initialisation d'une ancienne connexion en double. Dans un environnement réseau complexe, la transmission des paquets de données à l'hôte de destination n'est pas toujours effectuée dans les délais impartis, et les anciens paquets de données peuvent arriver en premier à l'hôte de destination en raison de la congestion du réseau ou d'autres raisons. Pour éviter cela, TCP utilise un protocole de transfert à trois voies pour établir la connexion.

la poignée de main à trois évite les connexions en double historiques

Lorsqu'un client envoie successivement plusieurs paquets d'établissement de connexion SYN, dans des situations telles qu'une 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 un paquet SYN + ACK au client 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 timeout) selon son propre contexte, puis envoie le paquet RST au serveur pour interrompre la connexion.

Avec une connexion à deux poignées de main, il est impossible de déterminer si la connexion actuelle est une connexion historique. La poignée de main à trois voies permet au client de déterminer si la connexion actuelle est une connexion historique 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 timeout), le paquet envoyé par le troisième handshake est un paquet RST pour 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 négociation à trois est qu'elle initialise la connexion pour empêcher les connexions historiques.

Raison 2 : Pour synchroniser les numéros de séquence initiaux des deux parties
Les deux côtés du protocole TCP doivent conserver un numéro de séquence, facteur clé pour garantir une transmission fiable. Les numéros de séquence jouent un rôle important dans les connexions TCP. Ils remplissent les fonctions suivantes :

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

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

● Le numéro de séquence peut identifier le paquet de données qui a été reçu par l'autre partie, permettant une transmission de données fiable.

Ainsi, lors de l'établissement d'une connexion TCP, le client envoie des paquets SYN avec le numéro de séquence initial et demande au serveur de répondre par un paquet ACK indiquant la bonne réception du paquet SYN du client. Le serveur envoie ensuite le paquet SYN avec le numéro de séquence initial au client et attend sa réponse définitive afin de garantir la synchronisation fiable des numéros de séquence initiaux.

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

Bien qu'une négociation à quatre voies 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, ce qui donne une négociation à trois voies. Cependant, ces deux négociations garantissent uniquement la réception du numéro de séquence initial d'une partie par l'autre, sans toutefois garantir sa confirmation. Par conséquent, la négociation à trois voies est la meilleure solution pour garantir la stabilité et la fiabilité des connexions TCP.

Raison 3 : Éviter le gaspillage des ressources
En cas de double établissement de connexion, lorsque la requête SYN du client est bloquée sur le réseau, le client ne peut pas recevoir le paquet ACK envoyé par le serveur ; le paquet SYN est donc renvoyé. Cependant, en l'absence de troisième établissement de connexion, le serveur ne peut pas 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 proactivement qu'après réception de chaque requête SYN. ​​Ceci conduit au problème suivant :

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 plusieurs connexions invalides redondantes après réception de la requête. Cela entraîne un gaspillage inutile de ressources serveur.

Conservation des messages : En l'absence d'une troisième poignée de main, le serveur n'a aucun moyen de savoir si le client a bien reçu l'accusé de réception ACK pour établir la connexion. Par conséquent, si des messages restent bloqués sur le réseau, le client enverra sans cesse des requêtes SYN, obligeant le serveur à établir constamment de nouvelles connexions. Cela augmentera la congestion et les retards du réseau, et nuira à ses performances globales.

Évitez de gaspiller des ressources

Par conséquent, afin de garantir la stabilité et la fiabilité de la connexion réseau, TCP utilise la négociation à trois pour établir la connexion afin d'éviter l'apparition de ces problèmes.

Résumé
LeCourtier de paquets réseauL'établissement d'une connexion TCP s'effectue par un échange de données en trois étapes. Lors de cet échange, le client envoie d'abord un paquet avec l'indicateur SYN au serveur, indiquant qu'il souhaite établir une connexion. Après réception de la requête du client, le serveur lui répond par un paquet avec les indicateurs SYN et ACK, indiquant que la demande de connexion est acceptée, et lui envoie son propre numéro de séquence initial. Enfin, le client répond avec un indicateur ACK au serveur pour indiquer que la connexion a été établie avec succès. Les deux parties sont alors dans l'état ÉTABLISSÉ et peuvent commencer à s'échanger des données.

En général, le processus de négociation à trois voies pour l'établissement d'une connexion TCP est conçu pour garantir la stabilité et la fiabilité de la connexion, éviter la confusion et le 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 : 08/01/2025