我正在阅读 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
答案1
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-why两个计数不同。我想如果你看netstat
一下 的输出,你只会看到一个结尾TIME-WAIT
答案2
这是为了防止新连接从旧连接中获得仍然在网络中漂浮的陈旧分段,从而将其搞乱。