No TIME_WAIT
su Mac OS X.
Normalmente, quando una connessione TCP viene chiusa, il socket sul lato in cui close()
viene chiamato per primo viene lasciato nello TIME_WAIT
stato.
Quando uno dei peer è una macchina Mac OS X (Lion), no TIME_WAIT
viene elencato netstat -an
sul Mac se close()
viene chiamato per primo sul lato Mac. Tuttavia, sembra che il socket sia effettivamente nello TIME_WAIT
stato, perché il tentativo di richiamare listen()
nuovamente (senza utilizzare l'opzione socket SO_REUSEADDR
) causa un listen()
errore.
Attendere 2 * MSL (durata massima del segmento, che è di 15 secondi su Mac OS X Lion come riportato da sysctl net.inet.tcp.msl
), cancella lo TIME_WAIT
stato e listen()
può essere richiamato senza errori.
Perché non riesco a vedere la presa TIME_WAIT
?
analisi
Ecco due semplici programmi di test in Python.
server
#!/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")
Cliente
#!/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")
Quando si eseguono sia il server che il client su due diverse macchine Linux, il peer che preme <enter>
per chiamare close()
ottiene per primo TIME_WAIT
come previsto:
$ ./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
$
Quando uno dei peer è un Mac (con OS X Lion) non vedo mai un TIME_WAIT
quando si esegue netstat -an | grep 50007
dopo aver chiuso per primo sul Mac.
sudo lsof -i -P
non mostra lo stato TIME_WAIT per i processi che sono già usciti.