TIME_WAIT
Mac OS Xではなし
通常、TCP接続が閉じられると、close()
最初に呼び出された側のソケットはそのTIME_WAIT
状態のままになります。
ピアの1つが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の2つの簡単なテストプログラムを次に示します。
サーバ
#!/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")
2つの異なる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
$
ピアの1つがMac(OS X Lionを実行している)であるTIME_WAIT
場合netstat -an | grep 50007
、Macで最初に閉じた後に実行されているときに、私は一度も表示されません。
sudo lsof -i -P
すでに終了したプロセスのTIME_WAITステータスも表示されません。