Brak TIME_WAIT
w Mac OS X.
Zwykle po zamknięciu połączenia TCP gniazdo po stronie, która close()
jest wywoływana jako pierwsza, pozostaje w tym TIME_WAIT
stanie.
Gdy jednym z komputerów równorzędnych jest komputer Mac OS X (Lion), na Macu nie TIME_WAIT
ma listy, netstat -an
jeśli close()
jest wywoływany jako pierwszy po stronie Maca. Wygląda jednak na to, że gniazdo faktycznie jest w TIME_WAIT
stanie, ponieważ próba listen()
ponownego wywołania (bez użycia opcji gniazda SO_REUSEADDR
) powoduje listen()
błąd.
Oczekiwanie na 2 * MSL (maksymalny czas życia segmentu, który wynosi 15 sekund w systemie Mac OS X Lion zgodnie z raportem sysctl net.inet.tcp.msl
), usuwa TIME_WAIT
stan i listen()
można go ponownie wywołać bezbłędnie.
Dlaczego nie widzę gniazda TIME_WAIT
?
Testowanie
Oto dwa proste programy testowe w języku Python.
serwer
#!/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")
Podczas uruchamiania zarówno serwera, jak i klienta na dwóch różnych komputerach z systemem Linux, peer, który najpierw naciska, <enter>
aby zadzwonić, close()
otrzymuje TIME_WAIT
:
$ ./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
$
Gdy jednym z komputerów równorzędnych jest Mac (z systemem OS X Lion), nigdy nie widzę, TIME_WAIT
gdy działam netstat -an | grep 50007
po pierwszym zamknięciu na Macu.
sudo lsof -i -P
nie pokazuje statusu TIME_WAIT dla procesów, które już się zakończyły.