Nous savons tous que TCP est un protocole de communication de couche de transport fiable, orienté connexion et basé sur le flux d'octets.
Qu'est-ce que TCP
Le "Orienté connexion" mentionné ici signifie que vous devez établir une connexion, utiliser la connexion et libérer la connexion.
Établir une connexion fait référence à la célèbre prise de contact à trois voies TCP.
Et par connexion, la transmission des données s'effectue sous la forme d'un envoi et d'une confirmation.
L'autre chose est Release connection, qui est notre TCP quatre vagues commune.
TCP fait signe quatre foisVous devriez le connaître, mais avez-vous déjà vu faire signe trois fois ? Et qu'en est-il de agiter deux fois ?
Les avez-vous tous vus ? Et les quatre poignées de main ?
Le sujet d’aujourd’hui ne concerne pas seulement la curiosité ou les anecdotes.
Commençons par les quatre vagues et acquérons quelques connaissances pratiques.
TCP Four Waves
Un bref aperçu de TCP Four Waves.
TCP ondes quatre fois
dans des circonstances normales. Tant que la transmission des données est terminée, qu'il s'agisse du client ou du serveur, vous pouvez lancer activement quatre vagues pour libérer la connexion.
Tout comme la photo, en supposant que les quatre vagues soient initiées par le client, alors c'est la fête active. Le serveur reçoit passivement la demande de vague du client, appelée Passive Party.
Le client et le serveur, initialement, sont en STATUT ÉTABLI. ESTABLISHED状态。
🎜Première vague🎜 : Dans des circonstances normales, la partie active effectue close() ou Le message FIN apparaît, indiquant "🎜Je n'enverrai plus de données🎜". 🎜🎜🎜La deuxième vague🎜 : Après avoir reçu le Après le message FIN, la partie passive répond immédiatement par un ACK, ce qui signifie "J'ai reçu votre FIN, et je sais aussi que vous n'enverrez plus de données." 🎜🎜Ce qui précède est que la 🎜partie active🎜 n'envoie plus de données. Mais si à ce moment-là, le 🎜partiel passif🎜 a encore des données à envoyer, alors continuez l'envoi. Notez que même si le côté passif peut envoyer des données au côté actif entre la deuxième et la troisième vague, il n'est pas certain que le côté actif puisse les recevoir normalement. Nous en discuterons plus tard. 🎜🎜🎜La troisième vague🎜 : Une fois que la partie passive aura détecté la deuxième vague, elle effectuera une série de travaux de finition et appellera enfin un close( ), alors la troisième vague sera émise FIN-ACK. 🎜
La quatrième vague : la partie active répond avec unACK, signifiant reçu. ACK,意思是收到了。
另外不管是主动还是被动,每方发出了一个 FIN 和一个ACK 。也收到了一个 FIN 和一个ACK 。这一点大家关注下,待会还会提到。
FIN一定要程序执行close()或shutdown()才能发出吗?
不一定。一般情况下,通过对socket执行 close() 或 shutdown() 方法会发出FIN。但实际上,只要应用程序退出,不管是主动退出,还是被动退出(因为一些莫名其妙的原因被kill了), 都会发出 FIN
La première vague et la troisième vague sont toutes deux activement déclenchées par nous dans l'application (par exemple en appelant close()method), c'est ce que nous il faut faire attention lors de l’écriture du code. 🎜🎜Les deuxième et quatrième vagues sont effectuées automatiquement par la pile de protocoles du noyau pour nous. Nous ne pouvons pas toucher cet endroit lorsque nous écrivons du code, nous n'avons donc pas besoin de trop nous en soucier. 🎜🎜De plus, qu'elle soit active ou passive, chaque partie envoie un FIN et un ACK . A également reçu un FIN et un ACK . 🎜Veuillez prêter attention à ce point et je le mentionnerai plus tard. 🎜🎜
FIN doit-il être émis après l'exécution du programme close() ou shutdown() ?
🎜🎜 ne l'est pas nécessairement🎜. Généralement, par socketexecuteclose() ou shutdown() émettra FIN. Mais en fait, tant que l'application se ferme, qu'elle soit 🎜active🎜exit ou 🎜passive🎜exit (pour des raisons inexplicables, kill) , 🎜 sera 🎜 numéro 82, 82);fond : rgb(248, 248, 248);">FIN. 🎜
FIN signifie "Je n'envoie plus de données", la méthode shutdown() 关闭读不会给对方发FIN, 关闭写才会发FIN。
所以,如果机器上FIN-WAIT-2状态特别多,一般是因为对端一直不执行close() émet donc une troisième vague.
La raison pour laquelle il y a tant de FIN-WAIT-2
Comment les données reçues par la partie active après la clôture seront-elles traitées ?
Un article écrit avant "Une fois l'exécution du code réussie, les données seront-elles envoyées ?" 》, du point de vue du code source, il est mentionné que Dans des circonstances normales, le programme exécute activementclose(); close()的时候;
tampon de réception du socket contient des données et sera envoyé RST.
Si le tampon d'envoi contient des données, il attendra Après l'envoi, envoyez la première vague FIN.
Comme nous le savons tous, TCP est une communication full-duplex
, ce qui signifie que lors de l'envoi de données, il peut également en recevoir. 🎜🎜Close() signifie que la fonction d'envoi et de réception de messages doit être désactivée en même temps. 🎜🎜En d’autres termes, bien que 🎜théoriquement🎜, entre la deuxième et la troisième vague, la partie passive peut transmettre des données à la partie active. 🎜🎜Mais si les quatre vagues de la partie active sont passéesclose() est déclenché, alors la partie active ne recevra pas ce message. Et il renverra un RST. Mettez directement fin à cette connexion. 🎜🎜🎜🎜close() déclenche quatre vagues TCP🎜🎜🎜🎜🎜
Les données ne peuvent-elles pas être transférées entre la deuxième et la troisième vague ?
Ni l'un ni l'autre. Comme mentionné précédemmentClose() signifie simultanémentDésactivez la possibilité d'envoyer et de recevoirdes messages. Close()的含义是,要同时关闭发送和接收消息的功能。
Ensuite, si vous pouvez désactiver uniquement l'envoi de messages, Si vous ne désactivez pas la fonction de réception de messages, vous pouvez continuer à recevoir des messages. Cecifonction demi-fermeture, en appelant shutdown() méthode Il peut être fait.
int send( SOCKET s,const char* buf,int len,int flags);
Copier après la connexion
Copier après la connexion
où howto est la méthode de déconnexion. Les valeurs suivantes sont disponibles :
SHUT_RD : Fermer la lecture. À ce stade, la couche application ne doit plus essayer de recevoir des données. Même si le tampon de réception reçoit des données dans la pile de protocoles du noyau, elles seront ignorées.
SHUT_WR : désactive l'écriture. S'il y a encore des données dans le tampon d'envoi qui n'ont pas été envoyées, les données seront transmises à l'hôte cible.
SHUT_RDWR : Désactivez la lecture et l'écriture. Équivalent à close().
sera directement 🎜rejeté🎜 après avoir reçu les données du 🎜côté passif🎜, puis répondra avec un RST. 🎜🎜🎜Pour la deuxième situation. 🎜🎜Côté passif🎜Pile du noyau🎜reçu RST fermera la connexion. Mais la connexion au noyau est fermée et la couche application ne le sait pas (sauf notification). 🎜🎜À l'heure actuelle, la prochaine opération de la 🎜couche d'application 🎜 passive n'est rien de plus que 🎜lecture ou écriture🎜. 🎜
🎜🎜S'il est lu, il reviendra < code style = " taille de police : hériter ; hauteur de ligne : hériter ; remplissage : 2 px 4 px ; rayon de bordure : 4 px ; marge droite : 2 px ; marge gauche : 2 px ; couleur : rvb (255, 82, 82 ); background : rgb(248, 248, 248);">RST erreur, qui est notre Connexion réinitialisée par un homologue. 🎜🎜🎜🎜S'il est écrit, le programme générera SIGPIPE signal, le code de la couche application peut capturer et traiter le signal, s'il n'est pas traité, par par défaut Le processus se terminera et se terminera anormalement. 🎜🎜
🎜 🎜🎜🎜Pour résumer🎜, lorsque la méthode de fermeture passiverecv() ReturnEOF, indiquant que la partie active a transmis close() ou shutdown(fd, SHUT_WR) lance la première vague. 🎜
S'il y a des données à envoyer, cela ne peut-il pas être fait en agitant trois fois ?
La situation mentionnée ci-dessus est aucune donnée à envoyer S'il y a des donnéesà envoyer entre le deuxième et le troisième. Un geste de la main, alors N'est-il pas possible de faire un signe trois fois ?
n'est pas . Il existe également une fonctionnalité dans TCP appelée Confirmation différée. Cela peut être simplement compris comme suit : Le destinataire n'a pas besoin de répondre au package de confirmation ACK immédiatement après avoir reçu les données.
Sur cette base,
pas à chaque fois qu'un paquet de données est envoyé, un ACK paquet d'accusé de réception, car le destinataire peut fusionner les accusés de réception. ACK 确认包,因为接收方可以合并确认。
Et cette confirmation de fusion est placée dans les quatre vagues, et la deuxième vague, la troisième vague et la transmission de données entre elles peuvent être fusionnées et envoyées ensemble. Il y a donc eu trois vagues. Confirmation différée TCP à trois ondes
< h2 style="hauteur de ligne : hériter ; marge supérieure : 1,5 em ; poids de la police : gras ; taille de la police : 1,4 em; arrière-plan : rgb (21, 101, 192); 255 );padding: 0.5em 1em;margin-bottom: 2em;">TCP ondes deux foisfront Il est mentionné dans les quatre vagues qu'à la clôture, les deux parties ont envoyé un FIN et reçu un ACK.
🎜Dans des circonstances normales, les deux extrémités de la connexion TCP sont des processus avec des 🎜IP+ports🎜 différents. 🎜🎜Mais si les 🎜IP + port🎜 sont les mêmes aux deux extrémités de la connexion TCP, alors lors de la fermeture de la connexion, la même chose est faite 🎜Une extrémité envoie un FIN et reçoit également un ACK🎜, mais ces deux La fin est en fait La même socket. 🎜🎜🎜🎜TCP ondes deux fois🎜🎜🎜Et ce type de connexion avec le même 🎜IP + port🎜 aux deux extrémités est appelé 🎜Auto-connexion TCP🎜. 🎜
Close()会同时关闭发送和接收消息的功能。shutdown(), je pense que tout le monde devrait savoir comment a répondu . Mais le problème revient, il n'y a que deux clients, pas de listen(), pourquoi Connexion TCP ?
Si vous êtes intéressé, nous aurons l'occasion de combler à nouveau ce trou dans le futur.
Résumé span>
Agitez quatre fois
, si le programme exécute activement close(), ou le processus est tué, il est possible d'émettre la première vagueFIN. Si sur la machine, 82);background: rgb(248, 248, 248);">FIN-WAIT-2 a un nombre particulièrement important d'états, généralement parce que l'homologue n'a pas exécuté close() envoie une troisième vague.
Close() va désactiver
l'envoi et la réception de messages. shutdown() peut 🎜fermer🎜envoyer ou recevoir des messages individuellement. 🎜🎜🎜🎜Les deuxième et troisième vagues pourront être combinées. Ainsi, quatre vagues se sont transformées en 🎜trois vagues🎜. 🎜🎜🎜🎜Connecter la même prise à elle-même entraînera une 🎜auto-connexion TCP🎜 La vague d'auto-connexion est 🎜deux fois la vague🎜. 🎜
Nonlisten, une connexion peut également être établie entre deux clients. Cette situation est appeléeouverture simultanée TCP, qui est causée parPoignée de main à quatre voiesproduite. listen,两个客户端之间也能建立连接。这种情况叫TCP同时打开,它由四次握手产生。
最后
今天提到的,不管是两次挥手,还是自连接,或是TCP同时打开什么的。
咋一看,可能对日常搬砖没什么用,实际上也确实没什么用。
并且在面试上大概率也不会被问到。
毕竟一般面试官也不在意茴字有几种写法。
这篇文章的目的,主要是想从另外一个角度让大家重新认识下socket。原来TCP
Enfin
Ce que j'ai mentionné aujourd'hui, que ce soit deux Wave deux fois, ou Auto-connexion, ou TCP est ouvert en même tempsou quelque chose du genre.
🎜À première vue, cela peut ne pas être utile pour l'enlèvement quotidien des briques, et cela ne sert en effet à rien. 🎜🎜Et il y a de fortes chances que cela ne soit pas demandé lors de l'entretien. 🎜🎜Après tout, la plupart des intervieweurs ne se soucient pas du nombre de façons dont le mot fenouil peut être écrit . 🎜🎜Le but de cet article est principalement de permettre à chacun de re-comprendre sous un autre anglesocket. OriginalTCP peut se connecter tout seul, et même deux clients peuvent être connectés sans serveur. 🎜🎜C'est vraiment, vraiment inattendu. 🎜🎜🎜
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!
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Comment réinitialiser le protocole TCP/IP dans Win10 ? En fait, la méthode est très simple. Les utilisateurs peuvent entrer directement dans l'invite de commande, puis appuyer sur la combinaison de touches ctrl+shift+enter pour effectuer l'opération, ou exécuter directement la commande de réinitialisation pour configurer. aux utilisateurs une introduction détaillée sur la façon de réinitialiser la pile de protocoles TCP/IP dans Windows 10. Méthode 1 pour réinitialiser la pile de protocole TCP/IP dans Windows 10. Autorisations d'administrateur 1. Nous utilisons la touche de raccourci win+R pour ouvrir directement la fenêtre d'exécution, puis saisissons cmd et maintenons la combinaison de touches ctrl+shift+enter enfoncée. 2. Ou nous pouvons rechercher directement l’invite de commande dans le menu Démarrer et cliquer avec le bouton droit
Client TCP Un exemple de code client qui utilise le protocole TCP pour établir un dialogue continu : importationsocket#Configuration du client HOST='localhost'PORT=12345#Créez un socket TCP et connectez-vous au serveur client_socket=socket.socket(socket.AF_INET,socket . SOCK_STREAM)client_socket.connect((HOST,PORT))whileTrue:#Get user input message=input("Veuillez saisir le message à envoyer :&
TCP est un type de protocole de communication sur réseau informatique et un protocole de transmission orienté connexion. Dans le développement d'applications Java, la communication TCP est largement utilisée dans divers scénarios, tels que la transmission de données entre client et serveur, la transmission audio et vidéo en temps réel, etc. Netty4 est un cadre de programmation réseau hautes performances, hautement évolutif et performant qui peut optimiser le processus d'échange de données entre le serveur et le client pour le rendre plus efficace et fiable. Les étapes de mise en œuvre spécifiques de l'utilisation de Netty4 pour la communication TCP sont les suivantes : Introduction
Le « orienté connexion » mentionné ici signifie que vous devez établir une connexion, utiliser la connexion et libérer la connexion. L'établissement d'une connexion fait référence à la célèbre négociation à trois voies TCP. Lors de l'utilisation d'une connexion, les données sont transmises sous la forme d'un envoi et d'une confirmation. Il y a aussi la libération de la connexion, qui est notre TCP commun à quatre ondes.
Parmi les parties à la communication TCP, pour faciliter la description, les parties à la communication sont remplacées par A et B dans ce qui suit. Selon le protocole TCP, si B continue d'envoyer des données après que A ait fermé la connexion, B recevra la réponse RST de A. Si B continue d'envoyer des données, le système enverra un signal SIGPIPE pour informer que la connexion a été déconnectée et arrêtera l'envoi. Le comportement de traitement par défaut du système pour le signal SIGPIPE est de laisser le processus B se terminer. Le comportement de traitement par défaut du système d'exploitation pour le signal SIGPIPE est très hostile. Analysons-le. La communication TCP est un canal full-duplex, qui équivaut à deux canaux simplex, et chaque extrémité de la connexion en est responsable. Lorsque l'extrémité opposée « se ferme », bien que l'intention soit de fermer les deux canaux dans leur intégralité, l'extrémité locale ne reçoit que le paquet FIN. Selon les dispositions du protocole TCP, lorsqu'un
Pourquoi existe-t-il ce blog sur l'utilisation d'une seule connexion TCP pour envoyer plusieurs fichiers ? J'ai lu récemment des choses connexes. Il n'y a aucun problème à simplement utiliser Socket pour la programmation, mais cela n'établit que quelques concepts de base. On ne peut toujours rien faire pour résoudre le véritable problème. Lorsque j'ai besoin de transférer des fichiers, il me semble que je viens d'envoyer les données (données binaires), mais certaines informations sur le fichier sont perdues (l'extension du fichier). Et chaque fois que je ne peux utiliser qu'un seul Socket pour envoyer un fichier, il n'y a aucun moyen d'envoyer des fichiers en continu (car je compte sur la fermeture du flux pour terminer l'envoi des fichiers, ce qui signifie que je ne connais pas la longueur du fichier, donc je ne peux utiliser qu'une seule connexion Socket qui représente un fichier).
TCP et IP sont deux protocoles différents sur Internet : 1. TCP est un protocole de couche transport, tandis qu'IP est un protocole de couche réseau ; 2. TCP fournit des fonctions telles que la segmentation, le tri, la confirmation et la retransmission des paquets de données, ainsi que l'IP. Le protocole est chargé de fournir les adresses source et de destination des paquets de données ; 3. TCP est un protocole orienté connexion, tandis que le protocole IP est sans connexion ; 4. TCP fournit également un contrôle de flux et un contrôle de congestion.
Il était une fois une question d’entretien classique : que se passe-t-il dans le processus depuis la saisie de l’URL dans le navigateur jusqu’à l’affichage de la page ? Je pense que la plupart des étudiants qui se sont préparés peuvent y répondre, mais si vous continuez à demander : si le HTML reçu contient des dizaines de balises d'image, de quelle manière, dans quel ordre, combien de connexions sont établies et quel protocole est utilisé pour télécharger ces images ?