Nein TIME_WAIT
s unter Mac OS X.
Wenn eine TCP-Verbindung geschlossen wird, bleibt normalerweise der Socket auf der Seite, auf der close()
zuerst aufgerufen wird, im TIME_WAIT
Status.
Wenn einer der Peers ein Mac OS X (Lion) -Computer ist, TIME_WAIT
wird netstat -an
auf dem Mac no von aufgelistet, wenn close()
auf der Mac-Seite zuerst aufgerufen wird. Allerdings scheint es , dass der Sockel ist tatsächlich in TIME_WAIT
Staat, weil versucht zu rufen listen()
wieder (ohne die Socket - Option SO_REUSEADDR
) verursacht listen()
scheitern.
Das Warten auf 2 * MSL (maximale Segmentlebensdauer, die unter Mac OS X Lion 15 Sekunden beträgt, wie von gemeldet sysctl net.inet.tcp.msl
) löscht den TIME_WAIT
Status und listen()
kann ohne Fehler erneut aufgerufen werden.
Warum kann ich die Steckdose nicht sehen TIME_WAIT
?
Testen
Hier sind zwei einfache Testprogramme 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")
Klient
#!/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")
Wenn sowohl der Server als auch der Client auf zwei verschiedenen Linux-Computern ausgeführt werden, erhält der Peer, <enter>
der close()
zuerst aufruft, TIME_WAIT
wie erwartet:
$ ./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
$
Wenn einer der Peers ein Mac ist (auf dem OS X Lion ausgeführt wird), wird TIME_WAIT
beim Ausführen netstat -an | grep 50007
nach dem ersten Schließen auf dem Mac kein Fehler angezeigt.
sudo lsof -i -P
zeigt den TIME_WAIT-Status auch nicht für Prozesse an, die bereits beendet wurden.