Comment maintenir une connexion TCP inactive?


1

si un serveur TCP établit une connexion TCP avec un client TCP. Ensuite, le client TCP n'envoie jamais aucun paquet au serveur.

Je sais à peu près que les pare-feu situés près du serveur TCP peuvent lui envoyer un RST. ou il existe un délai de maintien en vie qui force la fin de la connexion TCP. Mais je ne sais pas exactement ce qui va arriver anyone quelqu'un peut-il expliquer un peu?

Est-il possible de maintenir cette connexion TCP à moins que je ne souhaite la terminer?

J'espère juste que le serveur TCP pourra conserver cette connexion TCP sur sa pile TCP. Mais je ne veux pas que le client TCP soit impliqué, je ne veux pas qu'il envoie KEEP-ALIVE. Je ne veux aucune autre entité tierce impliquée. J'espère juste que lorsque j'écris les codes source du serveur TCP, ceux-ci peuvent gérer la connexion TCP.

Merci!

Réponses:


0

Sauf si un message FIN ou RST est envoyé, le seul autre moyen permettant au protocole standard de savoir si l'autre côté s'est arrêté ou a disparu est l'expiration du délai.

C’est vraiment ce que vous pouvez faire de mieux par conception si vous faites le moins possible d’hypothèses de "l’autre côté", et que votre seule connexion à cet "autre" est une interface réseau unique.

Un événement plus bas sur le modèle OSI peut amener le système d'exploitation à mettre fin à la connexion ou à fournir des informations pouvant indiquer au client d'abandonner, comme la suppression de la carte réseau en question ou le changement d'état de la liaison. être déconnecté. Cela ne doit pas arriver, cependant.

La solution générale consiste à envoyer des messages périodiques sans données significatives, appelé keepalive, via la connexion. TCP le permet, mais vous pouvez également le faire sur la couche d'application.

  • FileZilla peut être configuré pour envoyer des messages persistants. Vous pouvez voir qu'il envoie des commandes qui ne font rien d'utile, mais qui sont simplement émises pour jeter quelque chose dans le tuyau et le garder "occupé".
  • PuTTY, par exemple, propose également des options de restauration continue .
  • Vous pouvez également définir des options keepalive sur le serveur, mais il est généralement préférable de le définir sur le client SSH.
  • De nombreux protocoles de routage envoient des tâches de maintien sur la couche application pour vérifier que d'autres itinéraires fonctionnent et sont disponibles, BGP , par exemple.
  • TCP prend également en charge les messages keepalive de manière native, ce sont en principe des paquets Ethernet nuls envoyés de temps en temps pour vérifier la connexion. Cet article de tldp.org explique bien.

À première vue, je ne comprends pas chaque solution clairement. J'espère seulement que le serveur TCP pourra conserver cette connexion TCP sur sa pile TCP. Mais je ne veux pas que le client TCP soit impliqué, je ne veux pas qu'il envoie KEEP-ALIVE. Je ne veux aucune autre entité tierce impliquée. J'espère juste que lorsque j'écris les codes source du serveur TCP, ceux-ci peuvent gérer la connexion TCP.
misteryes

@misteryes Si le client n'est pas impliqué, comment faites-vous la différence entre un client qui n'a pas envoyé de paquet en deux jours et un client qui a eu une panne de courant et le programme ne fonctionne plus? Si votre serveur ne supprime jamais les connexions abandonnées, vous rencontrerez rapidement des problèmes de ressources insuffisantes.
Scott Chamberlain

@Scott Chamberlain J'ai une autre condition. Lorsque cette condition est vraie, mon code source appellera close(sockfd)pour y mettre fin. Je veux juste garder la connexion active côté serveur lorsque cette condition est fausse.
misteryes

C’est ensuite une question pour StackOverflow: dites-leur quelle bibliothèque de sockets vous utilisez et ils pourront vous aider. Cependant, sachez que vous allez rencontrer des problèmes tels que celui mentionné par ultrasawblade. Les ordinateurs situés entre votre code serveur et le client peuvent fermer la connexion, même si le serveur est toujours à l’écoute. Une fois que cela se produit, la connexion apparaîtra comme une nouvelle connexion en raison d'éléments comme le routeur NAT du client qui choisit un nouveau port source aléatoire pour sa connexion.
Scott Chamberlain

@ Scott Chamberlain Je me fiche de la réaction du client. Je veux juste garder la connexion côté serveur
misteryes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.