/etc/init.d/networking restart
Laissez-moi élaborer. Le protocole de contrôle de transmission (TCP) est conçu pour être un protocole de transmission de données bidirectionnel, ordonné et fiable entre deux points d'extrémité (programmes). Dans ce contexte, le terme fiable signifie qu'il retransmettra les paquets s'il se perd au milieu. Le protocole TCP garantit la fiabilité en renvoyant des paquets d'accusé de réception (ACK) pour un seul paquet ou une plage de paquets reçus de l'homologue.
Ceci est identique pour les signaux de contrôle tels que demande / réponse de terminaison. La RFC 793 définit l'état TIME-WAIT comme suit:
TIME-WAIT - TIME-WAIT - signifie attendre suffisamment de temps pour être sûr que le protocole distant a bien reçu l'accusé de réception de sa demande de fin de connexion.
Voir le diagramme d'état TCP suivant:
TCP est un protocole de communication bidirectionnel. Ainsi, lorsque la connexion est établie, il n'y a pas de différence entre le client et le serveur. En outre, l'un ou l'autre peut appeler la fermeture et les deux homologues doivent se mettre d'accord sur la fermeture pour fermer complètement une connexion TCP établie.
Appelons le premier à appeler les quittes en tant que rapproché actif, et l'autre à scruter le plus proche passif. Lorsque le système de fermeture actif envoie FIN, l'état passe à FIN-WAIT-1. Ensuite, il reçoit un ACK pour le FIN envoyé et l'état passe à FIN-WAIT-2. Une fois qu'il reçoit également FIN du système de rapprochement passif, le mécanisme de rapprochement actif envoie l'ACK au système FIN et l'état passe à TIME-WAIT. Si le système de rapprochement passif n'a pas reçu l'ACK du deuxième FIN, il retransmettra le paquet FIN.
Le RFC 793 définit le délai d'expiration comme étant le double de la durée de vie maximale du segment, ou 2 MSL. Depuis MSL, la durée maximale pendant laquelle un paquet peut errer sur Internet est définie sur 2 minutes, 2MSL sur 4 minutes. Puisqu’il n’ya pas d’ACK à un ACK, le système de fermeture actif ne peut rien faire, mais attendre 4 minutes s’il adhère correctement au protocole TCP / IP, juste au cas où l’émetteur passif n’aurait pas reçu l’ACK sur son FIN (en théorie). .
En réalité, les paquets manquants sont probablement rares, et très rares si tout se passe sur le réseau local ou sur un seul ordinateur.
Pour répondre à la question, comment fermer de force un socket dans TIME_WAIT?, Je vais quand même m'en tenir à ma réponse d'origine:
/etc/init.d/networking restart
En pratique, je le programmerais pour qu'il ignore l'état TIME-WAIT en utilisant l'option SO_REUSEADDR mentionnée par WMR. Que fait exactement SO_REUSEADDR?
Cette option de socket indique au noyau que même si ce port est occupé (dans
l'état TIME_WAIT), continuez et réutilisez-le quand même. S'il est occupé, mais avec un autre état, vous obtiendrez toujours une erreur d'adresse déjà utilisée. C'est utile si votre serveur a été arrêté, puis redémarré immédiatement alors que les sockets sont toujours actifs sur son port. Vous devez savoir que si des données inattendues arrivent, cela peut perturber votre serveur, mais, bien que cela soit possible, cela est peu probable.
TIME_WAIT
sur le serveur" , passez simplement aux trois premières réponses qui évitent la question au lieu de la répondre.