主要思想
发送端的拥塞控制主要有两种形式,一种是基于发送窗口的,另一种是基于rate的
DCQCN是一种基于rate的CC,并主要由ECN机制实现
初始设置sending rate为max line rate
接下来CC主要分为三个部分
CP(Congestion Point) 交换机
出端口当前queue length超过阈值K,则给packet打上ECN标记
NP(Notification Point) 接收端
对于每一个flow设置一个计时器,如果当前flow收到ECN标记且前 N μ s N \mu s Nμs内都未收到ECN,则返回一个CNP报文给发送端,且重置计时器
RP(Reaction Point) 发送端
收到CNP报文则执行以下操作:
R T = R C , R C = R C ( 1 − α / 2 ) , α = ( 1 − g ) α + g , R_T=R_C, \newline R_C=R_C(1-\alpha/2), \newline \alpha=(1-g)\alpha+g, RT=RC,RC=RC(1−α/2),α=(1−g)α+g,
其中, R T R_T RT为旧的sending rate, R C R_C RC为现在的sending rate, α \alpha α为拥塞程度, g g g为设定的更新常数
此外,RP处也设有一个定时器,如果发现连续 K K K时间内均未收到CNP报文,则
α = ( 1 − g ) α , \alpha=(1-g)\alpha, α=(1−g)α,
DCQCN没有使用Slow Start算法恢复sending rate,它同QCN类似,定义了两个计数器, T T T和 B C BC BC,每经过 T T T单位时间,计数器 T = T + 1 T=T+1 T=T+1,每转发 B B B字节,计数器 B C = B C + 1 BC=BC+1 BC=BC+1
当 M a x ( T , B C ) < 5 Max(T,BC)<5 Max(T,BC)<5时,启用Fast Recovery,每经过一个周期:
R C = ( R T + R C ) / 2 , R_C=(R_T+R_C)/2, RC=(RT+RC)/2,
否则当 M i n ( T , B C ) ≤ 5 Min(T,BC)\le5 Min(T,BC)≤5时,启用Additive Increase,每经过一个周期:
R T = R T + R A I , R C = ( R T + R C ) / 2 , R_T=R_T+R_{AI}, \newline R_C=(R_T+R_C)/2, RT=RT+RAI,RC=(RT+RC)/2,
这里的 R A I R_{AI} RAI是一个常数
否则,启用Hyper Increase,每经过一个周期:
R T = R T + R H I ⋅ ( m i n ( T , B C ) − 4 ) , R C = ( R T + R C ) / 2 , R_T=R_T+R_{HI}\cdot (min(T,BC)-4), \newline R_C=(R_T+R_C)/2, RT=RT+RHI⋅(min(T,BC)−4),RC=(RT+RC)/2,
同Additive Increase,这里的 R H I R_{HI} RHI也是一个常数
Buffer设置
对于buffer的设置应遵循两个原则:
1.PFC触发不能过早,保证ECN在其之前触发即可
2.PFC触发不能过晚,要保证网络无丢包
t f l i g h t t_{flight} tflight表示启用PFC后到PFC完全作用后这一段时间内进入buffer的数据量
t P F C t_{PFC} tPFC表示触发PFC的队列长度阈值,假设交换机有 n n n个出端口, B B B为总buffer大小, s s s为已占用buffer大小,则有:
t P F C ≤ ( B − 8 n t f l i g h t − s ) / 8 n , t_{PFC}\le (B-8nt_{flight}-s)/8n, tPFC≤(B−8ntflight−s)/8n,
但实际情境下当Buffer仍有较多空余,随着出端口不断转发,我们不需要过早地触发PFC,所以:
t P F C ≤ β ( B − 8 n t f l i g h t − s ) / 8 , t_{PFC}\le \beta(B-8nt_{flight}-s)/8, tPFC≤β(B−8ntflight−s)/8,
t E C N t_{ECN} tECN表示触发ECN的队列长度阈值,显然 s ≤ n t E C N s\le nt_{ECN} s≤ntECN
又由于PFC要在ECN之后触发,所以:
t P F C ≥ n t E C N , t_{PFC}\ge nt_{ECN}, tPFC≥ntECN,
最终可以得到:
t E C N < β ( B − 8 n t f l i g h t ) / ( 8 n ( β + 1 ) ) t_{ECN}<\beta(B-8nt_{flight})/(8n(\beta+1)) tECN<β(B−8ntflight)/(8n(β+1))
一些特点
CNP generation
一段时间内只会发送一个CNP,并且与RTT无关,所以对反向链路拥塞不敏感
Rate based congestion control
基于rate的CC比基于窗口的CC更加细粒度且更容易实现
The need for PFC
由于一开始以满速率发送,所以不使用PFC仍会造成大量丢包,故DCQCN须与PFC搭配使用