Programmation du serveur Linux - Établissement de la connexion TCP et changements d'état de déconnexion

Un concept plus important dans la programmation réseau est TCP / IP. Le nom chinois est protocole de transmission réseau. Par essence, TCP / IP est un protocole et l'un des protocoles les plus importants dans la programmation réseau. TCP / IP implique trop de contenu, mais l'auteur est trop faible pour apprendre et ne peut pas présenter le TCP / IP complet à tout le monde. Le but de cet article est principalement basé sur les prémisses de l'article précédent, pour introduire la connexion TCP à trois poignée de main et déconnexion Qu'ont fait exactement quatre vagues de mains? Quel est le statut du socket? Comment le statut du socket change-t-il lors de l'exécution de chaque API? J'espère qu'à travers cet article, tout le monde pourra avoir une meilleure compréhension de l'ensemble du processus de changement d'état du socket pendant le processus d'établissement et de déconnexion de la connexion TCP.
Plusieurs termes
SYN: Synchroniser les numéros de séquence, Synchroniser les numéros de séquence, valable uniquement lorsque la négociation à trois établit une connexion TCP. Représente une nouvelle demande de connexion TCP.
ACK: numéro d'accusé de réception, numéro d'accusé de réception, la marque d'accusé de réception pour les demandes TCP, et il indique également que le système homologue a bien reçu toutes les données.
FIN: indicateur de fin, FINISH, utilisé pour mettre fin à une session TCP, mais le port correspondant est toujours ouvert, prêt à recevoir les données suivantes.

[Avantages de l'article] L'éditeur recommande mon propre groupe d'échange de langues linuxC / C ++: 832218493. J'ai compilé des livres d'apprentissage et du matériel vidéo que je pense qu'il est préférable de partager. Vous pouvez les ajouter si vous en avez besoin! ~ !
Insérez la description de l'image ici

Prise de contact TCP à trois

L'établissement d'une connexion aura le processus suivant:
1) Le serveur termine l'établissement d'une connexion socket via socket (initialiser socket), bind (bind ip port), et listen (démarrer le service d'écoute), et appeler la fonction accept pour être prêt pour recevoir des connexions de demande externes. Cette étape est appelée ouverture passive.
2) Le client termine l'établissement de la connexion via le socket (initialisation du socket) et appelle la fonction de connexion pour lancer l'ouverture active. À ce stade, le client envoie une section SYN J au serveur. Le rôle de J est de dire au serveur, Dans le processus de transmission de données suivant, J est le numéro de séquence initial du client pour transmettre les données dans la connexion.
3) Une fois que le serveur a reçu le segment SYN du client, il doit répondre avec le signal de confirmation ACK, J + 1, ce qui signifie que le serveur a reçu le client La demande du client, et le numéro de série initial du client a été confirmé, et le serveur enverra la section SYN K au client. le rôle de K est de dire au client que dans le processus de transmission de données suivant, K est le serveur qui transmet les données pendant la connexion. numéro de séquence initial
4) du serveur client reçoit les points postganglionnaires SYN, renvoie un signal d'acquittement (ACK) K + 1. La connexion est établie avec succès.
L'ensemble du processus d'établissement d'une connexion nécessite au moins trois sous-sections, c'est pourquoi on l'appelle une prise de contact TCP à trois. Ce qui suit est un organigramme de la négociation à trois TCP:Insérez la description de l'image ici

Prise de contact TCP à quatre

