坚持定时器
上图列子中,收到分组7后,接收方缓存已用完,回复分组8(win 0)来告知发送方暂停发送,待缓存清空后又发送分组9告知发送方可以继续发送;
如果分组9丢失,双方都会继续等待对方的响应,陷入死锁;
为解决这个问题,客户在收到通告窗口为0后,启动坚持定时器,如果定时器到期还仍未收到窗口更新,则发送一个探查分组(一般为1个字节);
坚持定时器计算也采用指数退避
糊涂窗口综合症:接收方在缓存不够时可能回复过小的通报窗口,而发送方也以该大小来发送,就造成一次交换的数据量很少;解决办法就是接收方不要回复太小的通报窗口,发送方也不要发送过小分组,任何一方采取措施都可以解决这个问题;
图示中,接收分组4后,接收方回复窗口0,希望发送方暂停发送,接收方启动坚持定时器,在到期后发送探测分组(1字节),然后接收方陆续将收到的数据传给应用程序,腾出部分缓存,但是还不够大,因此继续回复窗口0(分组7、9),但是接收了所有探测分组,直到回复分组11(窗口大小为1533,足够大),发送方又开始发送;
保活定时器
当TCP连接上长时间没有数据传输时,连接还是存在的,服务器(表示使用保活功能的一方)需要知道客户主机是否还在正常工作或者已经崩溃,服务器需要主动释放这种半开放连接的资源;
如果一台主机在给定时间内没有任何动作,服务器向客户发送一个探查报文,如果客户主机不可达(崩溃、关机、正在重启等等),则无法收到响应,超时后继续重复探查,如果重复一定次数后仍无响应则关闭连接;
如果客户主机崩溃后重启,收到探查,将响应一个复位信号,服务器关闭连接;
无论以上哪种情况发生,服务器应用程序都将收到来自TCP层的差错报告(连接超时、连接被对方复位等等)