TCP协议(二)

数据结构

为了保证不丢包、不乱序,在收发两端的 TCP 还需要维护两个发送列表。

发送端

滑动窗口的大小应该小于等于 min(流量窗口, 拥塞窗口)

接收端

乱序和丢包问题

为了确定一个包是真的发送到,接收方需要发送一个带确认序号的应答包。应答包的机制有:

  • 累计应答
  • 确认序号为发送方发送的下个包的序号,理解为期待序号

如果发送方没有收到应答包,发送方会尽可能的尝试再次发送。触发重传的时机有:

  • 超时,没有在规定的时间内收到带确认序号的应答包

    • 初始重传时间:采用自适应重传算法,估计往返时间,采样RTT进行加权平均计算,且需要考虑波动范围
    • 累计重传时间:多次重传会将重传时间设为之前的两倍,因为多次超时,网络环境差,避免拥塞
  • 接收方主动触发

    1. 接受方连续3次发送冗余 ack,称快速重传

    2. 头部添加SACK,称Selective Acknowledgment

主动触发的方式会比超时重传更加快速解决丢包问题。

流量控制

流量控制是发送方考虑接收方的处理能力调整发送速率的机制,接收方的处理能力与下述两点有关:

  • 自身的最大缓存量。是一个固定值
  • 自身 TCP 层中缓存的未被应用层读取的数据长度。可接受量:最大缓存长度 - 应用层未读取数据长度

可接受量通过 TCP 头部中的 窗口大小 来通知对方调整发送速率.

低能窗口综合征

当接收方的窗口大小调整为0时,发送方会发送探测数据包,查看是否有机会更新窗口大小。接收方这时要注意,需要等到可接收量恢复到一定大小再通知发送发,避免低能窗口综合征。

拥塞控制

TCP 开始发送数据时是无法得知网络情况的,为了避免一下把网络塞慢,TCP 采用了慢启动机制。

  • y 为可发送包的数量
  • x 为已成功发送包的数量,即有应答的包的数量
  • ssthresh 为slow start threshold,减速阀值

随着成功的包越来越多,可发送的数量呈指数增长,在到达一定值后,呈线性增长。但是当发生超时重传或则丢包后,这些值将会发生变化。不同的重传有不同的重置方法。

传统重传:y' = 1ssthresh' = y / 2x' = 0
快输重传:y' = y / 2ssthresh' = yx' = 0,y 的公式修改为 y = ssthresh + x

快输重传算法不照常传输速率断崖式下降而导致网络卡顿。

优化

TCP BBR 拥塞算法,寻找高宽带与低时延的平衡点。


参考

2019-2020 shens3