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