TCP établit une connexion via une négociation à trois. Cependant, la déconnexion nécessite une négociation à quatre. Le processus de déconnexion TCP est décrit comme suit:
1. L'application client appelle la fonction de fermeture. Dans TCP, l'extrémité qui appelle se ferme en premier est activement fermé. L'extrémité activement fermée envoie la section FIN, ce qui signifie que les données ont été envoyées;
2. L'autre extrémité (c'est-à-dire le serveur) reçoit la demande de fermeture et reçoit également la section FIN, et commence à effectuer la fermeture passive opération, qui est appelée fermeture passive One end. Cette section FIN est confirmée par TCP et une section d'accusé de réception ACK est envoyée au client. Le FIN reçu est également transmis à l'application sous forme de caractère de fin de fichier, ce qui signifie que l'application ne recevra plus de données sur la connexion. après avoir reçu le FIN.;
3, après avoir reçu une fin de fichier, l'application ferme son socket, le serveur envoie également un TCP FIN une section partielle;
4, le client reçoit la section FIN, et pour déterminer l'opération de fermeture finale, ACK paquet transmis Section au serveur.
Dans tout le processus de connexion, chaque extrémité de la fermeture et de la confirmation de la fermeture nécessite respectivement une section FIN et ACK. L'ensemble du processus nécessite généralement un total de 4 sections, il est donc également appelé établissement de liaison TCP à quatre. Ce qui suit est un organigramme de la négociation à quatre de TCP fermant la connexion:
Insérez la description de l'image ici

En fait, il n'y a pas de connexion pour la transmission sur le réseau, y compris TCP.Les soi-disant «connexion» et «déconnexion» de TCP ne sont en fait qu'un terme virtuel, maintenant simplement une «connexion» entre les deux parties de la communication. "Statut" donne l'impression qu'il y a une connexion. Par conséquent, il est très important de comprendre la transition d'état de TCP. Ensuite, je présenterai l'état du socket et le changement de l'état du socket pendant le processus de connexion et de déconnexion TCP .

état du socket

Le socket définit 11 états: LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-1, CLOSE_WAIT, FIN_WAIT, LAST-ACK, TIME-WAIT, CLOSING, CLOSED.
Nous supposons que le service A demande de se connecter au service B.
LISTEN: Commencez à établir une connexion. À ce stade, le socket a été initialisé avec succès et attend la connexion
SYN-SENT: A envoie avec succès une demande de connexion à B, en attendant que l'autre partie réponde
SYN-RECEIVED: B reçoit A's demande de connexion, et a répondu à la confirmation de se connecter à A, cet état indique qu'il attend que A réponde pour confirmer la réception de ce message
ESTABLISHED: indique que la connexion a été établie avec succès; cet état est l'état normal de la transmission de données dans le phase de connexion
FIN-WAIT-1: attente de la confirmation de la demande de déconnexion active, Ou la demande simultanée est rejetée et la connexion est déconnectée. Cet état dure généralement peu de temps et il est plus difficile de capturer
FIN-WAIT-2 : En attente de B pour déconnecter l'opération. Cet état dure généralement un court laps de temps, mais si B est bloqué ou Si la connexion n'est pas fermée pour d'autres raisons, cet état continuera pendant longtemps.
CLOSE-WAIT: B a reçu La demande de déconnexion de A et attend que l'application locale envoie la demande de déconnexion.
CLOSING: A attend le signal de confirmation de fermeture de connexion de B, lorsque A reçoit la demande de déconnexion du programme local, il envoie une demande de déconnexion à B, et entre état.
LAST-ACK: B attend le signal de confirmation de déconnexion
TIME-WAIT: Attendez pendant un certain temps, confirmer B ont reçu un signal de confirmation de connexion à proximité d'un
FERMEE: la connexion est complètement fermé
alors , comment le changement d'état TCP lors d' une connexion TCP complète processus?
Jetons un coup d'œil à l'image suivante, qui est un organigramme classique des changements d'état TCP dans la programmation réseau UNIX:
Insérez la description de l'image ici

