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



评论

TCP

这篇博客文章有一个很好的答案:vincent.bernat.im/en/blog / ...

#1 楼


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


是的。在“ TCP连接管理”部分的“ TCP / IP图解集1”中进行报价:要完成关闭,最后一个段包含最后一个FIN的ACK。请注意,如果FIN丢失,则会重新传输它,直到收到ACK
为止。




存在超时。在LAST_ACK中时,假设超时,被动关闭器将在超时时重新发送FIN。如果确实丢失,则主动关闭器最终将接收重新传输的FIN并输入TIME_WAIT。如果没有丢失FIN,但是丢失了最后一个ACK,则主动关闭器在TIME_WAIT中,并再次接收FIN。发生这种情况时-在FIN中接收到TIME_WAIT-将重新传输ACK

TIME_WAIT中的超时值不用于重新传输。当TIME_WAIT中存在超时时,假定最终的ACK已成功交付,因为被动关闭器未重新传输FIN数据包。因此,TIME_WAIT中的超时只是一个时间量,在此之后我们可以放心地假设,如果另一端没有发送任何东西,那是因为他收到了最终的ACK并关闭了连接。

#2 楼


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


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

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



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

整个过程都是复杂的状态机,即使有网络故障的可能性也要执行有序的关闭。网络中断,链接遇到错误,链接饱和,必须丢弃数据包,设备出现故障等。作为练习,当端点之一刚刚消失时(例如断电),为活动的连接运行状态树。 >
TL; DR该状态树旨在处理每种可能的故障模式。

评论


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

– czhao
2015年7月1日,0:44



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

–瑞奇
15年7月1日,0:56

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

– czhao
15年7月1日在1:56

#3 楼

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/