TCP拥塞控制

来源:互联网 发布:php pdo是什么 编辑:程序博客网 时间:2024/06/03 11:29

本文内容整理自左耳朵耗子的文章《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

原创粉丝点击