ポート 5000 で最大 10 の接続を受け入れる小さなサーバー (TCP サーバー) を使用しています。リッスン モードでソケットを作成し、接続を受け入れます。受け入れが成功したら、新しいスレッドを作成し、そのスレッドでトラフィックを処理します。このサーバーに接続して通信できるクライアントが同じマシンにあります。
TIME_WAIT を理解するために、ctrl+c を使用してサーバー アプリケーションを強制終了します。「Established」状態にあったサーバーソケットが「TIME_WAIT」に転送されることを期待しています。ただし、閉鎖後に netstat を実行すると、その「TIME_WAIT」状態の単一のソケットが表示されません。「リッスン」モードのソケットが直接 CLOSED 状態に移行することはわかっています。しかし、受け入れによって返され、現在確立された状態にあるソケットが TIME_WAIT 状態にない理由がわかりません。
(私は Linux マシンを使用しており、tcp_fin_timeout 値は 1 分に設定されています。)
私のtcpdumpは以下のようになります:
localhost.49388 > localhost.5000:
Flags [S], cksum 0xfe30 (incorrect -> 0xaa93), seq 3264533269, win 32792,
options [mss 16396,sackOK,TS val 20216234 ecr 0,nop,wscale 3], length 0
localhost.5000 > localhost.49388:
Flags [S.], cksum 0xfe30 (incorrect -> 0xc6a0), seq 3352338762, ack 3264533270, win 32768,
options [mss 16396,sackOK,TS val 20216234 ecr 20216234,nop,wscale 3], length 0
localhost.49388 > localhost.5000:
Flags [.], cksum 0xfe28 (incorrect -> 0x9fbe), ack 1, win 4099,
options [nop,nop,TS val 20216234 ecr 20216234], length 0
localhost.5000 > localhost.49388:
Flags [P.], cksum 0xfe42 (incorrect -> 0xa300), seq 1:27, ack 1, win 4096,
options [nop,nop,TS val 20216484 ecr 20216234], length 26
localhost.49388 > localhost.5000:
Flags [.], cksum 0xfe28 (incorrect -> 0x9db0), ack 27, win 4099,
options [nop,nop,TS val 20216484 ecr 20216484], length 0
localhost.49388 > localhost.5000:
Flags [P.], cksum 0x0211 (incorrect -> 0x6be1), seq 1:1001, ack 27, win 4099,
options [nop,nop,TS val 20216484 ecr 20216484], length 1000
localhost.5000 > localhost.49388:
Flags [.], cksum 0xfe28 (incorrect -> 0x91cb), ack 1001, win 6144,
options [nop,nop,TS val 20216484 ecr 20216484], length 0
localhost.5000 > localhost.49388:
Flags [R.], cksum 0xfe28 (incorrect -> 0x8eeb), seq 27, ack 1001, win 6144,
options [nop,nop,TS val 20217216 ecr 20216484], length 0