我发现主动关闭器进入TIME WAIT的原因是为了确保最终的ACK不会丢失。但是它如何知道最终的 ACK 是否丢失呢?被动关闭器会重新发送 FIN,然后主动关闭器知道 ACK 丢失了吗?这是 TCP FSM 的图片。
TCP连接拆除中TIME WAIT的目的是什么?
被动关闭器会重新发送 FIN,然后主动关闭器知道 ACK 丢失了吗?
是的。引自TCP/IP Illustrated Volume 1,在 TCP Connection Management 部分:
- 为了完成关闭,最后一段包含最后一个 FIN 的 ACK。请注意,如果 FIN 丢失,则会重新传输它,直到收到它的 ACK。
有超时。当 in 时LAST_ACK
,被动关闭器会FIN
在超时时重新发送,假设它丢失了。如果它确实丢失了,那么主动关闭器最终会收到重传的FIN
并进入TIME_WAIT
。如果FIN
没有输但决赛ACK
输了,则主动关闭者进入TIME_WAIT
并FIN
再次接收。当发生这种情况-接收FIN
的TIME_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-调优/