J'essaie de comprendre quelle est la différence entre TCP Demi-connexion ouverte et TCP Une connexion semi-fermée peut-on savoir en quoi exactement?
Ce post étend sur les connexions à moitié fermées. Pour les connexions à demi ouvertes, voir la description correcte de KContreau.
Chaque connexion TCP consiste en deux demi-connexions qui sont fermées indépendamment l'une de l'autre. Donc, si une extrémité envoie une FIN, l'autre extrémité est libre d'accepter cette FIN (au lieu de FIN + ACK-ing), ce qui signale à la fin de l'envoi FIN qu'elle a encore des données à envoyer. Ainsi, les deux extrémités se retrouvent dans un état de transfert de données stable autre que ESTABLISHED - à savoir FIN_WAIT_2 (pour le destinataire) et CLOSE_WAIT (pour le destinataire). Une telle connexion est dite à moitié fermée et TCP est réellement conçu pour prendre en charge ces scénarios. Par conséquent, les connexions à demi fermées constituent une fonctionnalité TCP.
Alors que la RFC 793 ne décrit que le mécanisme brut sans même mentionner le terme "moitié fermée", la RFC 1122 développe cette question dans la section 4.2.2.13. Vous pouvez vous demander qui diable a besoin de cette fonctionnalité. Les concepteurs de TCP ont également implémenté le protocole TCP/IP pour le système Unix et, comme tous les utilisateurs Unix, adoraient la redirection des E/S. Selon W. Stevens (TCP/IP illustré, Section 18.5), le désir de diffuser des flux I/O TCP était la motivation qui a poussé à introduire cette fonctionnalité. Il permet au FIN ack de jouer le rôle de ou d'être traduit par EOF. Il s’agit donc d’une fonctionnalité qui vous permet de créer de façon décontractée une interaction impomptu type requête/réponse sur la couche application, où FIN signale la "fin de la demande".
Lorsque TCP établit une connexion, la connexion est considérée comme garantie, car une poignée de main a lieu:
À ce stade, la connexion est établie et les données commencent à circuler. En revanche, un paquet UDP n’est pas garanti, il est simplement envoyé dans l’espoir qu’il y parvienne.
http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment
Officiellement, selon le RFC, une connexion semi-ouverte TCP se produit lorsqu'un des côtés de la connexion établie est tombé en panne et n'a pas envoyé de notification de fin de connexion. Ce n'est pas l'usage courant aujourd'hui.
Officiellement, si peut faire référence à une connexion embryonnaire, qui est une connexion en cours d'établissement.
À moitié fermé est le contraire de cette définition non officielle. C'est un état quelque part au milieu où les ordinateurs sont en train de détruire la connexion établie.
Les autres gars ont assez bien décrit les connexions semi-ouvertes et semi-fermées en réalité are, mais l'idée de connexions semi-ouvertes est également souvent recherchée dans le contexte d'un PROBLÈME.
Il existe des arguments sur Internet quant à ce que la terminologie "semi-ouverte" ou "semi-fermée" devrait représenter, mais en ce qui me concerne, la terminologie est simplement sémantique. Certains disent que les connexions "semi-ouvertes" sont un "problème", tandis que "semi-fermées" est une fonctionnalité de conception qui vous permet de fermer votre flux d'envoi en le fermant avant que le téléchargement de fichier ne se termine dans un état semi-fermé ( comme décrit par les autres utilisateurs).
Cependant, en ce qui concerne l’autre ... le "problème": il faut une poignée de main à 3 voies pour ouvrir une connexion TCP et une poignée de main à 4 voies pour la fermer.
TCP présente une vulnérabilité en ce que le paquet FIN final envoyé à un client peut être potentiellement abandonné par les routeurs/réseaux, ce qui entraîne une connexion à moitié ouverte alors que l'intention réelle était de fermer complètement la connexion. Cette approche et des approches similaires sont des types populaires d’attaques par déni de service car elles ne nécessitent pas beaucoup de bande passante, mais peuvent potentiellement dévorer des pseudonymes, des sockets et des threads précieux en fonction de l’implémentation du serveur. avec une fréquence croissante, grâce à nos opérateurs de téléphonie mobile de mauvaise qualité.
Les systèmes d’exploitation ont tenté de lutter contre les attaques DDoS à moitié ouvertes en limitant le nombre de connexions semi-ouvertes/fermées pouvant être présentes dans le système d’exploitation à un moment donné et en introduisant des durées maximales de temps pendant lequel les connexions peuvent rester en place. état semi-ouvert/fermé. La dernière fois que j’ai vérifié, personnellement, la limite de temps sous Windows était assez élevée (2 jours, si je me souviens bien).
Cette condition est encore aggravée par le caractère facultatif de TCP keep-alives, qui, s'il était complètement implémenté, était conçu comme une solution au niveau du protocole (par opposition au niveau de l'application) pour la détection des connexions mortes/zombies. Mais, lorsque TCP a été conçu, la bande passante était beaucoup plus précieuse qu’aujourd’hui, et certains craignaient que les minuteries de maintien en vie pour TCP ne soient trop "bavardes". Par conséquent, les connexions persistantes sont facultatives, ne sont généralement pas utilisées et leur transmission par les routeurs n'est pas garantie conformément à la norme RFC1122. Donc ... même si vous activez Keep-Alives au niveau de la couche TCP pour tenter de détecter/gérer le scénario, vous constaterez peut-être qu'au fur et à mesure que votre trafic se déplace dans le monde entier, certains routeurs la paquets vivants ... créant potentiellement un AUTRE scénario rare à tester.
Les connexions semi-ouvertes représentent un défi technique pour les codeurs qui écrivent des serveurs basés sur TCP, en particulier, car elles peuvent apparaître involontairement de manière aléatoire, pendant les périodes de forte charge ... et généralement sur des serveurs de production ... et peuvent être difficile à remarquer dans les phases de test Alpha/Beta. D'après mon expérience, j'ai constaté qu'elles se produisaient dans environ 1 connexion sur 40 000 sur des serveurs traitant 2,5 millions de connexions/jour, mais ces chiffres varient en fonction des conditions de trafic et des conditions de trafic de chaque segment de l'internet entre votre serveur et le client. .
En tant qu’ingénieur, il peut être difficile de dépister les problèmes qui surviennent rarement et uniquement sur des serveurs déployés en direct. Il est donc important d’essayer de simuler cet état de connexion rare lors de l’écriture du code de serveur TCP à analyser. comment votre serveur va réagir face à cette situation. Si votre serveur TCP utilise un nombre statique de threads de travail, par exemple, vous pouvez trouver qu'ils sont tous consommés par des connexions zombies lorsque vous effectuez un déploiement en production, par exemple. Si les connexions nécessitent beaucoup de mémoire de travail, le résultat final peut ressembler à une fuite de mémoire. etc.
Sans solution persistante viable à 100%, TCP laisse le soin à la couche utilisateur de déterminer comment sont gérées les connexions semi-ouvertes/fermées. Votre code doit donc avoir un plan/mécanisme de détection, l'heure. -out, et nettoyer les ressources lorsque cette condition se produit ... c'est-à-dire ... en supposant qu'il s'agit d'un protocole que vous avez inventé et non d'un des nombreux (mauvais) standards ouverts que les programmeurs utilisent généralement. Bien sûr, je fais référence à des protocoles tels que HTTP, qui fonctionnent exclusivement sur TCP. Ces protocoles sont extrêmement surestimés de l’avis de ce programmeur.
Reconnaissant les faiblesses de TCP et sa fâcheuse popularité pour la transmission du trafic HTTP/Web, des entreprises intelligentes ont cherché un remplaçant. Par exemple, Google a expérimenté un protocole appelé QUIC, qui transmet HTTP sur UDP. Il existe également un protocole ouvert appelé TSCP. Aucun de ces protocoles n'a cependant été adopté à grande échelle.
En règle générale, je construis tous mes propres serveurs pour communiquer exclusivement sur mon propre protocole UDP. UDP est plus délicat que vous ne le pensez cependant, et je sens que je le modifie toujours pour qu'il soit plus rapide, plus intelligent, avec une latence moindre, un encombrement réduit ... mais au moins, je n'ai plus à traiter avec des connexions à demi ouvertes; )