No TIME_WAIT
s en Mac OS X
Normalmente, cuando se cierra una conexión TCP, el socket en el lado donde close()
se llama primero se deja en el TIME_WAIT
estado.
Cuando uno de los pares es una máquina Mac OS X (Lion), no TIME_WAIT
aparece netstat -an
en la lista de Mac si close()
se llama primero en el lado de Mac. Sin embargo, parece que el socket está realmente en TIME_WAIT
estado, porque intentar llamar listen()
nuevamente (sin usar la opción de socket SO_REUSEADDR
) hace listen()
que falle.
Esperar 2 * MSL (Duración máxima del segmento, que es de 15 segundos en Mac OS X Lion, según lo informado por sysctl net.inet.tcp.msl
) borra el TIME_WAIT
estado y se listen()
puede volver a llamar sin error.
¿Por qué no puedo ver el zócalo TIME_WAIT
?
Pruebas
Aquí hay dos programas de prueba simples en 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")
Al ejecutar tanto el servidor como el cliente en dos máquinas Linux diferentes, el par que presiona <enter>
para llamar close()
primero obtiene el resultado 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
$
Cuando uno de los pares es una Mac (con OS X Lion) nunca veo una TIME_WAIT
cuando se ejecuta netstat -an | grep 50007
después de cerrar primero en la Mac.
sudo lsof -i -P
tampoco muestra el estado TIME_WAIT para procesos que ya han salido.Respuestas:
Este informe de error afirma que el problema está en la implementación de netstat . El código adjunto al informe de error muestra los sockets en el estado TIME_WAIT correctamente. Debes eliminar las siguientes líneas
para que muestre sockets vinculados a localhost.
fuente
Esta no es una respuesta, pero tal vez alguien pueda extraer más de esto.
tcpdump -i lo0 -vv port 50007
fuente