TCP一共有四个主要的定时器,前面已经讲到了一个--超时定时器--是TCP里面最复杂的一个,另外的三个是:
1. 坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口;
2. 保活定时器可检测到一个空闲连接的另一端何时崩溃或重启;
3. 2MSL定时器测量一个处于TIME_WAIT状态的时间
其中坚持定时器用于防止通告窗口为0以后双方互相等待死锁的情况;而保活定时器则用于处理半开放连接
1.坚持定时器
坚持定时器的原理是简单的,当TCP服务器收到了客户端的0滑动窗口报文的时候,就启动一个定时器来计时,并在定时器溢出的时候来周期性地向客户端查询窗口是否已经增大,如果得到非零的窗口就重新开始发送数据,如果得到0窗口就再开一个新的定时器准备下一次查询。通过观察可以得知,TCP的坚持定时器使用1,2,4,8,16……64秒这样的普通指数退避序列来作为每一次的溢出时间。
糊涂窗口综合症
TCP的窗口协议,会引起一种通常叫做“糊涂窗口综合症”的问题,具体表现为,当客户端通告一个小的非零窗口时,服务器立刻发送小数据给客户端并充满其缓冲区,一来二去就会让网络中充满小TCP数据报,从而影响网络利用率。对于发送方和接收端的这种糊涂行为。TCP给出了一些建议(或者是规定)避免出现“糊涂窗口综合症”的现象。
1. 接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0),
除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收方缓存空间
的一半,不论实际有多少。
2. 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据:
( a )可以发送一个满长度的报文段;
( b )可以发送至少是接收方通告窗口大小一半的报文段;
( c )可以发送任何数据并且不希望接收ACK(也就是说,我们没有还未被确认的数据)或者该连接上不能使用Nagle算法。
现在我们回忆一下,可以发现TCP的很多规定都是为了在一次传送中发送尽量多的数据,例如捎带ACK数据报文的策略,Nagle算法,重传时发送包含原数据报文的策略等等。
2.保活定时器
保活定时器更加的简单,还记得FTP或者Http服务器都有Sesstion Time机制么?因为TCP是面向连接的,所以就会出现只连接不传送数据的“半开放连接”,服务器当然要检测到这种连接并且在某些情况下释放这种连接,这就是保活定时器的作用。其实根据服务器的实现不同而不同。另外要提到的是:
(1) 若在保活定时器内交换数据,则定时器在交换数据后的未来2个内再复位;
(2) 当其中一端如果崩溃并重新启动的情况下,如果收到该端“前生”的保活探查报文段的响应,则要发送一个RST数据报文帮助另一端结束连接。
(3) 否则就认为客户主机已经关闭并终止连接。
保活功能主要是为服务器应用程序提供的。如果给定的连接两个小时内没有任何动作,则服务器就向客户发送一个探查报文段,客户机必须处于一下四个状态之一:
(1) 客户主机已经崩溃,并从服务器可达;
(2) 客户主机已经崩溃,并且关闭或者正在重新启动;
(3) 客户主机崩溃并已经重新启动;
(4) 客户主机正常运行,但是服务器不可达。
3.TCP的未来和性能
虽然TCP在比以太网速率高的环境中也能够正确运行,但在这些高速率环境下,TCP的某些限制就会暴露出来。修改建议:
(1) 路由MTU发现:对于非本地连接,允许TCP使用比默认536大的窗口,提高性能;
(2) 窗口扩大选项:使最大的TCP窗口从65535字节增加1千兆字节以上;
(3) 时间戳选项:允许报文段被精确计时;
(4) 序号回绕保护(PAWS);
(5) 使用改进的TCP事务处理即T/TCP:允许一个客户/服务器的请求-应答序列在通常情况下只使用三个报文段完成。