每个连接。TCP管理4个不用的定时器
- 重传定时器,使用于当希望收到另一端的确认。
- 坚持定时器,使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口
- 保活定时器,检测到一个空闲连接的另一端何时崩溃或重启
- 2MSL定时器,测量一个连接处于TIME_WAIT状态的时间
如何处理TCP连接中打开窗口的ACK丢失的情况?
关闭窗口的场景:接收方通告发送方接收的数据窗口为0,这个时候发送方不再发送数据;
打开窗口ACK丢失的危害:当接收方通告了一个窗口为非0的ACK,此ACK由于某种原因丢失,此时发送方在永远的等窗口打开的通知,接收方则永远的在等新数据的到来,这样有可能因为等待而造成连接关闭。
解决策略:使用坚持定时器,周期性的向接收方查询,以便发现窗口的变化
这种周期性的查询的,从发送方发出的报文段称为窗口探查,窗口探查包含一个字节的数据,但是返回窗口为0的ACK并不对这个字节进行确认
什么是糊涂窗口综合症?
对于服务器来讲,如果处理的速度过于缓慢,他会将通告窗口的值设置的越来越小,甚至是小于报文头,这种情况下,通信的效率极其低下,这种情况称作糊涂窗口综合症。
如何避免糊涂窗口综合症?
- 接收方:当窗口增加一个报文段大小(MSS)或者可以增加接收方缓存空间一半时,才通告窗口大小
- 发送方:当可以发送一个满长度的报文、发送至少是接收方通告窗口大小的一半的报文或者是可以发送任何数据并且不希望接收ACK(这种情况,数据都已经确认了)
Nagle算法中,当报文太小的时候就不发送,这里的小,可以看出发送方发送的报文小于报文段大小
保活定时器是做什么用的?
服务器应用程序用来探知客户主机是否崩溃并启动,或者崩溃关机等场景。 具体来说客户主机必定处于以下4中状态之一:
- 正常运行。TCP响应正常,服务端知道客户端工作正常,服务器在两小时后将保活定时器复位,如果这两小时之间有应用程序通过这个连接通信,保活定时器在交换数据后的未来两小时再复位;此时的服务器应用程序不需要感知保活定时器
- 客户主机崩溃,并且关闭或者正在重启。服务器总共发送10个探查,每个间隔75秒,如果没有任何响应,认为客户主机关闭并终止连接;
- 客户主机崩溃但已经重启。服务器收到保活探查的响应,但响应回会是个复位,使得服务器终止连接;
- 客户主机正常,但是服务不可达。与2类似,只能得到没有探查响应
缺点在于:1短暂差错可能使得一个好的连接被释放;2保活浪费不必要的带宽;
附录
把书读薄(TCP/IP详解 卷一 第二十二章 第二十三章)