Garder Vivante TCP/IP sockets connectées sur Internet - quand? comment? et de combien?
Mise à JOUR: Passez à la réponse si vous voulez vous épargner le long préambule.
Connexions TCP/IP, les connexions actives sont spécifiés au moins une fois toutes les deux heures: http://tools.ietf.org/html/rfc1122#page-101. Le problème est que ceci a été écrit en 1989, et est préoccupé par le coût de l'envoi de l'extra KeepAlive paquet! Mais encore, il est l'heure par défaut de la plupart des OS est en conformité avec la spécification envoyer les connexions actives en bas d'un socket connecté après une période d'inactivité! Bien sûr, aujourd'hui, la plupart des connexions délai d'attente moyen avant que si inactif, et si elle est connectée à un de ses pairs, sur les connexions Internet de mourir à votre insu façon avant que (malgré le réglage de celles délai d'attente supérieur à celui, je crois, étant donné que le routeur tables entre les deux n'est pas la peine de le garder en vie - je me suis toujours demandé d'où la fuite dernier message va... mise à JOUR: La raison pour cela est "routeurs" qui peut être à votre ou à l'hôte distant fin sont "dynamiques" et de connexion au courant et la chute de la connexion après un certain temps d'inactivité - les routeurs que votre go par le biais de sur l'Internet ne peut pas laisser tomber votre connexion - ils qu'ils ne s'inquiètent pas - le paquet est juste de l'envoyer là où il doit aller). Donc, j'ai vu 2 des solutions communes afin de garder celles connexion sur Internet:
1) le Mépris (EDIT: comme cela a été souligné à moi, c'est de ne pas méconnaître les spec c'est seulement la modification de la valeur par défaut) la spécification et la modification de votre système à l'échelle de KeepAlive intervalle inférieur à 2 heures, ou 2) de mettre en œuvre votre propre "KeepAlive" système de vote par les pairs périodiquement.
De toute façon; ce qui est un délai raisonnable (de l'inactivité à laquelle envoyer votre KeepAlive)? J'ai tout vu, de 1 seconde à la valeur par défaut de 2 heures. Il semble que le nombre est aspiré hors de pouce... Si j'ai une application client de la connexion à partir potentiellement n'importe où dans le monde, ce qui est sûr et raisonnable de la période (je veux une seule connexion permanente)? Connexion à un de ses pairs, de nombreux sauts à l'écart de l'autre côté du monde sur Internet la connexion meurt sur 301 secondes (si vous ne savez plus quand vous essayez d'envoyer quelque chose) afin de fixer le délai à 300 secondes semble être le nombre magique - je obtenir le KeepAlive 1 seconde avant la mort - cet intervalle ne m'a jamais manqué.. mais est-il sûr?
EDIT: Cette connexion particulière im la mise en œuvre en C# 3.0, donc le code en que bienvenue.
Merci mais les malades ont besoin de plus - avez-vous des exemples? Dans mon cas 5 minutes (300 secondes) semble très bien et j'ai du mal à imaginer quand il devrait être inférieur à celui qui (comme je l'ai été connecté à l'otherside du monde), peut-être que dial-up - dans ce cas, j'aurais besoin de laisser plus de temps pour le KeepAlive à atteindre par les pairs une fois envoyé...
Je veux être très clair, un routeur ne détient pas d'une connexion TCP, il ne se soucie pas, et il n'est pas avec état de toutes les connexions. Pure fonctionnalité de routage ne regarde que le l'en-tête IP (couche 3), pour voir où le paquet va, et c'est les tables de routage sont pré-calculés. Statefull noeuds dont les NATs (inclus sur la maison "routeurs") et les pare-feu peuvent être de connexion au courant, et chacun d'eux ont leurs propres délais d'attente. Sur pratiquement n'importe quel réseau de la quantité de trafic pour garder avie est petit. Toutefois, de ne pas définir ce vraiment bas sur un réseau de téléphonie mobile, comme il le fait de perdre BEAUCOUP de ressources.
Grâce à ce qui efface beaucoup de choses qui se rétrécit vers le bas de mon équipement qui doit en tenir inactifs les connexions locales sont plus que des connexions externes - ce qui explique pourquoi l'un ne marche pas rencontré ces problèmes jusqu'à ce que leur client est déployé à l'externe.. Si vous le mettez dans une réponse que j'ai pu le marquer comme réponse.. Merci!
Aussi serait-il vous arrive de savoir après combien de temps les utilisateurs à la maison statefull nœuds généralement chute de connexions TCP?
OriginalL'auteur markmnl | 2010-10-11
Vous devez vous connecter pour publier un commentaire.
Quand
Lorsque vous voulez empêcher le raccordement d'être supprimé.
Comment
Par l'envoi de quelque chose après une période d'inactivité possible soit par l'envoi TCP/IP, les connexions actives ou à l'envoi de quelque chose de vous-même (recommandé depuis la création de la période au cours de laquelle le protocole TCP/IP, les connexions actives sont envoyés s'appliquer au niveau du système pour tous les sockets connectées au lieu de au niveau de l'application).
Combien
Quelle est la durée d'un morceau de ficelle? D'abord, vous devez comprendre pourquoi la connexion est abandonnée:
La raison, la connexion est abandonnée est:
Accueil/commercial "routeurs" et les pare-feu qui sont "stateful" de connexion et de courant ont tendance à baisser externe connexions TCP après une certaine période d'inactivité
De sorte qu'il a rien faire avec votre application ou TCP/IP en soi, mais de le faire avec le de matériel ou de logiciel votre connexion passe par. Vous pourriez faire un peu de recherche dans typique des périodes d'inactivité au cours de laquelle la maison/appareils commerciaux/logiciel vous pouvez passer par un drop d'une connexion (voir listes ci-dessous). Toutefois, si les pairs pourrait être n'importe quel utilisateur sur l'Internet:
En fin de compte, si vous ne pouvez pas savoir ce que le matériel/logiciel, ils passent par: permettre à un client de définir leur propre période d'inactivité (à qui envoyer quelque chose à garder la connexion).
Ou envoyer Keepalive (ou votre équivalent) à de courts intervalles (de l'inactivité) pour accueillir tous les cas (même si le trafic inutile est une mauvaise chose un supplément de paquet toutes les quelques secondes d'inactivité, de nos jours, c'est une goutte dans l'océan, à l'exception des réseaux mobiles encore). Mais soyez averti que par la spécification TCP/IP, il est censé survivre temporaire coupures de courant trop faible pourrait avoir l'indésirables affectent de ne pas survivre à une interruption temporaire, à partir de http://aplawrence.com/Bofcusm/2426.html:
Mais vous avez une panne de votre faisait des comms de toute façon, de sorte que vous avez à gérer cela et je pense que cette préoccupation est devenu obsolète, car on n'obtient pas de pannes temporaires (ils sont plus susceptibles d'être permanente - câble débranché) avec aujourd'hui les connexions persistantes (par opposition à la louche dial-up dire). Si vous avez une panne, vous pouvez ré-établir votre connexion (comme RDP ne) ou pas (comme Telnet).
La recherche dans ce que les applications courantes d'utilisation:
Et de la recherche dans ce que les appareils/logiciels interrompre les connexions inactives et quand:
Veuillez modifier/affiner ces listes pour le bénéfice de tous.
depuis, il est... downvoting une réponse correcte?
C'est une violation de stackoverflow.com le protocole. Si vous avez un commentaire, ajouter un commentaire. La personne qui pose la question ne connaissez pas la réponse, par définition, n'est donc pas la personne à qui l'alimente.
🙂 J'ai trouvé la bonne réponse par la suite (en particulier de Kevin Nesbits commentaires) et je suis de l'ajouter ici, pour le bénéfice de tous. Me montrer la partie du protocole Im violation 🙂
permet de voir si EJP contribue à mon deuxième Nécromancien badge...
OriginalL'auteur
Ce n'est pas ce qu'il dit. Il dit: "Cet intervalle DOIT être configurable et DOIT par défaut à pas moins de deux heures.'
La vraie raison pour la fabrication de keep-alive facultatif et à 2 heures en défaut si la condition est #(2) dans la liste de raisons - TCP/IP est censé survivre pannes temporaires de intermédiaires d'équipement, de re-routage, etc. C'est un mécanisme utile pour, par exemple, les serveurs Telnet pour détecter perdu des clients.
Ce n'est pas de " mépris de la spec.' C'est seulement la modification de la valeur par défaut.
La plupart des applications de longue durée des connexions, soit de fournir un ping dans leur propre protocole de l'application ou de l'utilisation des pools de connexions qui survivent à des échecs de connexion.
J'étais à moitié plaisante quand je dis que la raison est le coût d'envoi d'un paquet supplémentaire (c'est une des raisons) - je sais que la principale raison - c'est exactement ce que je veux l'utiliser pour!
Ça dépend entièrement sur votre application. Clairement, les concepteurs de TCP/IP estimé que deux heures a été trop court. Mais si vous avez une application qui a besoin de la par les pairs pour être là à chaque 10 secondes, peut-être 5 secondes est un bon moment. Ou 20. Si votre période est en quelques minutes je voudrais utiliser un délai d'attente et un pool de connexion plutôt que d'un ping.
Un meaninglesss diatribe. Quand, comment, et combien de quoi? Les réponses dépendent de l'application. Vous avez décrit votre demande qualitativement, mais pas quantitativement, et de vous poser des questions quantitatives. Personne, mais vous pouvez y répondre. Quelles sont ses exigences de temps de réponse? Combien de fois faut-il utiliser la connexion? Combien de temps d'arrêt peut-il tolérer? Peut-être que le Telnet par défaut est suffisante pour votre application. Peut-être qu'il ne l'est pas. Je ne sais pas. Je suis pas un de plus.
Qui dépend de l'application utilisée! Je suppose que la connexion est fermée non pas à cause de la socket sous-jacente à l'arrêt, mais parce que l'application serveur décide qu'il est temps de fermer la connexion. Je ne voudrais pas changer la valeur par défaut keep-alive mais comme l'a déjà souligné mettre en œuvre un garder vivante à l'intérieur de l'application du protocole, qui est le chemin à parcourir!
OriginalL'auteur user207421