Não há TIME_WAIT
no Mac OS X
Normalmente, quando uma conexão TCP é fechada, o soquete do lado onde close()
é chamado primeiro é deixado no TIME_WAIT
estado.
Quando um dos pares é uma máquina Mac OS X (Lion), nenhum TIME_WAIT
é listado netstat -an
no Mac se close()
for chamado primeiro no lado do Mac. No entanto, parece que o soquete está realmente no TIME_WAIT
estado, porque tentar chamar listen()
novamente (sem usar a opção de soquete SO_REUSEADDR
) causa listen()
falha.
A espera de 2 * MSL (Vida útil máxima do segmento, que é de 15 segundos no Mac OS X Lion, conforme relatado por sysctl net.inet.tcp.msl
) limpa o TIME_WAIT
estado e listen()
pode ser chamado novamente sem erro.
Por que não consigo ver o soquete TIME_WAIT
?
Teste
Aqui estão dois programas de teste simples em Python.
Servidor
#!/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")
Cliente
#!/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")
Ao executar o servidor e o cliente em duas máquinas Linux diferentes, o ponto que pressiona <enter>
para ligar close()
primeiro obtém o TIME_WAIT
esperado:
$ ./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
$
Quando um dos colegas é um Mac (executando o OS X Lion), nunca vejo um TIME_WAIT
ao executar netstat -an | grep 50007
depois de fechar o Mac pela primeira vez.
sudo lsof -i -P
não mostra o status TIME_WAIT para processos que já foram encerrados.Respostas:
Este relatório de bug afirma que o problema está na implementação do netstat . O código anexado ao relatório de erros mostra os soquetes no estado TIME_WAIT corretamente. Você precisa remover as seguintes linhas
para mostrar os soquetes vinculados ao localhost.
fonte
Esta não é uma resposta, mas talvez alguém possa descobrir mais sobre isso.
tcpdump -i lo0 -vv port 50007
fonte