Skip to content

4.2 TCP 重传、滑动窗口、流量控制、拥塞控制

重传机制

通过序列号与确认应答。保证发送的包一定被接受,TCP 针对数据包丢失的情况,会用重传机制解决。常见的重传机制有

  • 超时重传
    • 在发送数据时,当超过指定的时间没有收到对方的 ACK 确认应答报文,就会重发该数据。
      • 原因可能是数据包丢失或者确认应答丢失
    • RTT 表示数据发送到收到确认的差值,RTO是超时重传时间,通常略大于RTT,并且通过RTT的变化动态调整

滑动窗口

  • 操作系统开辟的一个缓存空间
  • 发送方主机只有在收到确认应答后会将发送数据从缓存区清除
  • 接收方主机缓存
    • 已收到并确认的数据,等待应用读取
    • 剩余空间
  • 窗口大小由接收方通过 TCP 头中的 Window 字段告知发送方,表示自己最大接受能力,两行滑窗基本一致,因为传输有时延,所以是约等于

流量控制

  • 发送方按照接收方窗口大小调整自己窗口大小

拥塞控制

避免「发送方」的数据填满整个网络。

  • 拥塞窗口(cwnd):发送方根据网络的拥塞程度维护的一个的状态变量,网络越好,窗口越大。
    • 发送窗口的值是= min(拥塞窗口, 接收窗口)
    • 拥塞定义:发送方规定时间内没有收到确认报文 控制算法如下:
  • 慢启动:TCP 刚建立时,每次收到一个确认报文,拥塞窗口大小增加 1
    • 第一次发送收到一个 ack,增加到 2,第二次到 4(指数增长)
    • 当达到慢启动门限值,启动拥塞避免算法
  • 拥塞避免:没收到一个确认报文,拥塞窗口大小增加 1 / cwnd
    • 由指数增长变成了线性增长,增速放缓
  • 拥塞发生:当触发了重传机制(规定时间未收到确认包)
    • 将慢启动门限值设置为当前拥塞窗口的一半
    • 拥塞窗口重置为初始值(Linux的初始值为10),再次进行慢启动

快速恢复

发生了「快速重传」(能收到3个重复的ACK)的拥塞发生算法

  • 拥塞窗口减少到原来的一半;

  • 慢启动门限值设置为当前拥塞窗口值(也就是发生重传时的一半

  • 进入快速恢复算法:

    • 拥塞窗口 = 慢启动门限值 + 重复收到ack的数量

    • 重传丢失的数据包;

    • 如果再收到重复的 ACK,那么拥塞窗口每次增加 1;

    • 如果收到新数据的 ACK 后,把拥塞窗口设置为第一步中的慢启动门限值;

      • 这里拥塞窗口又回到慢启动门限值,是因为快速恢复是为了尽快将丢失的数据包发给目标
      • 快速恢复是拥塞发生后慢启动的优化,最后还是要降低拥塞窗口进入拥塞避免,只是没有那么剧烈

正在精进