Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Networking 为什么tcp最后确认状态不等待2毫秒_Networking_Tcp - Fatal编程技术网

Networking 为什么tcp最后确认状态不等待2毫秒

Networking 为什么tcp最后确认状态不等待2毫秒,networking,tcp,Networking,Tcp,我们都知道,默认情况下,在TCP协议中,如果一方处于TIME_WAIT状态,它将等待2msl,然后进入CLOSED状态 但为什么最后一个ACK状态不等待2毫秒后再转为关闭状态呢?实际上,它一收到最后一个ACK数据包就转为关闭状态 在TIME_WAIT状态下,我认为等待2毫秒有两个目的: 确保网络中此tcp连接的所有数据包都已终止或到达目标端 确保此tcp连接的另一端已收到最后一个ACK数据包 但最后确认状态似乎还需要确保网络中的所有数据包都已到达目标端,因此,它还需要等待2毫秒。被动开启器/

我们都知道,默认情况下,在TCP协议中,如果一方处于TIME_WAIT状态,它将等待2msl,然后进入CLOSED状态

但为什么最后一个ACK状态不等待2毫秒后再转为关闭状态呢?实际上,它一收到最后一个ACK数据包就转为关闭状态

在TIME_WAIT状态下,我认为等待2毫秒有两个目的:

  • 确保网络中此tcp连接的所有数据包都已终止或到达目标端
  • 确保此tcp连接的另一端已收到最后一个ACK数据包

但最后确认状态似乎还需要确保网络中的所有数据包都已到达目标端,因此,它还需要等待2毫秒。

被动开启器/关闭器侧的
最后一次确认
状态在收到来自主动开启器/关闭器的最后一次
确认
后更改为
关闭
,也就是说,该状态转换被明确触发,并且在该点上,我们确信没有更多的数据包从主动端飞来,因为他们已经这样说了(通过发送
FIN
数据包,被动端通过发送
ACK
确认)

只有主动端必须等待,因为它没有最终确认他们发送的最后一个
ACK
确实已发送(同样,该ACK将使被动端移动到关闭状态)。 因此,为了确保接收到
ACK
,它会等待
2*MSL
,然后自动从
TIME\u WAIT
状态移动到
CLOSED

正如史蒂文斯在第页的TCP/IP插图(第1卷,第2版)中所说的。619:

当TCP执行主动关闭并发送最终ACK时,该连接必须在时间等待状态下保持MSL的两倍这允许在最终确认丢失时重新发送该确认。 重新发送最终ACK不是因为TCP重新传输ACK(它们不使用序列号,也不是因为TCP重新传输),而是因为否则将重新传输其FIN(使用序列号)

我认为将书中的状态转换图片包括在内也很有帮助:

它应该等待什么?当接收到最后一个ACK数据包时,双方都知道连接已真正关闭。不再需要等待时间。可能有任何数据包延迟并保留在网络中?不会再有任何数据包了,如果发送RST而不是ACK作为回复没有什么害处,我们知道对等方已经关闭了连接。