0

ポート 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
4

1 に答える 1

0

*しかし、accept によって返され、現在確立された状態にあるソケットが TIME_WAIT 状態にない理由がわかりません。

プロセスを強制終了したため、あらゆる種類の正常なシャットダウンが妨げられました。TIME_WAITプロセスが実際にソケットでclose()(または) を呼び出した場合にのみ表示されます (ピアに a を送信します)。その後、ピアに送信された とピア自身の の両方を受信するのに十分な時間存続します(そのため、 anは送り返しました)。に到達するには 3 つの方法があり、そのうちの 1 つが確立されるために発生する必要がありますが、それは、3 つのパスすべての開始点である FIN_WAIT1 への移行のためにプロセスがまだ生きている場合にのみ発生します。あなたの Ctrl-Cは、シーケンスを開始することさえ妨げました。shutdown()FINACKFINFINACKTIME_WAITTIME_WAITclose()

を表示するTIME_WAITには、プロセスがアクティブにソケットを閉じるように調整する必要があります。たとえば、 用にインストールされたハンドラでSIGHUP、または何らかの入力メカニズムを介してです。任意の時点でプロセスを強制終了することは、必要なものが表示されないようにするための良い方法です。

于 2013-02-06T20:32:44.953 に答える