TCP 如何保证有效传输及拥塞控制原理

  • tcp 是面向连接的、可靠的、传输层通信协议

可靠体现在:有状态、可控制

  • 有状态是指 TCP 会确认发送了哪些报文,接收方受到了哪些报文,哪些没有收到,保证数据包按序到达,不允许有差错
  • 可控制的是指,如果出现丢包或者网络状况不佳,则会跳转自己的行为,减少发送的速度或者重发

所以上面能保证数据包的有效传输。

拥塞控制原理

原因是有可能整个网络环境特别差,容易丢包,那么发送端就应该注意了。

主要用三种方法:

  • 慢启动阈值 + 拥塞避免
  • 快速重传
  • 快速恢复

慢启动阈值 + 拥塞避免

对于拥塞控制来说,TCP 主要维护两个核心状态:

  • 拥塞窗口(cwnd)
  • 慢启动阈值(ssthresh)

在发送端使用拥塞窗口来控制发送窗口的大小。

然后采用一种比较保守的慢启动算法来慢慢适应这个网络,在开始传输的一段时间,发送端和接收端会首先通过三次握手建立连接,确定各自接收窗口大小,然后初始化双方的拥塞窗口,接着每经过一轮 RTT(收发时延),拥塞窗口大小翻倍,直到达到慢启动阈值。

然后开始进行拥塞避免,拥塞避免具体的做法就是之前每一轮 RTT,拥塞窗口翻倍,现在每一轮就加一个。

快速重传

在 TCP 传输过程中,如果发生了丢包,接收端就会发送之前重复 ACK,比如 第 5 个包丢了,6、7 达到,然后接收端会为 5,6,7 都发送第四个包的 ACK,这个时候发送端受到了 3 个重复的 ACK,意识到丢包了,就会马上进行重传,而不用等到 RTO (超时重传的时间)

选择性重传:报文首部可选性中加入 SACK 属性,通过 left edge 和 right edge 标志那些包到了,然后重传没到的包

快速恢复

如果发送端收到了 3 个重复的 ACK,发现了丢包,觉得现在的网络状况已经进入拥塞状态了,那么就会进入快速恢复阶段:

  • 会将拥塞阈值降低为 拥塞窗口的一半
  • 然后拥塞窗口大小变为拥塞阈值
  • 接着 拥塞窗口再进行线性增加,以适应网络状况

发表评论

后才能评论

评论(8)

  • Bin Watson ⃒⃘⃤ 普通 2022-03-07 9:33 下午

    这个 有效传输 的语意和 可靠传输 是有什么区别吗?有点不太明白。。。

  • mr.yt 普通 2021-09-29 8:47 下午

    拥塞控制原理那的快速恢复写成快速回复了

  • 羊之助 普通 2021-09-14 9:22 下午

    TCP Reno这个算法定义在RFC5681。快速重传和快速恢复算法一般同时使用。快速恢复算法是认为,你还有3个Duplicated Acks说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈,并不需要重新回到慢启动进行,这样可能降低效率。所以协议栈会做如下工作

    cwnd = cwnd/2
    sshthresh = cwnd

    然后启动快速恢复算法:

    设置cwnd = ssthresh+ACK个数*MSS(一般情况下会是3个dup ACK)
    重传丢失的数据包(对于重传丢失的那个数据包,可以参考TCP-IP详解:SACK选项)
    如果只收到Dup ACK,那么cwnd = cwnd + 1, 并且在允许的条件下发送一个报文段
    如果收到新的ACK, 设置cwnd = ssthresh, 进入拥塞避免阶段

  • ooooHao 普通 2021-09-06 10:16 下午

    TCP Reno在收到三个冗余ACK触发快速恢复的时候,阈值降为拥塞窗口的一半,然后新的拥塞窗口的值貌似是阈值+3,因为收到了三个冗余ACK说明在进入快速恢复前成功发送了3个报文,因此拥塞窗口可以继续增加。帅地有时间可以考证下~

  • 北街看日出 普通 2021-08-18 11:26 下午

    慢启动一开始指数增长,不慢。快速恢复线性增加,不快。