為什麼連接終止後兩端都存在 TCP TIME-WAIT 狀態?
我正在閱讀 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