Нет TIME_WAIT
на Mac OS X
Обычно, когда соединение TCP закрыто, сокет на стороне, где close()
вызывается первым, остается в TIME_WAIT
состоянии.
Когда одним из пиров является компьютер Mac OS X (Lion), на Mac не TIME_WAIT
указывается no, 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 для процессов, которые уже вышли.Ответы:
В этом отчете об ошибке утверждается, что проблема в реализации netstat . Код, прикрепленный к отчету об ошибке, правильно отображает сокеты в состоянии TIME_WAIT. Вам необходимо удалить следующие строки
чтобы он показывал сокеты, привязанные к localhost.
источник
Это не ответ, но кто-то может извлечь из этого больше информации.
tcpdump -i lo0 -vv port 50007
источник