Ні TIME_WAIT
в Mac OS X
Зазвичай, коли з'єднання TCP закрите, розетка з тієї сторони, де close()
викликається спочатку, залишається у TIME_WAIT
стані.
Коли один з однолітків - це машина Mac OS X (Lion), на Mac не TIME_WAIT
вказано жодне, netstat -an
якщо close()
воно викликається першим на стороні Mac. Тим НЕ менше, здається , що сокет знаходиться фактично в TIME_WAIT
стані, тому що намагаюся додзвонитися listen()
знову (без використання опції сокета SO_REUSEADDR
) призводить listen()
до збою.
Очікування 2 * MSL (максимальний термін служби сегменту, який становить 15 секунд на Mac OS X Lion, як повідомляється sysctl net.inet.tcp.msl
) очищає TIME_WAIT
стан, і його listen()
можна буде викликати знову без помилок.
Чому я не бачу розетки TIME_WAIT
?
Тестування
Ось дві прості програми тестування в Python.
Сервер
#!/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")
Клієнт
#!/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")
Під час роботи як сервера, так і клієнта на двох різних машинах Linux, одноранговий, який натискає, <enter>
щоб зателефонувати close()
спочатку, отримує 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
$
Коли один з однолітків - це Mac (працює під управлінням OS X Lion), я ніколи не бачу а, TIME_WAIT
коли працює netstat -an | grep 50007
після закриття першого на Mac.
sudo lsof -i -P
не показує статус TIME_WAIT для процесів, які вже були завершені.