Configuration de la connexion TCP
Lorsque nous naviguons sur le Web, envoyons un e-mail ou jouons à un jeu en ligne, nous ne pensons souvent pas à la connexion réseau complexe qui se cache derrière tout cela. Cependant, ce sont ces étapes apparemment petites qui garantissent une communication stable entre nous et le serveur. L’une des étapes les plus importantes est la configuration de la connexion TCP, dont l’essentiel est la négociation à trois.
Cet article abordera en détail le principe, le processus et l’importance de la poignée de main à trois. Étape par étape, nous expliquerons pourquoi la négociation à trois est nécessaire, comment elle garantit la stabilité et la fiabilité de la connexion et à quel point elle est importante pour le transfert de données. Avec une compréhension plus approfondie de la négociation à trois voies, nous comprendrons mieux les mécanismes sous-jacents de la communication réseau et une vision plus claire de la fiabilité des connexions TCP.
Processus de prise de contact à trois voies TCP et transitions d'état
TCP est un protocole de transport orienté connexion, qui nécessite l'établissement d'une connexion avant la transmission des données. Ce processus d’établissement de connexion se fait par une négociation à trois.
Examinons de plus près les paquets TCP envoyés à chaque connexion.
Initialement, le client et le serveur sont FERMÉS. Tout d'abord, le serveur écoute activement sur un port et est dans l'état LISTEN, ce qui signifie que le serveur doit être démarré. Ensuite, le client est prêt à commencer à accéder à la page Web. Il doit établir une connexion avec le serveur. Le format du premier paquet de connexion est le suivant :
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. Dans le même temps, le client définit la position du drapeau SYN sur 1 pour indiquer que le paquet sortant est un paquet SYN. Le client indique qu'il souhaite établir une connexion avec le serveur en envoyant le premier paquet SYN au serveur. Ce paquet ne contient pas de données de couche application (c'est-à-dire des données envoyées). À ce stade, le statut du client est marqué comme SYN-SENT.
Lorsqu'un serveur reçoit un paquet SYN d'un client, il initialise de manière aléatoire son propre numéro de série (server_isn) puis place ce numéro dans le champ "Numéro de série" de l'en-tête TCP. Ensuite, le serveur entre client_isn + 1 dans le champ "Numéro d'accusé de réception" et définit les bits SYN et ACK sur 1. Enfin, le serveur envoie le paquet au client, qui ne contient aucune donnée de couche application (et aucune donnée pour le serveur). à envoyer). A ce moment, le serveur est dans l'état SYN-RCVD.
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 : Tout d'abord, le client définit le bit ACK de l'en-tête TCP du paquet de réponse sur 1 ; Deuxièmement, le client saisit la valeur server_isn + 1 dans le champ « Confirmer le numéro de réponse » ; Enfin, le client envoie le paquet au serveur. Ce paquet peut transporter des données du client vers le serveur. A l'issue de ces opérations, le client entrera dans l'état ESTABLISHED.
Une fois que le serveur reçoit le paquet de réponse du client, il passe également à l'état ESTABLISHED.
Comme vous pouvez le voir dans le processus ci-dessus, lors de l'exécution d'une poignée de main à trois, la troisième poignée de main est autorisée à transporter des données, mais pas les deux premières poignées de main. C’est une question qui revient souvent lors des entretiens. Une fois la négociation à trois terminée, les deux parties entrent dans l'état ESTABLISHED, indiquant que la connexion a été établie avec succès, auquel cas le client et le serveur peuvent commencer à s'envoyer des données.
Pourquoi trois poignées de main ? Pas deux, quatre fois ?
La réponse courante est : « Parce que la poignée de main à trois garantit la capacité de recevoir et d’envoyer. » Cette réponse est correcte, mais ce n’est qu’une raison superficielle, elle ne met pas en avant la raison principale. Dans ce qui suit, j'analyserai les raisons de la triple poignée de main sous trois aspects afin d'approfondir notre compréhension de cette question.
La poignée de main à trois peut efficacement éviter l'initialisation de connexions historiquement répétées (la raison principale)
La négociation à trois 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 jointures historiques en double
En un mot, la principale raison de la négociation à trois est d'éviter toute confusion causée par l'ancienne initialisation de connexion en double. Dans un environnement réseau complexe, la transmission des paquets de données n'est pas toujours envoyée à l'hôte de destination conformément à l'heure spécifiée, et les anciens paquets de données peuvent arriver en premier à l'hôte de destination en raison de la congestion du réseau et d'autres raisons. Pour éviter cela, TCP utilise une négociation à trois pour établir la connexion.
Lorsqu'un client envoie successivement plusieurs paquets d'établissement de connexion SYN, dans des situations telles que la congestion du réseau, les événements suivants peuvent se produire :
1- Les anciens paquets SYN arrivent sur le 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 délai d'attente) selon son propre contexte, puis envoie le paquet RST au serveur pour abandonner la connexion.
Avec une connexion à deux prises de contact, il n'existe aucun moyen de déterminer si la connexion actuelle est une connexion historique. La négociation à 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 la troisième poignée de main est un paquet RST pour abandonner 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 interlocuteurs établissent avec succès la connexion.
Par conséquent, la principale raison pour laquelle TCP utilise la négociation à trois est qu’il 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, ce qui est un facteur clé pour garantir une transmission fiable. Les numéros de séquence jouent un rôle important dans les connexions TCP. Ils effectuent les tâches 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.
Par conséquent, 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 avec un paquet ACK indiquant une réception réussie du paquet SYN du client. Ensuite, le serveur envoie le paquet SYN avec le numéro de séquence initial au client et attend que le client réponde une fois pour toutes pour garantir que les numéros de séquence initiaux sont synchronisés de manière fiable.
Bien qu'une prise de contact à quatre voies soit également possible pour 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 étape, ce qui donne lieu à une prise de contact à trois voies. Cependant, les deux poignées de main ne peuvent garantir que le numéro de séquence initial d'une partie est reçu avec succès par l'autre partie, mais il n'y a aucune garantie que le numéro de séquence initial des deux parties puisse être confirmé. Par conséquent, la négociation à trois voies est le meilleur choix à prendre afin de garantir la stabilité et la fiabilité des connexions TCP.
Raison 3 : évitez de gaspiller les ressources
S'il n'y a qu'une "deux prises de contact", lorsque la demande SYN du client est bloquée dans le réseau, le client ne peut pas recevoir le paquet ACK envoyé par le serveur, donc le SYN sera renvoyé. Cependant, puisqu'il n'y a pas de troisième prise de contact, 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 de manière proactive qu’après avoir reçu chaque requête SYN. Cela conduit à ce qui suit :
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 redondantes invalides après avoir reçu la requête. Cela conduit à un gaspillage inutile des ressources du serveur.
Rétention des messages : en raison de l'absence d'une troisième prise de contact, le serveur n'a aucun moyen de savoir si le client a correctement reçu l'accusé de réception ACK pour établir la connexion. Par conséquent, si les messages restent bloqués sur le réseau, le client continuera à envoyer des requêtes SYN encore et encore, obligeant le serveur à établir constamment de nouvelles connexions. Cela augmentera la congestion et les retards du réseau et affectera négativement les performances globales du réseau.
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 de la connexion TCP se fait par une négociation à trois. Lors de la négociation à trois, le client envoie d'abord un paquet avec l'indicateur SYN au serveur, indiquant qu'il souhaite établir une connexion. Après avoir reçu la demande du client, le serveur répond un paquet avec les indicateurs SYN et ACK au client, indiquant que la demande de connexion est acceptée, et 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. Ainsi, les deux parties sont dans l’état ESTABLISHED et peuvent commencer à s’envoyer des données.
En général, le processus d'établissement de connexion à 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.
Heure de publication : 08 janvier 2025