TCP连接拆除中TIME WAIT的目的是什么?

网络工程 通讯协议
2021-07-27 16:41:48

我发现主动关闭器进入TIME WAIT的原因是为了确保最终的ACK不会丢失。但是它如何知道最终的 ACK 是否丢失呢?被动关闭器会重新发送 FIN,然后主动关闭器知道 ACK 丢失了吗?这是 TCP FSM 的图片。

TCP FSM

3个回答

被动关闭器会重新发送 FIN,然后主动关闭器知道 ACK 丢失了吗?

是的。引自TCP/IP Illustrated Volume 1,在 TCP Connection Management 部分:

  1. 为了完成关闭,最后一段包含最后一个 FIN 的 ACK。请注意,如果 FIN 丢失,则会重新传输它,直到收到它的 ACK。

有超时。当 in 时LAST_ACK,被动关闭器会FIN在超时时重新发送,假设它丢失了。如果它确实丢失了,那么主动关闭器最终会收到重传的FIN并进入TIME_WAIT如果FIN没有输但决赛ACK输了,则主动关闭者进入TIME_WAITFIN再次接收当发生这种情况-接收FINTIME_WAIT-的ACK重传。

在超时值TIME_WAIT用于传送目的。当 中出现超时时TIME_WAIT,假定最终ACK已成功传递,因为被动关闭器没有重新传输FIN数据包。因此,超时时间TIME_WAIT只是我们可以安全地假设如果另一端没有发送任何内容的时间,那是因为他收到了最终ACK并关闭了连接。

但是它如何知道最终的 ACK 是否丢失呢?

因为它没有在超时时间内收到它。我知道这是一个“废话”的答案,但这正是这些状态和超时存在的原因。

被动关闭器是否会重新发送 FIN

不。除非该流有更多数据包到达,否则将导致发送“RST”(重置)。

整个过程是复杂的状态机,尽管存在网络故障的可能性,但仍能有序地执行关机。网络中断、链接出现错误、链接变得饱和并不得不丢弃数据包、设备出现故障等。作为练习,当其中一个端点刚刚消失(例如电源故障)时,运行活动连接的状态树。

TL;DR 该状态树旨在处理每种可能的故障模式。

TIME_WAIT 的目的是允许网络区分到达的数据包属于“旧的、现有的”连接和新的连接。建议将 TIME_WAIT 计时器设置为最大段生存时间 (MSL) 的两倍,在我的系统上,MSL 为 1 分钟,因此连接会在 TIME_WAIT 状态停留 2 分钟。

在这段时间之后,任何到达的数据包都不再与旧连接相关联。

TIME_WAIT 不是直接等待发送ACK包;这是由 CLOSE_WAIT 和 FIN_WAIT 状态驱动的。当您进入 TIME_WAIT 状态时,套接字已经关闭。

参考资料:http : //www.tcpipguide.com/free/t_TCPConnectionTermination-3.htm https://en.wikipedia.org/wiki/Maximum_segment_lifetime http://www.lognormal.com/blog/2012/09/27/ linux-tcpip-调优/