Pas à pas.
Tout d’abord, présentons brièvement le protocole TCP.
TCP (Transmission Control Protocol) est un protocole de couche de transport fiable, orienté connexion et basé sur le flux d'octets. C'est compliqué, mais c'est une compétence de base que les programmeurs et le personnel d'exploitation et de maintenance doivent connaître.
Orienté objet - Les deux parties doivent établir une connexion à l'avance avant de communiquer. C'est comme passer un appel téléphonique dans la vraie vie. Le numéro du téléphone doit être composé avant que la communication puisse avoir lieu.
Fiable - Il existe de nombreuses règles dans le protocole TCP pour garantir la fiabilité des liens de communication, notamment la séparation des données d'application, le mécanisme de retransmission, la vérification des en-têtes et des données, le tri des données reçues, puis leur transmission à la couche application, la couche de réception. end supprimera les données en double et pourra effectuer un contrôle de flux.
Les données TCP sont encapsulées dans un datagramme IP au format suivant :
Contient : numéro de port [16 bits], numéro de séquence [32 bits], décalage [4 bits], réservé [6 bits], indicateur [6 bits], fenêtre taille (fenêtre) [16 bits], somme de contrôle [16 bits], pointeur d'urgence [16 bits], options TCP
Choses à noter ici :
Les paquets TCP n'ont pas d'adresse IP, ils sont sur la couche IP, mais le le port source et le port de destination.
Une connexion TCP nécessite quatre tuples pour représenter la même connexion (src_ip, src_port, dst_ip, dst_port Pour être précis, il s'agit d'un cinq-tuple, et l'un est le protocole). Mais comme nous ne parlons ici que du protocole TCP, je ne parle ici que de quadruples.
Sequence Number est le numéro de séquence du paquet, est utilisé pour résoudre le problème de la réorganisation des paquets réseau.
Le numéro d'accusé de réception est un ACK - utilisé pour confirmer la réception, utilisé pour résoudre le problème de ne pas perdre de paquets.
Window est également appelée Advertised-Window, qui est également la célèbre fenêtre coulissante (Sliding Window), utilisée pour résoudre le contrôle de flux.
TCP Flag, qui est le type de paquet, est principalement utilisé pour contrôler la machine à états TCP.
URG : Le pointeur d'urgence est valide
ACK : Confirmez que le numéro de séquence est valide
PSH : Le récepteur doit transmettre ce segment à la couche application dès que possible
RST : Rétablir la connexion
SYN : Synchronisation numéro de séquence, utilisé pour initier une connexion
FIN : L'expéditeur termine la tâche d'envoi (ferme activement)
Poignée de main à trois pour établir le lien
1 L'extrémité requérante (client) envoie un SYN=1. pour indiquer le port du serveur auquel le client a l'intention de se connecter. TCP stipule SYN=1 Il ne peut pas transporter de données, mais il consomme un numéro de séquence, déclarez donc votre numéro de séquence initial seq comme un nombre aléatoire, en supposant seq=x.
2. Le serveur confirme le segment du message client et définit le numéro de séquence de confirmation sur ACK=x+1. En même temps, il demande également de se connecter au client, envoie SYN=1 et envoie le numéro de séquence initial en supposant que seq=y.
3. Le client confirme le segment de message du serveur, envoie le numéro de séquence de confirmation et accepte d'établir une connexion avec le serveur ACK=y+1.
Ces trois segments de message complètent l'établissement de la connexion. Ce processus est également appelé poignée de main à trois
Agitez quatre fois pour déconnecter le lien
1 L'hôte 1 (peut être un client ou un serveur), définissez le numéro de séquence et le numéro d'accusé de réception et envoyez le message à l'hôte 2. Envoyez un segment de message FIN ; à ce moment, l'hôte 1 entre dans l'état FIN_WAIT_1 ; cela signifie que l'hôte 1 n'a aucune donnée à envoyer à l'hôte 2 ; 1 Un segment de message ACK, le numéro d'accusé de réception est le numéro de séquence plus 1 ; l'hôte 1 entre dans l'état FIN_WAIT_2 ; l'hôte 2 indique à l'hôte 1 que je n'ai aucune donnée à envoyer et que je peux fermer la connexion
3. 1 segment de message FIN, demandant la fermeture de la connexion, et l'hôte 2 entre dans l'état CLOSE_WAIT ;
4. L'hôte 1 reçoit le segment de message FIN envoyé par l'hôte 2, envoie un segment de message ACK à l'hôte 2, puis l'hôte 1 entre dans le segment de message FIN. État TIME_WAIT ; après que l'hôte 2 a reçu le segment ACK de l'hôte 1, il ferme la connexion à ce moment ; l'hôte 1 ne reçoit toujours pas de réponse après avoir attendu 2MSL, ce qui prouve que le serveur a été fermé normalement. peut également fermer la connexion.
À ce stade, les quatre ruptures de TCP se sont heureusement achevées.
Les icônes permettant d'établir et de déconnecter des liens sont les suivantes :
Voyons pourquoi il s'agit d'une poignée de main à trois ?
Afin d'éviter que le segment de demande de lien invalide ne soit soudainement transmis au serveur, provoquant une erreur. Donnez une châtaigne.
Le premier segment de demande de connexion envoyé par le client n'a pas été perdu, mais est resté longtemps sur un certain nœud de réseau, de sorte qu'il a été retardé pour atteindre le serveur quelque temps après la libération de la connexion. Il s’avère qu’il s’agit d’un segment de message qui a expiré depuis longtemps. Cependant, une fois que le serveur a reçu ce segment de demande de connexion invalide, il pense à tort qu'il s'agit d'une nouvelle demande de connexion envoyée à nouveau par le client. Il envoie donc un segment de message de confirmation au client et accepte d'établir la connexion. En supposant que la « prise de contact à trois » n'est pas utilisée, tant que le serveur envoie une confirmation, une nouvelle connexion est établie. Étant donné que le client n'a pas émis de demande d'établissement de connexion, il ne prêtera pas attention à la confirmation du serveur et n'enverra pas de données au serveur. Mais le serveur pense qu'une nouvelle connexion de transport a été établie et attend que le client envoie des données. De cette façon, de nombreuses ressources du serveur sont gaspillées. La méthode de la « poignée de main à trois » peut empêcher le phénomène ci-dessus de se produire. Par exemple, dans la situation actuelle, le client n'enverra pas de confirmation à la confirmation du serveur. Puisque le serveur ne peut pas recevoir la confirmation, il sait que le client n'a pas demandé d'établir une connexion. "
C'est très clair, cela empêche le serveur d'attendre et de gaspiller des ressources.
Alors pourquoi y a-t-il quatre vagues ?
Le protocole TCP est un protocole de communication de couche de transmission fiable, orienté connexion et basé sur un flux d'octets. TCP est un mode full-duplex, ce qui signifie que lorsque l'hôte 1 envoie un segment FIN, cela signifie uniquement que l'hôte 1 n'a aucune donnée à envoyer. Cependant, à ce moment-là, l'hôte 1 peut le faire. accepte toujours les données de l'hôte 2 ; lorsque l'hôte 2 renvoie le segment de message ACK, cela signifie qu'il sait déjà que l'hôte 1 n'a aucune donnée à 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 FIN ; , cela signifie que l'hôte 2 n'a aucune donnée à envoyer et dira à l'hôte 1 que je n'ai aucune donnée à envoyer, puis les deux parties se feront un plaisir d'interrompre la connexion TCP. il faut comprendre les changements de statut au cours des quatre ruptures
.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!