2008-11-21 3 views
1

Pourquoi est-il que les connexions TCP vers une extrémité interface de réalimentation en TIME_WAIT (prise fermée avec SO_DONTLINGER set), mais les connexions identiques à un autre hôte ne finissent pas dans TIME_WAIT (ils sont remis à zéro/détruits immédiatement) ?TIME_WAIT sur Loopback Interface

Voici des scénarios pour illustrer:

(A) Deux applications, un client et un serveur, sont tous deux en cours d'exécution sur la même machine Windows. Le client se connecte au serveur via l'interface de bouclage du serveur (127.0.0.1, port xxxx), envoie des données, reçoit des données et ferme le socket (SO_DONTLINGER est défini). Disons que les connexions sont très de courte durée, de sorte que l'application cliente établit et détruit un grand nombre de connexions chaque seconde. Le résultat final est que les sockets se terminent par TIME_WAIT, et le client épuise finalement son nombre maximum de sockets (sous Windows, c'est 3900 par défaut, et nous supposons que cette valeur ne sera pas modifiée dans le registre). (B) Mêmes deux applications que le scénario (A), mais le serveur est sur un hôte différent (le client est toujours en cours d'exécution sur Windows). Les connexions sont identiques à tous égards, sauf qu'elles ne sont pas destinées à 127.0.0.1, mais à d'autres adresses IP. Ici, les connexions sur la machine client ne vont pas dans TIME_WAIT, et l'application cliente peut continuer à établir des connexions indéfiniment.

Pourquoi l'écart?

Répondre

3

L'état TIME_WAIT se produit uniquement à une extrémité de la connexion - la première qui se ferme en premier. Pour l'interface de bouclage, les deux extrémités sont sur la même machine, vous verrez toujours TIME_WAIT.

Dans votre autre cas, essayez de regarder l'autre machine. Je pense que vous verrez les sockets TIME_WAIT là.