#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/
评论
TCP这篇博客文章有一个很好的答案:vincent.bernat.im/en/blog / ...