TCP拥塞算法

TCP拥塞算法:

---------------------------------------------------

TCP通过一个定时器(timer)采样了RTT并计算RTO,但是,如果网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,然而重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这就导致了恶性循环,最终形成“网络风暴” —— TCP的拥塞控制机制就是用于应对这种情况。

首先定义CWND,为了在发送端调节所要发送的数据量,定义了一个“拥塞窗口”(Congestion Window,cwnd),在发送数据时,将拥塞窗口的大小与接收端接收窗口(RWND)大小做比较,取二值较小的做为发送数据量的上限。

拥塞控制主要是四个阶段:

1.慢启动,刚刚加入网络的连接,一点一点地提速,不要一上来就把路占满。连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。每当收到一个ACK,cwnd++, 呈线性上升;每当过了一个RTT,cwnd = cwnd*2,呈指数让升。阈值ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”

2.拥塞避免,当拥塞窗口 cwnd 达到阈值时,窗口大小不再呈指数上升,而是以线性上升,避免增长过快导致网络拥塞。每当收到一个ACK,cwnd = cwnd + 1/cwnd,每当过了一个RTT,cwnd = cwnd + 1。

拥塞发生,当发生丢包进行数据包重传时,表示网络已经拥塞。分两种情况进行处理:等到RTO超时,重传数据包,sshthresh = cwnd /2,cwnd 重置为 1,进入慢启动过程,在收到3个duplicate ACK时就开启重传,而不用等到RTO超时,sshthresh = cwnd = cwnd /2;

进入快速恢复算法——Fast Recovery

4.快速恢复,至少收到了3个Duplicated Acks,说明网络也不那么糟糕,可以快速恢复。cwnd = sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了),重传Duplicated ACKs指定的数据包。

如果再收到 duplicated Acks,那么cwnd = cwnd +1

如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

----------------------------------------------------

1.bdp

bandwidth*Delay,效率、利用率. 表征可用资源的最大值。

3.Reno

拥塞阶段,每次cwmd+1,

假设:

(1)丢包一定出现了拥塞

(2)网络的RTT和带宽稳定不容易出现变化

(3)将速率减半后,一定能清空buffer --- cwnd在出现拥塞后是降到ssthread,而不是最低

问题:

(1)受链路buffer影响较大

(2)对高带宽网络利用率低

(3)对共享链路的其他RTT较大的连接不友好

4. BIC

5. Cubic

跟RTT无关,适合BDP大的网络

大buffer导致发送buffer不能清空,还没清空又开始积累

6.Vegas

会监控RTT

会尝试增加发送速率来探测链路带宽

如果丢包或者RTT增大会降低发送速率

问题:

cwnd增长是线性的,不能很好利用网络传输速率

不能跟基于丢包的算法共存

7.BBR

四个阶段:startup, Drain, ProbeBW, ProbeRTT

----------------------------------------

Linux内核集成的TCP拥塞算法包括:

bic

cubic

htcp

hybla

vegas

westwood

veno

reno

dctcp

cdg

bbr

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容