TIME_WAIT
在Mac OS X上为否
通常,当关闭TCP连接时,close()
首先被调用的那一侧的套接字将保持该TIME_WAIT
状态。
当对等方是Mac OS X(Lion)机器时,如果在Mac端首先被调用,则在Mac 上没有TIME_WAIT
列出。然而,似乎插座的实际状态,因为试图调用一次(不使用套接字选项)会导致失败。netstat -an
close()
TIME_WAIT
listen()
SO_REUSEADDR
listen()
等待2 * MSL(最大分段生存时间,在Mac OS X Lion上为15秒,如报告的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
预期的a:
$ ./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)时,我在Mac上先关闭后再TIME_WAIT
运行时看不到a netstat -an | grep 50007
。
好问题。我自己看到的是同一件事,没有看到netstat包含它们的任何选择……
—
natevw 2014年
FWIW,
—
natevw 2014年
sudo lsof -i -P
对于已退出的进程都不显示TIME_WAIT状态。
@natevw很高兴知道我并不孤单。:-)
—
mgd 2014年