Linux

為什麼連接終止後兩端都存在 TCP TIME-WAIT 狀態?

  • March 12, 2013

我正在閱讀 TCP 狀態如何工作,尤其是連接終止部分。

我閱讀的所有書籍或線上材料都表明,對於終止過程,這些狀態是從發起(活動)連接終止的一側開始的:

已建立、FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT、已關閉

這些來自接收(被動)方面:

已建立,關閉等待,最後確認,關閉

現在問題來了:我已經對雙方的 nf_conntrack_ipv4 模組進行了 modprobed,以檢查 /proc/net/ip_conntrack 中的連接狀態。

令我驚訝的是,當連接終止時,發起者(主動)和接收者(被動)都進入 TIME-WAIT 狀態。

我希望只有發起者會經歷這種狀態,而接收者只是關閉連接。

有人可以解釋為什麼會這樣嗎?

更新:如何執行此測試

我有一個 IP 為 10.0.0.1(Ubuntu 12.04)的虛擬機,我從它開始了兩個到 10.0.0.2(Debian 6)的 ssh 連接(10.0.0.2 也是一個虛擬機)。我檢查了兩端的 ip_conntrack,這就是我得到的。

root@machine1:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp      6 431997 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 [ASSURED] mark=0 use=2
tcp      6 431944 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 [ASSURED] mark=0 use=2

root@machine2:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp      6 432000 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 packets=206 bytes=19191 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 packets=130 bytes=18177 [ASSURED] mark=0 secmark=0 use=2
tcp      6 431947 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 packets=16 bytes=4031 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 packets=17 bytes=3741 [ASSURED] mark=0 secmark=0 use=2

到目前為止,一切看起來都很好。現在我從 machine2 斷開一個 ssh 連接,這就是我得到的:

root@machine1:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp      6 431989 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 [ASSURED] mark=0 use=2
tcp      6 117 TIME_WAIT src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 [ASSURED] mark=0 use=2

root@machine2:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp      6 432000 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 packets=211 bytes=19547 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 packets=133 bytes=18925 [ASSURED] mark=0 secmark=0 use=2
tcp      6 115 TIME_WAIT src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 packets=31 bytes=5147 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 packets=25 bytes=4589 [ASSURED] mark=0 secmark=0 use=2

Linux TCP 堆棧和 conntrack 對 TCP 連接有兩種不同的看法。您所看到的/proc/net/ip_conntrack與核心所看到的不同。核心狀態儲存在/proc/net/tcp/proc/net/tcp6可以用netstat.

如此處所示:https ://serverfault.com/questions/313061/netstat-and-ip-conntrack-connection-count-differ-by-order-of-magnitude-為什麼兩個計數不同。我想如果你看一下netstat’s 的輸出,你只會看到一個結尾TIME-WAIT

引用自:https://unix.stackexchange.com/questions/67479