篇首语
- 本篇文章是我发布的首篇博客,有点小激动,如有不当之处欢迎大佬们指正。都说发博客只有一次和无数次,我希望把握好这个契机,从今以后努力学习研究,写出更多有用的资料与大家共享。
- Copa 篇分为四个部分,前三部分为论文分析,分别是机制概述、机制合理性证明、实验实战检验,第四部分则为本人的一些归纳与推演,应该可以说是全网最全的长文了,干货满满,希望大家喜欢!
目标速率
λ
t
=
1
δ
⋅
d
q
\lambda_t = \frac{1}{\delta \cdot d_q}
λt=δ⋅dq1
由 $ U = log \lambda - \delta log d $ 推出(最大化U)
- λ \lambda λ 表示流的平均吞吐量
-
d
d
d 表示各包时延(
d
=
d
t
o
t
a
l
−
d
p
r
o
p
d = d_{total} - d_{prop}
d=dtotal−dprop)
- d q d_q dq 表示各包排队时延( d q = d − d t r a n s d_q=d-d_{trans} dq=d−dtrans)
- δ \delta δ 实际表示愿意牺牲低时延到什么程度以保障高带宽,越高表示越不愿意牺牲时延
注意:
- δ − 1 \delta ^ {-1} δ−1 单位是MTU大小的数据包数量
- λ t \lambda_t λt 是根据一个RTT前发出的包带回的参数计算的 d q d_q dq 来估算得出的,因此具有一个 RTT 的延迟
参数测算机制
每个时间窗口 τ = s r t t / 2 \tau=srtt/2 τ=srtt/2 测算以下参数:
RTT
R T T s t a n d i n g RTTstanding RTTstanding
- 取最小的RTT,作为时间窗口内估计的包对应内含排队时延的RTT值,这样选是为了保障面对 ACK compresion 和 network jitter 时的鲁棒性。
- 因为这些问题会增加 RTT 而让发送端误以为数据传输路径上存在排队导致更长的 RTT;
- 当然,ACK compresion 可由反向路径上的排队和无线链路引起。
- s r t t srtt srtt 是标准平滑RTT估计值,使用标准TCP指数加权移动平均估计量的当前值
每个 ACK 到达时测算以下参数:
发送速率(平均意义上)
λ = c w n d R T T s t a n d i n g \lambda = \frac{cwnd}{RTTstanding} λ=RTTstandingcwnd
- c w n d cwnd cwnd是时间窗口,用以限制 in-flight packets 的数量上限
Copa 使用了 pacing 技术以防止 packet bursts,并且保证瓶颈处包到达呈现泊松分布(流越多越精确)
- r a t e p a c i n g = 2 ⋅ c w n d R T T s t a n d i n g rate_{pacing} = 2 \cdot \frac{cwnd}{RTTstanding} ratepacing=2⋅RTTstandingcwnd (单位是 pkt per sec)
- 设置为 λ \lambda λ 的两倍是为了为 pacing 中的不完美提供容纳空间,如果正好等于 λ \lambda λ 则实际上发送速率会比预期更低。
排队时延
d q = R T T s t a n d i n g − R T T m i n d_q = RTTstanding - RTTmin dq=RTTstanding−RTTmin
-
R
T
T
m
i
n
RTTmin
RTTmin 是在较长的一段时间周期内的最小的RTT观测量,文中选取的时间周期为10秒
- 因为这是流启动的时间,并且也是处理路径改变可能导致的路径最小RTT改变的问题的时间。
速度控制机制
默认模式:动态调整拥塞窗口以调节速度
流启动时的慢启动机制,每个 RTT 执行:
- 每个 RTT 倍增 cwnd 直到 λ ≥ λ t \lambda \geq \lambda_t λ≥λt
虽然 v v v 也允许倍增,但这个常数太小了,因此 Copa 采用显示慢启动以保证 Copa 有一个更大的初始 cwnd
每个 ACK 到达时执行:
- 更新 s r t t srtt srtt ,如果是一个时间窗口的结束,则更新 d q d_q dq、 R T T s t a n d i n g RTTstanding RTTstanding
- 更新 λ t \lambda_t λt ,计算当前 λ \lambda λ
-
c
w
n
d
cwnd
cwnd 调整方案
- 如果 λ ≤ λ t \lambda \leq \lambda_t λ≤λt ,则 c w n d + = v δ ⋅ c w n d cwnd += \frac{v}{\delta \cdot cwnd} cwnd+=δ⋅cwndv
- 如果 λ > λ t \lambda \gt \lambda_t λ>λt ,则 c w n d − = v δ ⋅ c w n d cwnd -= \frac{v}{\delta \cdot cwnd} cwnd−=δ⋅cwndv
注:经过一个RTT(发送完一个 c w n d cwnd cwnd 的量的数据包) c w n d cwnd cwnd 变化 v δ ⋅ c w n d \frac{v}{\delta \cdot cwnd} δ⋅cwndv
-
v
&
d
i
r
e
c
t
i
o
n
v \& direction
v&direction 调整方案(
v
v
v 是速率参数,用以加速收敛,初始为1;
d
i
r
e
c
t
i
o
n
direction
direction 表征判断窗口变化方向,用以调整
v
v
v)
- 如果是一个拥塞窗口的结束(即每一个RTT),则判断当前 c w n d cwnd cwnd 大小和上一 c w n d cwnd cwnd 大小,如果增大,则 d i r e c t i o n direction direction 设置为 u p up up ,否则设置为 d o w n down down 。
- 如果 d i r e c t i o n direction direction 保持三个 RTT 不变,则将 v v v 翻一倍,否则重新设置为 1
在稳定状态下保证 v = 1 v = 1 v=1 ,而在非稳定状态下加速发送速率收敛
竞争模式:动态调整 δ \delta δ 以与缓冲挤占型算法竞争
在默认模式下 δ = 0.5 \delta = 0.5 δ=0.5,而竞争模式下 δ ≤ 0.5 \delta \leq 0.5 δ≤0.5 ,并且动态调整以匹配典型缓冲挤占型算法的烈度
根据 δ \delta δ 的含义,这实际上是 Copa 在面对缓冲挤占型竞争对手时愿意牺牲低时延以保障高吞吐量。
- Copa 不断侦测缓冲挤占型竞争对手的存在,以控制默认模式和竞争模式的切换
侦测方案(模式转换器)
- 这里利用了 Copa 的一个关键特性——当多条有相近 RTT 的 Copa 流共享一个瓶颈时,队列每5个RTT会清空一次,而与缓冲挤占型队列共存时则队列不会依次规律清空。
- 因此侦测方案的核心在于检测 5RTT 内的队列是否清空
- 判断标准:(第五个RTT)是否存在排队时延低于(前四个RTT)速率振荡值的10%
d q < 0.1 ⋅ ( R T T m a x − R T T m i n ) d_q \lt 0.1 \cdot (RTTmax - RTTmin) dq<0.1⋅(RTTmax−RTTmin)- RTTmax 指的是前四个RTT测量值中的最大值。这使得 Copa 可以依据当前网络短时的 RTT 振荡差额准确估量“几乎清空”这个概念
- 采取行动:侦测到对应流,则使 Copa 处于竞争模式,否则使 Copa 处于默认模式。
作者承认可能因为种种原因出现误判(误判存在或不存在)
- 判断标准:(第五个RTT)是否存在排队时延低于(前四个RTT)速率振荡值的10%
竞争方案
- 调整
δ
−
1
\delta^{-1}
δ−1 以模拟相应的缓冲挤占型流
- 论文作者实现的方案是依据丢包情况使用 AIMD 方式调整 δ − 1 \delta^{-1} δ−1