Côté serveur, la fonction socket est appelée pour créer un sockect, la fonction renvoie un descripteur de fichier socket, la fonction bind est appelée pour lier l'adresse IP et le port, puis la fonction listen est appelée. Le scokect devient le socket d'écoute , entre dans l'état LISTEN et les appels acceptent d'attendre Request (si vous voulez tester l'état LISTEN, vous pouvez créer socket => bind => listen, puis quitter après avoir dormi pendant 10 secondes, et vous pouvez le voir avec la commande netstat immédiatement après le démarrage du serveur) Le
client appelle se connecter, ouvre activement le descripteur de fichier et demande d'établir une connexion.À ce moment, la prise de contact à trois TCP sera déclenchée et entrez SYN-

Statut SENT

À ce stade, les appels du serveur acceptent et sont en phase de blocage. Après avoir reçu la demande de connexion du client, il passe à l'état SYN-RECEIVED et répond par un message de confirmation au client, en attendant que le client confirme la connexion. Après le
client reçoit le message de confirmation de connexion du serveur SYN, À ce stade, TCP a terminé la négociation à trois, et la fonction de connexion retourne pour confirmer que la connexion est établie, passe à l'état ESTABLISHED et envoie un message ACK à le serveur. (Lorsque la deuxième prise de contact est terminée et que le deuxième segment de l'étape de prise de contact est reçu par le client, la fonction de connexion retourne.)
Du côté du serveur, après avoir reçu le message de confirmation du client, accepter reçoit également le retour et le serveur entre le État ESTALISÉ. (Lorsque la troisième section de l'étape de prise de contact est reçue par le serveur, la fonction d'acceptation est renvoyée, c'est-à-dire que la moitié du temps RTT s'est écoulée après le retour de la connexion.) Une fois que le
client et le serveur ont réussi à établir une «connexion», ils démarrent À ce stade, la fonction de lecture / écriture sera appelée pour lire et écrire des données. Une fois les données lues et écrites, elle est prête à fermer la connexion.
En supposant que l'application cliente a reçu le message de réponse du serveur, le processus de communication est terminé et l'application est prête à être fermée. La fonction de fermeture est appelée pour lancer Activement close, à ce moment, le client entre dans l'état FIN-WAIT1, envoie la section FIN au serveur et attend le serveur pour confirmer que le
serveur a reçu la section de demande de déconnexion FIN (M). À ce stade, la fonction de lecture renvoie 0 et le serveur est prêt à effectuer l'opération d'arrêt, ne reçoit plus de données et envoie le message de confirmation ACK (M +1) au client. Une fois que le
client reçoit la section de confirmation, cela signifie que le serveur a reçu la demande de déconnexion, et n'enverra plus de données à ce moment et attendra que le serveur se déconnecte et entre dans l'état FIN-WAIT2. Une fois que le
serveur a envoyé une confirmation de déconnexion, il appelle la fonction de fermeture pour se déconnecter. Une fois la fonction de fermeture réussie, il envoie la section FIN au client, passe à l'état LASK-ACK et attend la confirmation du client.
Une fois que le client reçoit le segment déconnecté FIN (N) du serveur, il envoie un segment de confirmation ACK au serveur et entre dans l'état TIME-WAIT. À ce stade, il attendra suffisamment de temps, soit environ 2 des plus longs durée de vie du segment Double (2MSL), le serveur de confirmation reçoit la section de confirmation de déconnexion, puis elle disparaît. Une fois que le serveur reçoit l'ACK (N + 1) de la section de confirmation de déconnexion du client, il indique que la connexion a été complètement déconnectée. À ce stade, il passe à l'état CLOSED. Après avoir
lu un grand paragraphe de texte ci-dessus, il se peut qu'il un peu ennuyeux, voire un peu idiot. Regardez cette image animée:
Insérez la description de l'image ici

Pour résumer

Cette fois présente principalement l'état TCP et les changements d'état TCP lors du processus d'établissement et de déconnexion de la connexion TCP. La maîtrise de cela vous aidera à comprendre l'état de chaque processus dans la programmation réseau, comme vérifier si le service est démarré. À ce moment , vous pouvez utiliser netstat -nlp | grep'port number 'pour afficher la chaîne de description de l'état du service. S'il s'agit de l'état LISTEN, le service a été démarré normalement. Si le service est dans un autre état, vous pouvez utiliser le service status pour résoudre le problème.
Le style d'écriture est limité, le talent est rare et l'apprentissage, s'il y a des irrégularités dans le texte, j'espère vous le faire savoir.
Si cet article vous est utile, veuillez l'aimer, merci_
contenu plus excitant, veuillez faire attention au compte public personnel

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/lingshengxueyuan/article/details/111301607
conseillé
Classement