J'ai d'abord étudié les communications majeures. Après avoir obtenu son diplôme, mes camarades de classe ont suivi leur façon de poursuivre leurs rêves et ont voyagé entre les chantiers de construction de toutes tailles. Haha, je plaisante, il y a aussi des gens incroyables qui sont entrés dans un certain institut de recherche, hein? Son père n'est pas le réalisateur, donc il ne devrait pas être trop sombre à l'intérieur. Je me souviens qu'il y avait un cours de très haut niveau appelé Computer Network (probablement ce nom). Il y a un concept sur la poignée de main, et maintenant le réviser.
Jetons un coup d'œil au schéma d'abord:
TCP est orienté vers la connexion. Quelle que soit la direction que l'autre partie envoie des données, une connexion doit être établie entre les deux parties. Dans le protocole TCP / IP, le protocole TCP fournit des services de connexion fiables et la connexion est initialisée par trois poignées de main. Le but de la poignée de main à trois est de synchroniser le numéro de série et le numéro de confirmation des deux parties et d'échanger des informations sur la taille de la fenêtre TCP.
1. Première poignée de main: établir une connexion. Le client envoie un segment de message de demande de connexion, définit la position SYN à 1 et le numéro de séquence est x; Ensuite, le client entre dans l'état Syn_Send et attend que le serveur confirme;
2. Deuxième poignée de main: le serveur reçoit le segment des messages SYN. Lorsque le serveur reçoit le segment des messages SYM du client, il doit confirmer le segment des messages SYN et définir le numéro de reconnaissance sur x + 1 (numéro de séquence + 1); En même temps, il doit également envoyer les informations de demande SYN, définir la position SYN sur 1 et le numéro de séquence sur Y; Le serveur met toutes les informations ci-dessus dans un segment de paquets (c'est-à-dire le segment des messages SYN + ACK) et l'envoie au client. À l'heure actuelle, le serveur entre dans l'état syn_recv;
3. La troisième poignée de main: le client reçoit le segment des paquets SYN + ACK du serveur. Définissez ensuite le numéro d'accusé de réception sur Y + 1 et envoyez un segment de message ACK au serveur. Une fois le segment des messages envoyé, le client et le serveur entrent dans l'état établi et complétent la poignée de main triple TCP.
Après avoir terminé trois poignées de main, le client et le serveur peuvent commencer à transmettre des données. Ce qui précède est l'introduction globale à la triple poignée de main de TCP.
Et ces quatre vagues?
Une fois que le client et le serveur ont établi une connexion TCP via trois poignées de main, lorsque la transmission des données est terminée, la connexion TCP doit être déconnectée. Ensuite, il y a un mystérieux "quatre vagues" ici pour la déconnexion de TCP.
1. La première vague: hôte 1 (peut être utilisée comme client ou comme serveur), définir le numéro de séquence et le numéro de reconnaissance, et envoyer un segment de message FIN à Host 2; À l'heure actuelle, l'hôte 1 entre dans l'état FIN_WAIT_1; Cela signifie que l'hôte 1 n'a pas de données à envoyer à l'hôte 2;
2. La deuxième vague: l'hôte 2 a reçu le segment de message FIN envoyé par l'hôte 1 et a renvoyé un segment de message ACK pour l'hôte 1. Le numéro de reconnaissance est le numéro de séquence plus 1; L'hôte 1 entre dans l'état FIN_WAIT_2; L'hôte 2 dit à l'hôte 1 que je n'ai pas de données à envoyer, donc je peux fermer la connexion;
3. La troisième vague: Host 2 envoie un segment de message FIN à l'hôte 1, demandant de fermer la connexion, et en même temps, l'hôte 2 entre dans l'état Close_wait;
4. La quatrième vague: l'hôte 1 reçoit le segment de message FIN envoyé par l'hôte 2, envoie le segment de message ACK à l'hôte 2, puis l'hôte 1 entre dans l'état Time_wait; Une fois que l'hôte 2 a reçu le segment de message ACK de l'hôte 1, il ferme la connexion; À l'heure actuelle, l'hôte 1 ne reçoit toujours pas de réponse après avoir attendu 2MSL, il prouve que le côté serveur a été fermé normalement, donc c'est OK, l'hôte 1 peut également fermer la connexion.
À ce stade, les quatre vagues de TCP ont été achevées heureusement. Lorsque vous voyez cela, vous aurez beaucoup de questions dans votre esprit, beaucoup de choses ne comprennent pas et cela semble désordonné; Ça va, continuons à résumer.
Pourquoi avez-vous besoin de serrer la main trois fois?
La poignée de main à trois voies signifie établir une connexion TCP, ce qui signifie que lors de l'établissement d'une connexion TCP, le client et le serveur doivent envoyer un total de 3 paquets pour confirmer l'établissement de la connexion. Dans la programmation de socket, ce processus est déclenché par l'exécution du client Connect.
Puisque nous avons résumé les trois poignées de main de TCP, pourquoi devons-nous faire trois fois? Pourquoi pensons-nous que nous pouvons le terminer en deux fois? Alors pourquoi TCP doit-il établir trois connexions? C'est ce que Xie Xiren a dit dans "Network informatique":
Afin d'éviter que le segment de la demande de connexion échoué soit soudainement transmis au serveur, une erreur se produit.
Dans le livre, un exemple est donné comme suit:
La génération de «segment de la demande de connexion défaillante» est dans un tel cas: le premier segment de demande de connexion envoyé par le client n'est pas perdu.
Au lieu de cela, il reste dans un certain nœud de réseau pendant longtemps, entraînant des retards jusqu'à un certain temps après la publication de la connexion avant d'atteindre le serveur. C'était à l'origine un
Il y a longtemps, le segment des messages a échoué. Cependant, après que le serveur a reçu ce segment de message de demande de connexion non valide, il a pensé à tort qu'il s'agissait de nouveau par le client envoyé par le client
demande de connexion. Le segment de l'accusé de réception a donc été envoyé au client et a accepté d'établir la connexion. En supposant que la "poignée de main à trois reprises" n'est pas adoptée, alors seul le serveur
Émettre une confirmation et la nouvelle connexion est établie. Étant donné que le client n'a pas émis de demande d'établissement d'une connexion, la confirmation du serveur ne sera pas ignorée.
Aucune donnée ne sera envoyée non plus au serveur. Mais le serveur pensait que la nouvelle connexion de transport avait été établie et attendait que le client envoie des données. donc,
De nombreuses ressources du serveur sont gaspillées. Le phénomène ci-dessus peut être empêché de se produire en utilisant la "poignée de main triple". Par exemple, la situation tout à l'heure,
Le client ne publiera pas de reconnaissance à la reconnaissance du serveur. Étant donné que le serveur ne peut pas recevoir la confirmation, il sait que le client ne nécessite pas que la connexion soit établie. "
Ceci est très clair, ce qui empêche le serveur d'attendre et de gaspiller des ressources.
Pourquoi devez-vous agiter quatre fois?
Pourquoi agitez-vous quatre fois?
Le soi-disant haleine à quatre voies consiste à résilier la connexion TCP, ce qui signifie que lorsqu'une connexion TCP est déconnectée, le client et le serveur doivent envoyer un total de 4 paquets pour confirmer la déconnexion de la connexion. Dans la programmation de socket, ce processus est déclenché par le client ou le serveur exécutant la fermeture.
Le protocole TCP est un protocole de communication de la couche de transport basé sur le flux orienté connexion, fiable, d'octets. TCP est le mode duplex complet, ce qui signifie que lorsque l'hôte 1 envoie un segment des ailerons, cela signifie simplement que l'hôte 1 n'a pas de données à envoyer. L'hôte 1 indique à l'hôte 2 que ses données ont été envoyées; Cependant, pour le moment, l'hôte 1 peut toujours accepter les données de l'hôte 2; Lorsque l'hôte 2 renvoie le segment ACK, cela signifie qu'il sait déjà que l'hôte 1 n'a pas de données à envoyer, mais l'hôte 2 peut toujours envoyer des données à l'hôte 1; Lorsque l'hôte 2 envoie également un segment d'ailettes, cela signifie que l'hôte 2 n'a pas de données à envoyer, et il indiquera à l'hôte 1 que je n'ai pas de données à envoyer, et ensuite les uns les autres interrompent cette connexion TCP. Si vous souhaitez comprendre correctement le principe de quatre vagues, vous devez comprendre les changements dans l'État pendant les quatre vagues.
FIN_WAIT_1: Cet état doit être expliqué attentivement. En fait, la vraie signification des états FIN_WAIT_1 et FIN_WAIT_2 doit tous les deux attendre le message FIN de l'autre partie. La différence entre ces deux états est: l'état FIN_WAIT_1 est en fait lorsque le socket est à l'état établi, il veut fermer activement la connexion et envoyer un message FIN à l'autre partie. À l'heure actuelle, la prise entre dans l'état FIN_WAIT_1. Lorsque l'autre partie répond au message ACK, il entre dans l'état FIN_WAIT_2. Bien sûr, dans des circonstances normales réelles, quelle que soit la partie, le message ACK doit être immédiatement répondu au message ACK. Par conséquent, l'état FIN_WAIT_1 est généralement difficile à voir, et l'état FIN_WAIT_2 peut souvent être vu avec netstat. (Parti actif)
FIN_WAIT_2: Cet état a été expliqué en détail ci-dessus. En fait, le socket dans l'état FIN_WAIT_2 signifie une semi-connexion, c'est-à-dire qu'une partie nécessite une connexion étroite, mais indique également à l'autre partie que j'ai des données à vous transmettre (informations ACK) pour le moment, puis fermer la connexion plus tard. (Parti actif)
Close_wait: Le sens de cet état est en fait d'attendre de fermer. Comment comprendre? Lorsque l'autre partie ferme une prise et vous envoie un message FIN, votre système répondra sans aucun doute à un message ACK à l'autre partie, puis il entrera dans l'état de Close_wait. Ensuite, ce que vous devez vraiment considérer, c'est de vérifier si vous avez encore des données à envoyer à l'autre partie. Sinon, vous pouvez fermer la prise et envoyer des messages FIN à l'autre partie, c'est-à-dire fermer la connexion. Ainsi, lorsque vous êtes à l'état de Close_Wait, ce que vous devez faire est d'attendre que vous fermiez la connexion. (Côté passif)
Last_ack: Cet état est relativement facile à comprendre. Il ferme passivement le message ACK de l'autre partie après avoir envoyé le message FIN. Après avoir reçu le message ACK, vous pouvez saisir l'état disponible de fermé. (Côté passif)
Time_wait: Cela signifie que le message FIN de l'autre partie a été reçu et que le message ACK a été envoyé. Attendez simplement que 2MSL revienne à l'état disponible de fermé. Si dans l'état de Finwait1, lors de la réception d'un message avec l'autre partie avec le drapeau FIN et l'indicateur ACK, vous pouvez dire directement l'état Time_wait sans passer par l'état FIN_WAIT_2. (Parti actif)
Fermé: indique que la connexion est interrompue.
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur l'analyse du principe et du processus de trois poignées de main et de quatre poignées de main dans le protocole TCP / IP. J'espère que ce sera utile à tout le monde. S'il y a des lacunes, veuillez laisser un message et attendre avec impatience vos précieuses opinions.