TCP拥塞控制

本文内容整理自左耳朵耗子的文章《TCP那些事下

拥塞窗口,cwnd全称Congestion Window。
拥塞窗口是由TCP sender决定的,用来决定当发生拥塞时(或者TCP刚刚开始建立连接时的慢启动)TCP sender可以发送的报文数量,用MSS(Maximum Segment Size,最大分段大小)来表示。
发送方开始时发送一个报文段,然后等待 ack。当收到该ack时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的 ack时,拥塞窗口就增加为4。这是一种指数增加的关系。(可以认为每经过一个RTT,cwrd就翻倍)

滑动窗口是TCP用来进行流量控制的,receiver通过滑动窗口告诉sender自己有多少缓冲区可以接收数据。示意图如下:

发送方取拥塞窗口与通告窗口中的最小值作为发送上限。

慢启动用来控制当连接刚刚建立时,如何发送报文,

慢启动的算法如下(cwnd全称Congestion Window),第3)条是第2)条的现象:

1)连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。
2)每当收到一个ACK,cwnd++; 呈线性上升
3)每当过了一个RTT,cwnd = cwnd*2; 呈指数让升
4)还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”

拥塞避免算法 – Congestion Avoidance

前面说过,还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”。一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后,算法如下:

1)收到一个ACK时,cwnd = cwnd + 1/cwnd

2)当每过一个RTT时,cwnd = cwnd + 1

这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。很明显,是一个线性上升的算法。

拥塞状态时的算法

前面我们说过,当丢包的时候,会有两种情况:

1)等到RTO超时,重传数据包。TCP认为这种情况太糟糕,反应也很强烈。
◦sshthresh = cwnd /2
◦cwnd 重置为 1
◦进入慢启动过程

2)Fast Retransmit算法,也就是在收到3个duplicate ACK时就开启重传,而不用等到RTO超时。
◦TCP Tahoe的实现和RTO超时一样。
◦TCP Reno的实现是: ◾cwnd = cwnd /2
◾sshthresh = cwnd
◾进入快速恢复算法——Fast Recovery

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值