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.Antworten:
Dieser Fehlerbericht behauptet, dass das Problem in der Netstat- Implementierung liegt . Der an den Fehlerbericht angehängte Code zeigt Sockets im Status TIME_WAIT korrekt an. Sie müssen die folgenden Zeilen entfernen
damit Sockets angezeigt werden, die an localhost gebunden sind.
quelle
Dies ist keine Antwort, aber jemand kann vielleicht mehr daraus herausholen.
tcpdump -i lo0 -vv port 50007
quelle