断开TCP连接中的TIME WAIT的目的是什么?


12

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

TCP FSM



1
这个博客帖子有一个伟大的答案:vincent.bernat.im/en/blog/...
好战黑猩猩

Answers:


5

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

是。在“ TCP连接管理”部分中的“ TCP / IP图解卷1 ”中进行报价:

  1. 为了完成收盘,最后一段包含最后一个FIN的ACK。请注意,如果FIN丢失,则会重新传输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并关闭了连接。


1

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

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

被动关闭者会重新发送FIN吗

不会。除非进一步的数据包到达该流,否则将导致发送“ RST”(重置)。

整个过程是复杂的状态机,即使有网络故障的可能性也要执行有序的关闭。网络断开,链接遇到错误,链接饱和,必须丢弃数据包,设备出现故障等。作为练习,当其中一个端点消失时(例如,电源故障),为活动的连接运行状态树。

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


谢谢,但我仍然对第一部分感到困惑。我的意思是主动关闭器如何知道被动关闭器未收到ACK?当被动关闭器接收到ACK时,它只是断开连接的一侧,如果未接收到ACK,则停留在LAST ACK中,那么主动关闭器如何知道是否接收到ACK?
czhao 2015年

因为每个状态都有计时器。
Ricky Beam

对不起,我不明白。这些计时器如何告诉主动关闭器被动关闭器未收到最终的ACK?即主动关闭器如何知道是否必须重新发送最终ACK?
czhao 2015年

0

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-tuning /

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.