读《TCP/IP详解》第21、22、23章:TCP的超时与重传、坚持与保活定时器

时间:2023-01-08 08:39:37

TCP的超时与重传

TCP提供可靠的运输层,使用的方法之一就是数据确认,但数据和确认都可能丢失,TCP通过在发送时设置一个定时器来解决。如果当定时器溢出还没收到,就重传该数据。

对于每个TCP连接,都会管理4个不同的定时器

  1. 重传定时器:当希望收到另一端发回的数据确认时设置,若定时器溢出未收到数据,则重传
  2. 坚持定时器:使窗口大小信息保持不断流动,即使另一端关闭了接收窗口
  3. 保活定时器:用于检测到一个空闲连接的另一端是否崩溃或重启,该连接是否有效。
  4. 2MSL定时器,测量一个连接处理TIME_WAIT状态的时间

RTT的测量

最初TCP规范使用低通过滤器来更新一个被平滑的RTT估计器
R<-aR+(1-a)M
其中a是一个推荐值为0.9的平滑因子。

RFC 793推荐的重传超时时间RTO的值设置为
RTO= Rb(b是一个推荐值为2的时延离散因子)

拥塞避免算法

拥塞避免算法和慢启动算法是两个目的不同,独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,可以调用慢启动来做到这一点,在实际中这两个算法通常一起实现。

拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动阈sstresh,算法工作过程如下:

  1. 对于一个给定的连接,初始化cwnd为1个报文段,sstresh为65535个字节
  2. TCP输出例程的输出不能超过cwnd和接收方通告窗口大小,拥塞避免是发送方使用的流量控制,而通告窗口是接收方进行的流量控制。
  3. 当拥塞发生时(超时或收到重复确认),sstresh被设置为当前窗口大小的一半(cwnd和接收方通告窗口的最小值,最少2个报文段),若是超时引起拥塞,cwnd被设置为1个报文段。
  4. 若新的数据被确认,增加cwnd,但增加的方法依赖于是否正在进行慢启动或拥塞避免。若cwnd小于或等于sstresh,则正在进行慢启动,否则正在进行拥塞避免。

快速重传与快速恢复算法

  1. 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半,重传丢失的报文段,设置cwnd为sstresh加上3倍的报文段大小
  2. 每次收到另一个重复的ACK时,cwnd增加1个报文段并发送1个分组
  3. 当下个确认新数据的 ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个 ACK应该是在进 重传后的 个往返时间内对步骤 1中重传的确认。另外,这个 ACK也应该 是对丢失的分组和收到的第 1个重复的 ACK之间的所有中间报 段的确认。这步采用的是拥 塞避免,因为当分组丢失时我们将当前的速率减半。

TCP的坚持定时器

在TCP数据发送过程中,如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止。为防止这种死锁情况的发生,发送方使一个坚持定时器来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文称为窗口探查。

窗口探查包含一个字节的数据(序号为9217)。TCP总是允许在关闭连接前发送一个字节的数据。坚持状态与超时重传的不同点是TCP从不放弃发送窗口探查,每隔60s发送一次,这个过程将持续到窗口被打开或者连接被终止。

糊涂窗口综合症

糊涂窗口综合症是指当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小; 极端情况下,有效载荷可能只有1个字节;传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象(百度百科:糊涂窗口综合症

避免措施:

  1. 接收方不通告小窗口,通常的算法是接收方不通告一个比当前窗口大的窗口,除非窗口中可以增加一个报文段大小或者可以增加接收方缓存空间的一半。
  2. 发送方避免出现的措施只有满足以下条件之一
    • 可以发送一个满长度的报文段
    • 可以发送至少是接收方通告窗口一半的报文段
    • 可以发送任何数据并且不希望接收ACK或该连接上不使用Nagle算法

TCP的保活定时器

许多时间,一个服务器希望知道客户主机是否崩溃并关机或者重新启动。保活定时器就提供这种能力。

Host Requirements RFC提供了3个不使用保活定时器的理由:

  1. 在出现短暂差错的情况下,可能会使一个非常好的连接释放
  2. 耗费不必要的宽带
  3. 在按分组计费的情况下会在互联网上花掉更金钱

如果一个给定的连接在两小时内没有任何动作,则服务器向客户发送一个探查报文段,客户主机必须处于以下4个状态之一:

  1. 客户主机依然正常运行,并从服务器可达,服务器知道对方工作正常,在两小时后复位保活定时器。
  2. 客户主机已经崩溃,并且关闭或正在重新启动,在任何情况下,客户的TCP没有响应,服务器将汪能收到响应,并在75秒后超时。服务器共发10个这样的探查,每个间隔75秒。若没有收到一个响应,则认为客户主机已经关闭并终止连接。
  3. 客户主机崩溃并已经重新启动,这里服务器将收到一个对其保活探查的响应,但是一个复位信号,使得连接中止。