L'établissement de TCP nécessite une poignée de main à trois pour établir et une poignée de main à quatre pour se déconnecter. L'ensemble du processus est illustré dans la figure ci-dessous :
Voyons d'abord comment établir une connexion.
【Mise à jour le 04.01.2017】Cette partie du contenu contient des images incorrectes, veuillez me pardonner. Les images correctes sont les suivantes. , faux Les images ci-jointes ne seront pas supprimées. Vous pouvez les comparer pour une meilleure compréhension. Désolé d'avoir mis autant de temps à mettre à jour ! !
La mauvaise image est la suivante :
Tout d'abord, le client envoie un message de demande de connexion. Une fois que le segment du serveur a accepté la connexion, il répond avec un message ACK et alloue des ressources pour cette connexion. Après avoir reçu le message ACK, le client envoie également un message ACK au segment serveur et alloue des ressources afin que la connexion TCP soit établie.
Comment se déconnecter ? Le processus simple est le suivant :
[Remarque] L'extrémité de la déconnexion peut être l'extrémité Client ou l'extrémité Serveur.
Supposons que le Client initie une demande d'interruption de connexion, c'est-à-dire envoie un message FIN. Une fois que le serveur a reçu le message FIN, cela signifie "Mon client n'a aucune donnée à vous envoyer ", mais si vous avez encore des données qui n'ont pas été envoyées, vous n'avez pas à vous précipiter pour fermer le Socket et vous pouvez continuer. Envoyez des données. Vous envoyez donc d'abord ACK, "Dites au client que j'ai reçu votre demande, mais que je ne suis pas encore prêt, veuillez continuer à attendre mon message ". A ce moment, le client entre dans l'état FIN_WAIT et continue d'attendre le message FIN du serveur. Lorsque le serveur détermine que les données ont été envoyées, il envoie un message FIN au client, " dit au client, d'accord, mes données ont été envoyées et je suis prêt à fermer la connexion ". Une fois que le client a reçu le message FIN, "" sait que la connexion peut être fermée, mais il ne fait toujours pas confiance au réseau et a peur que le serveur ne sache pas la fermer, il entre donc dans l'état TIME_WAIT après l'envoi. l'ACK. Si le serveur ne reçoit pas l'ACK Ensuite, vous pouvez retransmettre ", et après que le serveur ait reçu l'ACK, " saura que la connexion peut être déconnectée ". Le client n'a toujours pas reçu de réponse après avoir attendu 2MSL, ce qui prouve que le serveur a été fermé normalement. Bon, mon client peut aussi fermer la connexion . Ok, la connexion TCP est fermée comme ça !
Le statut vécu par le client pendant tout le processus est le suivant :
Le processus vécu par le serveur est le suivant :
[Note] Dans l'état TIME_WAIT, si le dernier ACK envoyé par le client TCP est perdu, il sera renvoyé. Le temps requis dans l'état TIME_WAIT dépend de l'implémentation. Les valeurs typiques sont 30 secondes, 1 minute et 2 minutes. Après avoir attendu, la connexion est officiellement fermée et toutes les ressources (y compris les numéros de port) sont libérées.
[Question 1] Pourquoi y a-t-il une poignée de main à trois lors de la connexion, mais une poignée de main à quatre lors de la fermeture ?
Réponse : Parce que lorsque le serveur reçoit le message de demande de connexion SYN du client, il peut directement envoyer le message SYN+ACK. Le message ACK est utilisé pour la réponse et le message SYN est utilisé pour la synchronisation. Mais lors de la fermeture de la connexion, lorsque le serveur reçoit le message FIN, il est probable que le SOCKET ne sera pas fermé immédiatement, il ne peut donc d'abord répondre qu'avec un message ACK, indiquant au client : « J'ai reçu le message FIN que vous avez envoyé. " Ce n'est que lorsque tous les messages côté serveur ont été envoyés que je peux envoyer le message FIN, il ne peut donc pas être envoyé ensemble. Par conséquent, une poignée de main en quatre étapes est requise.
[Question 2] Pourquoi l'état TIME_WAIT doit-il dépasser 2MSL (durée de survie maximale du segment) avant de pouvoir revenir à l'état CLOSE ?
Réponse : Bien qu'il va de soi que les quatre messages ont été envoyés et que nous pouvons entrer directement dans l'état CLOSE, nous devons prétendre que le réseau n'est pas fiable et que le dernier ACK peut être perdu. Par conséquent, l'état TIME_WAIT est utilisé pour renvoyer les messages ACK qui pourraient être perdus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!