为什么TCP连接终止后两端都会出现TIME-WAIT状态?

为什么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

答案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

这是为了防止新连接从旧连接中获得仍然在网络中漂浮的陈旧分段,从而将其搞乱。

相关内容