2010-01-09 5 views
1

J'ai vérifié le protocole TCP Wiki, mais je n'ai pas trouvé, si la connexion socket expire si aucune donnée n'est transférée pendant la longue période. Je veux dire ... il n'y aura pas de problèmes physiques, mais deux ordinateurs n'auront tout simplement pas de données à envoyer l'un l'autre pendant un certain temps. Comment la connexion existera-t-elle toujours? Y aura-t-il des transferts de données de bas niveau pour l'aider à comprendre qu'il n'est pas brisé?Déconnexion TCP si aucune donnée

Merci! Désolé si la question est bête ..

+0

Avez-vous besoin de savoir pour une tâche de programmation? Sinon, il est mieux adapté à serverfault.com –

+0

m .. il est lié à C++, boost :: asio, être particulier – roma

Répondre

4

Aucune donnée n'est envoyée sur le réseau pour maintenir les connexions TCP. Vous pouvez envoyer une couche réseau keep-alive simplement en envoyant un paquet de zéro octet à partir d'une paire d'options peer ou enable socket pour que le système d'exploitation les envoie périodiquement pour vous. À mon avis, la couche d'application keep-alives (votre protocole d'application la gère) offre une meilleure conception/fiabilité que la couche de transport machinary. Lors de la définition de protocoles d'application en couches sur TCP pour une fiabilité maximale, il est généralement nécessaire d'incorporer un type de NOOP (non-operation), ping, heartbeat dans la conception du protocole. Ceci est très important car, par exemple, si votre serveur écoute une requête d'un client et que le client est éteint après la connexion, la session TCP est essentiellement orpheline et votre serveur peut finir par l'écouter pour toujours. L'interruption de connexion ne peut être détectée si aucune donnée n'est envoyée ou reçue !! Si le serveur envoie au moins noop/ping/heartbeats à intervalles réguliers, la requête sortante déclenchera la machine TCP retrans/timeout machinary et le serveur pourra alors détecter la connexion morte. Si à la place votre application envoie une couche d'application "ping" ou "salut, comment allez-vous?" message vous pouvez aller plus loin et l'utiliser pour vous renseigner sur l'état de votre peer plutôt que simplement la connexion sous-jacente. Par exemple, si un homologue est bloqué dans une boucle infinie ou si ses lecteurs de disque sont en feu, les keepalives TCP seuls ne vous aident pas à comprendre et à corriger le problème sous-jacent.

+0

Merci pour tant de détails, ça m'a vraiment éclairé) – roma

0

Les connexions sont souvent maintenues ouvertes en utilisant keepalives.

+0

Les connexions resteront toujours ouvertes. Les alives n'arrêtent pas la fermeture des connexions, compte tenu du protocole TCP standard. –

+0

Ibrahim, merci pour le lien! Donc, la connexion va se fermer après un certain temps, non? (parce que par défaut le mécanisme keep-alive est désactivé) – roma

+0

Pas aussi loin que je peux dire. C'est juste que les implémentations TCP peuvent choisir d'implémenter un mécanisme keepalive. Vous ne pouvez pas compter sur cela. –

0

Non ce n'est pas le cas. Si vous avez besoin d'un côté à déconnecter, aucune donnée n'est transférée, vous devez l'implémenter vous-même, en utilisant une sorte de mécanisme "keep alive".

+0

Désolé, je n'ai pas compris .. Est-ce que les keep-alives m'aideront à garder la connexion ouverte ou vice versa? Merci pour la réponse. – roma

2

Une connexion TCP reste ouverte jusqu'à ce que les deux extrémités la ferment. Cependant, sachez que les firewalls et en particulier les passerelles NAT temporisent souvent leurs entrées de connexions TCP, ce qui signifie que si votre connexion passe par un, les données d'envoi peuvent être erronées si la passerelle a supprimé le mappage pour cette connexion TCP. Seule la lecture d'une connexion TCP qu'une passerelle a expiré ne sera détectée que si vous avez une sorte de pulsation dans votre protocole d'application ou si vous activez tcp keepalive.

+0

Je suppose que cela répond à ma question clairement :) Merci. Si je comprends bien, quand le pare-feu fermera la connexion, j'obtiendrai juste l'erreur de douille en essayant d'envoyer des données? – roma

+0

Oui, vous aurez une sorte d'erreur. Ça peut prendre un moment. Un certain nombre de recherches ont été effectuées sur le comportement des NAT et des pare-feux, et la conclusion est qu'un paquet toutes les 30 secondes gardera vos mappages ouverts pour essentiellement toutes les connexions qui fonctionnent en premier lieu. –

Questions connexes