cubic算法

文章详细介绍了TCP的拥塞控制机制,包括窗口的概念(Tx,Rx,cwnd等),慢启动算法,拥塞避免策略如CUBIC和Reno,以及快重传和快恢复。CUBIC是一种平滑增长的拥塞控制算法,其目标是找到网络的最佳发送速率。文章还讨论了网络拥塞的必然性和如何通过不同算法来避免和缓解拥塞问题。

基本概念

窗口(wnd):分为tx、rx。Tx为发送缓冲,rx为接收缓冲

拥塞窗口(cwnd):越大发送速度越快。所以从低到高调节

慢启动(ssh):网络拥堵时用于缓解网络复杂问题方案,多个数据发送后统一ack。

慢启动门限:cwnd小于此门限时使用慢启动传输数据。

发送拥塞窗口(snd_cwnd):发送拥塞窗口,体现当前发送速率

发送拥塞窗口上(snd_cwnd_clamp):发送窗口的最大值

滑动窗口协议:发送队列控制,保证数据传输可靠性

NAGLE:多个数据组合到一起统一发送给对端

快重传:丢包后立刻重传,接收端会多次发送丢失数据ack以求快速重传

快恢复:将ssh和cwnd都减半,进入拥塞避免算法。一般是连续收到多个重复确认。

CUBIC:基于数学公式探测最大发送窗口的传输算法

Reno:基于RTT探测最大发送窗口的传输算法

BBR:给予链路信息计算大发送窗口的传输算法

SACK:它使得接收方能告诉发送方哪些报文段丢失,哪些报文段重传了,哪些报文段已经提前收到等信息。根据这些信息TCP就可以只重传哪些真正丢失的报文段.

慢启动:拥塞窗口呈指数形态上涨: 1 -> 2 -> 4 -> 8 -> 16,代码如下

当进入慢启动阶段,以当前慢启动门限和发送拥塞窗口+已确认数据中的最小值为新的发送拥塞窗口。并且返回残留的ack的数据用于拥塞控制(一般为dup ack发生是,可以进入快速恢复算法)。

u32 tcp_slow_start(struct tcp_sock *tp, u32 acked)
{
    u32 cwnd = min(tp->snd_cwnd + acked, tp->snd_ssthresh);
    acked -= cwnd - tp->snd_cwnd;
    tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp);   -------------------->更新tcp发送窗口
    return acked;
}

拥塞控制阶段:拥塞窗口在一个往返周期呈次序递增,+1, +1, +1。以单个mss为单位

快速重传:针对网络没有拥塞导致的重传,仅是ack回复慢了或dup ack了的情况。这时候会将拥塞阈值也降低为当前拥塞窗口的一半,拥塞窗口为当前的降低一半加上收到的dup ack数量。

超时重传:拥塞窗口直接恢复初始值,直接从1开始进入慢启动

网络拥塞的必然性

网络拥塞的产生是由于tcp的算法特性决定,可以确认tcp的网络最大容量C由两部分组成,一个是物理层容量C1,一个是二级缓存的大小C2:

C=C1+C2. C2为常量,C为恒不变数值。

那么C1 = P * rtt, P为当前速度且未知最大值为多少、故而持续增长,rtt为一个往返周期。那么推导出:

C= P * rtt +C2.从下图可见,P的理想上升趋势为矩形模式。

那么当n个rtt过后,网络的容量实际会变化为

Cn = Pn * rttn + C2 且Cn > C。

那么这里产生一个问题, P是存在最大值Pmax的,不可能无限增长,当Pn > Pmax时,Cn > Cmax。这时网络拥塞产生了,但是tcp还无法感知且继续填充C2导致rtt变大,tcp也总是想把C2填满。而后tcp在1/2个rtt(最快)后会感知到rtt上升,然后降低P来维持网络状况。

这里会有个问题,理论上tcp应当在C1 -> C1max时,立刻降低速率,由于C2作为缓冲的存在,tcp的cwnd还是会继续增加导致tcp无法立刻控制速度直到C2被填满。所以在1/2 rtt ~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值