TCP/IP详解12-传输层:TCP的定时器
对每个连接,TCP管理 4 个不同的定时器。
- 1) 重传定时器使用于当希望收到另一端的确认。—上一篇文章中说明过。
- 2) 坚持(persist)定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
- 3) 保活(keepalive)定时器可检测到一个空闲连接的另一端何时崩溃或重启。
- 4) 2MSL定时器测量一个连接处于 TIME_WAIT 状态的时间。—TCP的四次挥手中介绍过。
坚持定时器用于防止通告窗口为0以后双方互相等待死锁的情况;而保活定时器则用于处理半开放连接。
1. TCP的坚持定时器
坚持定时器的原理是简单的,当 TCP 发送方收到了接收方的 0 滑动窗口报文的时候,就启动一个定时器来计时,并在定时器溢出的时候向接收方查询窗口是否已经增大,如果得到非零的窗口就重新开始发送数据,如果得到 0 窗口就再开一个新的定时器准备下一次查询。通过观察可以得知,TCP的坚持定时器使用1,2,4,8,16……64秒这样的普通指数退避序列来作为每一次的溢出时间。
糊涂窗口综合症
TCP 的窗口协议,会引起一种通常叫做糊涂窗口综合症 SWS(Silly Window Syndrome)的问题,具体表现为,当接收方通告一个小的非零窗口时,发送方立刻发送小数据给接收方并充满其缓冲区,一来二去就会让网络中充满小 TCP 数据报,从而影响网络利用率。对于发送方和接收端的这种糊涂行为。TCP给出了一些建议(或者是规定)。
- 1) 接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0), 除非窗口可以增加一个报文段大小(也就是将要接收的 M S S)或者可以增加接收方缓存空间 的一半,不论实际有多少。
- 2) 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据:
- (a)可以发送一个满长度的报文段;
- (b)可以发送至少是接收方通告窗口大小一半的报文段;—主要对付那些总是通告小窗口(也许比 1 个报文段还小)的主机
- (c)可以发送任何数据并且不希望接收 ACK(也就是说,我们没有还未被确认的数据)或者该连接上不能使用Nagle算法。—使我们在有尚未被确认的数据(正在等待被确认)以及在不能使用 Nagle 算法的情况下,避免发送小的报文段。
2. TCP的保活定时器
保活定时器更加的简单,还记得 FTP 或者 Http 服务器都有 Sesstion Time 机制么?因为 TCP 是面向连接的,所以就会出现只连接不传送数据的“半开放连接”,(如果此时客户已经消失了,服务器又在等待来自客户的数据,则服务器将永远等待下去)服务器当然要检测到这种连接并且在某些情况下释放这种连接,这就是保活定时器的作用。其时限根据服务器的实现不同而不通。另外要提到的是,当其中一端如果崩溃并重新启动的情况下,如果收到该端“前生”的保活探察,则要发送一个RST数据报文帮助另一端结束连接。
保活定时器的作用和应用层的心跳类似。所有的保活定时器在连接 2 小时(时间可以设置)空闲后超时。然后以 75s 为间隔连续发送 10 个探测报文段。如果皆无响应,则丢弃此连接。所以一共是 2 小时+75s * 10后,关闭连接。如下图所示: