我发现主动关闭器进入TIME WAIT的原因是要确保最终的ACK不会丢失。但是如何知道最终的ACK是否丢失?被动关闭器会重发FIN,然后主动关闭器知道ACK丢失了吗?这是TCP FSM的图片。
我发现主动关闭器进入TIME WAIT的原因是要确保最终的ACK不会丢失。但是如何知道最终的ACK是否丢失?被动关闭器会重发FIN,然后主动关闭器知道ACK丢失了吗?这是TCP FSM的图片。
Answers:
被动关闭器会重发FIN,然后主动关闭器知道ACK丢失了吗?
是。在“ TCP连接管理”部分中的“ TCP / IP图解卷1 ”中进行报价:
- 为了完成收盘,最后一段包含最后一个FIN的ACK。请注意,如果FIN丢失,则会重新传输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是否丢失?
因为它在超时时间内没有收到。我知道这是一个“ duh”答案,但这正是这些状态和超时存在的原因。
被动关闭者会重新发送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-tuning /