Non TIME_WAIT
sur Mac OS X
Normalement, lorsqu'une connexion TCP est fermée, le socket du côté où close()
est appelé en premier est laissé en l' TIME_WAIT
état.
Lorsque l'un des pairs est une machine Mac OS X (Lion), aucun TIME_WAIT
n'est répertorié par netstat -an
sur le Mac s'il close()
est appelé en premier du côté Mac. Cependant, il semble que le socket soit réellement en TIME_WAIT
état, car une nouvelle tentative d'appel listen()
(sans utiliser l'option socket SO_REUSEADDR
) listen()
échoue.
L'attente de 2 * MSL (durée de vie maximale du segment, qui est de 15 secondes sur Mac OS X Lion comme indiqué par sysctl net.inet.tcp.msl
) efface l' TIME_WAIT
état et listen()
peut être rappelée sans erreur.
Pourquoi ne puis-je pas voir la prise TIME_WAIT
?
Essai
Voici deux programmes de test simples en Python.
Serveur
#!/usr/bin/env python
import socket
HOST = ''
PORT = 50007
l = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
l.bind((HOST, PORT))
l.listen(1)
print("Listening on %d" % PORT)
(s, _) = l.accept()
print("Connected")
raw_input("Press <enter> to close...")
l.close()
s.close()
print("Closed")
Client
#!/usr/bin/env python
import socket
import sys
HOST = sys.argv[1]
PORT = 50007
print("Opening connection to server")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
raw_input("Press <enter> to close...")
s.close()
print("Closed")
Lors de l'exécution du serveur et du client sur deux machines Linux différentes, l'homologue qui appuie <enter>
pour appeler en close()
premier obtient un TIME_WAIT
comme prévu:
$ ./server-timewait.py
Listening on 50007
Connected
Press <enter> to close...
Closed
$ netstat -an | grep 50007
tcp 0 0 172.16.185.219:50007 172.16.185.42:49818 TIME_WAIT
$
Lorsque l'un des pairs est un Mac (exécutant OS X Lion), je ne vois jamais un TIME_WAIT
lors de l'exécution netstat -an | grep 50007
après avoir d'abord fermé sur le Mac.
sudo lsof -i -P
pas non plus le statut TIME_WAIT pour les processus qui ont déjà quitté.Réponses:
Ce rapport de bogue prétend que le problème est dans l' implémentation de netstat . Le code attaché au rapport de bogue affiche correctement les sockets dans l'état TIME_WAIT. Vous devez supprimer les lignes suivantes
pour lui montrer les sockets liées à localhost.
la source
Ce n'est pas une réponse, mais quelqu'un peut peut-être en savoir plus.
tcpdump -i lo0 -vv port 50007
la source