TCP Vegas 收敛性与吞吐

昨天下班路上发个朋友圈:
在这里插入图片描述
TCP Vegas 算法作为一个 Delay-based 算法,与 Loss-based 算法的处理完全不同。由于 Delay 并非明确信号,无法找到触发 AIMD 的时机。Vegas 采用 AIAD。

Vegas 思想相当极简:

  • 当排队尚未严重到一定程度,AI 递增 cwnd。
  • 当排队严重到一定程度,AD 递减 cwnd。

论文:https://cseweb.ucsd.edu/classes/wi01/cse222/papers/brakmo-vegas-jsac95.pdf

AIAD 是不收敛的,Vegas 为何收敛呢?关键在于 “一定程度”,这 “排队到一定程度” 并非固定事件,它随 Buffer 的使用及多条流分别占用 Buffer 的比例而变化。

本文先证明 Vegas 收敛性,再针对 Linux Vegas 实现做一个优化,斧正由于 Linux 内核拥塞状态机框架的局限而导致的带宽利用率损失。

先看收敛性。

设流 i 窗口为 Wi,带宽为 bi,固定传播时延 r,队列中的数据量为 Bi,排队时延 Di,则:

W i = B i + b i ∗ r W_i=B_i+b_i∗r Wi=Bi+bir

b i = W i R i = W i D i + r b_i=\dfrac{W_i}{R_i}=\dfrac{W_i}{D_i+r} bi=RiWi=Di+rWi

现推导两条流的收敛情况。由于共享 Buffer,两条流的排队时延是相同的,设 D = Di,则:

b i = W i D + r b_i=\dfrac{W_i}{D+r} bi=D+rWi

此外,两条流共享带宽,且带宽利用率 100%,设总带宽为 1,则:

b 1 + b 2 = W 1 D + r + W 2 D + r = 1 b_1+b_2=\dfrac{W_1}{D+r}+\dfrac{W_2}{D+r}=1 b1+b2=D+rW1+D+rW2=1

给定任意 W1 和 W2,均可求的 b1,b2,进而求得 B1,B2。
把满足以下条件的所有点 P(W1, W2)描成线:
L1: α = B 1 \alpha=B_1 α=B1
L2: β = B 1 \beta=B_1 β=B1
L3: α = B 2 \alpha=B_2 α=B2
L4: β = B 2 \beta=B_2 β=B2

即下图:
在这里插入图片描述
下面看为什么 L1~L4 是双曲线形式。
通过 Vegas 稳定条件 α ≤ D i f f = W ∗ ( R r − 1 ) ≤ β \alpha\le Diff=W*(\dfrac{R}{r}-1)\le\beta αDiff=W(rR1)β 构造等式:

α = W ∗ ( R r − 1 ) \alpha=W*(\dfrac{R}{r}-1) α=W(rR1)

可得:

W = α ∗ r R − r W=\alpha * \dfrac{r}{R-r} W=αRrr

写出 W1 的表达式,并用 W2 的表达式表示 R:

W 1 = α ∗ r W 2 b 2 − r W_1=\alpha * \dfrac{r}{\dfrac{W2}{b_2}-r} W1=αb2W2rr

看一下 W 和 b 的大致关系,如果 W 和 W/b 之间正相关,W1 和 W2 则构成一条大致双曲线,就能看出 L1~L4 就是那个样子。

显然,D 是 W 的增函数: D = f ( W ) D=f(W) D=f(W),根据 b 和 W 的关系 b = W D + r = W f ( W ) + r b=\dfrac{W}{D+r}=\dfrac{W}{f(W)+r} b=D+rW=f(W)+rW,两边同时除以 b:

W b = f ( W ) + r \dfrac{W}{b}=f(W)+r bW=f(W)+r

可见,W 和 W/b 正相关(另一种解释是,W 占比越大,b 的加速比越小)。于是 W 1 = F ( W 2 ) W_1=F(W_2) W1=F(W2) 大致就是一条双曲线。

最终,很显然,对于流 1,Vegas 的稳定状态要求 W1 在 L1 和 L2 之间,对于流 2,Vegas 的稳定状态要求 W2 在 L3 和 L4 之间,图中 1 和 2 的区域即收敛区域。

这个区域围绕在公平线两边,说明 Vegas 是收敛的。

这张图的结论如下:

  • 带宽利用率 100%。
  • 稳定收敛到公平。

看起来不错,高效又公平,剩下的工作就是在各种场景下调参,找到最优的 α , β 。

这意味着 Vegas 不需要 AIMD。但对于 Linux Vegas 实现,在 4.9 内核前,却避不开 AIMD。

Linux 4.9 之前,TCP 内置的拥塞状态机对拥塞控制算法的假设是 Loss-based,在 Recovery 状态,prr 算法无条件将 cwnd 退避到 ssthresh。

直到 BBR 引入 cong_control 回调完全接管拥塞状态机,一切才高尚。既然 Delay-based Vegas 已经自行完成了收敛,AIMD 岂不多余?

Delay-based Vegas 既然用 Delay 变化控制拥塞,理想情况下即无拥塞,否则 Vegas 即失效,因此,丢包一定不是拥塞导致,执行守恒足够了。

改个移除 AIMD 的版本:
https://github.com/marywangran/tcp-vegas-plus

这是一个朴素的 Vegas,但真实。核心有三个:

  • cong_control 全权接管拥塞状态机处理。
  • RTO 后需 reset 掉 minRTT。RTO 需很久,Fast Retransmit 和 TLP Retransmit 均未触发,可能遭遇了路由重收敛。
  • 发生丢包时,在 Recovery 阶段执行数据包守恒。

跟我上周的 caohejing 算法类似,caohejing 算法也一样需要调参,比如 5% 增益和减损阈值。不同的是 caohejing 算法是 Rate-based,丢包会反馈在 Delivery rate ,自动收敛。Vegas 还是 ACK 驱动,Recovery 状态需主动执行守恒。

Delay-based Vegas 的 AIAD 可以收敛吗?可以。Vegas 需要丢包时 MD 吗?不需要。为什么代码里看起来需要 MD 呢?因为 Linux TCP 拥塞控制框架的局限,以及实现者趋向保守。那么 Vegas 面临丢包时需要如何做呢?执行数据包守恒即可。 这鞋子能跳舞吗?呱唧,呱唧,啪!不一般,我喜欢,日泰皮鞋!

浙江温州皮鞋湿,下雨进水不会胖。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值