TCP 协议如何保证可靠传输

TCP报文段头部

TCP报文段头部

TCP 保证可靠传输的方式有:校验和、序列号、超时重传、流量控制、拥塞控制。

  • 校验和

    在发送和接收数据时,都会计算检验和,若不一致,说明数据在传输过程中出现了错误,则丢弃出错的数据包。

  • 序列号确认应答

    TCP发送的每一个报文段都有序号字段,每次接收到数据后,都会对传输方发送 ACK 报文进行确认应答。接收方可以根据序列号对数据包进行排序和去重,把有序的数据传输给应用层,确认号可以告诉发送方成功接收了哪些数据以及下一次的数据从哪里开始发送。

  • 超时重传

    当 TCP 发出一个报文后,会启动一个定时器,如果超时还没有收到确认,发送发将重发这个报文。

  • 约定最大报文长度

    建立 TCP 连接时,双方约定最大报文段长度作为发送单位,理想的长度是刚好不被网络层分片。

  • 流量控制

    TCP 通过滑动窗口实现流量控制,窗口的大小就是发送方无需等待 ACK 的情况下还能发送的最大数据量,TCP 通过窗口大小来协调端对端的发送速度,确保接收端来得及接收,从而减少丢包。

  • 拥塞控制

    • 慢开始

      避免一开始就向网络中发送大量数据,所以 cwnd(拥塞窗口) 初始值为1,每一轮传输后翻倍。当 cwnd >= ssthresh 时启动拥塞避免算法。

    • 拥塞避免

      慢开始阶段 cwnd 呈指数增长,拥塞避免算法的思路是设置一个门限值 ssthresh,当 cwnd >= ssthresh 时启动拥塞避免算法,使 cwnd 增长速度为 1。无论是 慢开始 还是 拥塞避免 阶段出现拥塞,都把 ssthresh 设为出现拥塞时的发送窗口值的一半(最小值为2),cwnd 值设为1,重新开始执行慢开始算法

    • 快重传

      发送发的多个报文同时发送,若接收方收到了失序报文就会立即发送一个重复确认,发送方只要收到三个重复确认就会立即重发对方没有收到的报文段,而不是等待定时器超时重传。(及早知道丢包,及早重传)

    • 快恢复

      发送方收到连续三个重复确认后,把 ssthresh 门限减半,cwnd 设置为 ssthresh 的大小。然后开始执行拥塞避免算法。

img