文章信息
R. R. Kompella, K. Levchenko, A. C. Snoeren, and G. Varghese, “Every microsecond counts: tracking fine-grain latencies with a lossy difference aggregator,” in ACM SIGCOMM Computer Communication Review, 2009, vol. 39, pp. 255–266.
文章内容概述
本文描述了一个网络延迟的测量方案 LDA (Lossy Difference Aggregator). 它的应用场景是测量一个数据流经过两个网络节点的时候这个数据流中的数据包所经历的平均延迟. 首先, 它假设这两个网络节点的时钟已经进行了同步, 因此一个数据包经过这两个网络节点的时候这两个网络节点的本地时间的差值便是这个数据包所经历的传输延迟. 此外, 本文也没有考虑一个数据流中的数据包可能会存在乱序的情况, 但是它考虑了数据包丢失的情况.
LDA的框架很简单. 我们在网络节点A和B分别维护了一对计数器. 我们将这对计数器称为
S
S
S和
T
T
T. 我们以周期为单位进行网络延迟的测量. 本文中推荐的测量周期的长度为1秒. 当一个测量周期开始的时候, 网络节点A会给网络节点B发送一个开始消息. 当网络节点A发出了这个开始消息以后, 它就会开始对它发送给B的数据包进行记录. 具体而言, 它会将更新
S
S
S和
T
T
T如下:
S
←
S
+
1
,
T
←
T
+
τ
S\gets S + 1, T \gets T + \tau
S←S+1,T←T+τ
其中,
τ
\tau
τ是A的当前时间. 也就是说, 在网络节点A,
S
S
S记录了它发送个B的数据包的个数,
T
T
T记录了这些数据包发出的时间之和. 当测量周期结束的时候, 它就会给B发送一个结束消息, 同时把它本地的计数器嵌入到结束消息中.
在网络设备B一侧, 当它受到一个开始消息的时候, 就说明一个新的测量周期已经开始了, 因此它开始对数据包进行统计. B对数据包进行统计的方法和A是一样的, 即它会维护两个计数器 S S S和 T T T, 分别用于维护这个测量周期之内它收到数据包的总数和收到这些数据包时候的本地时间之和. 最后, 当B收到一个结束消息的时候, 它就会从中提取出A的计数器 S S S和 T T T, 并结合它自己的计数器的值来估计网络延迟.
假设A的计数器分别为
S
A
S_A
SA和
T
A
T_A
TA, B的计数器分别为
S
B
S_B
SB和
T
B
T_B
TB. 在理想的情况下, 网络中不会出现丢包, 因此
S
A
=
S
B
S_A = S_B
SA=SB. 所以我们可以估计网络延迟如下:
(
T
B
−
T
A
)
/
S
A
=
(
T
B
−
T
A
)
/
S
B
(T_B - T_A)/S_A = (T_B - T_A)/S_B
(TB−TA)/SA=(TB−TA)/SB
但是如果网络中出现丢包, 即 S A ≠ S B S_A \neq S_B SA=SB, 则以上所述的估计网络延迟的方式就不再使用. 为应对网络丢包的情况, LDA分别讨论了从特殊到一般的三种情况并提出了相应地测量策略. 以下我们将会对着三种情况以及相应地策略进行简要的介绍.
只有1个丢包
如果网络中仅存在少量丢包的情况, 比如网络中只有一个数据包丢失, 那我们可以把从A到B的数据流分成
m
m
m个小流, 每个小流分别用一对独立的计数器进行技术. 比如, 我们在每个网络节点都维护一个计数器的序列,
[
(
S
1
,
T
1
)
,
⋯
,
(
S
m
,
T
m
)
]
[(S_1, T_1), \cdots, (S_m, T_m)]
[(S1,T1),⋯,(Sm,Tm)]. 当一个数据包到达的时候, 我们就把更新计数器如下:
S
i
←
S
i
+
1
,
T
i
←
T
i
+
1
S_i \gets S_i + 1, T_i \gets T_i + 1
Si←Si+1,Ti←Ti+1
其中
i
=
h
(
p
k
t
)
%
m
i=h(pkt)\%m
i=h(pkt)%m,
h
h
h是一个哈希函数, 可以把数据包随机哈希到一个正整数.
因为网络中只有一个丢包, 所以这个丢包只会导致一对计数器不可用, 而 m − 1 m-1 m−1对计数器依然可用. 我们将可用的 m − 1 m-1 m−1对计数器进行聚合, 便可以得到一个非常接近真实网络延迟的值.
丢包频率已知
当网络中存在大量丢包的时候, 我们仍然在每个网络节点处都维护 m m m对计数器, 但是为了避免大量的丢包使得 m m m对计数器都不可用, 我们需要对数据包进行采样, 并根据采样成功的数据包对计数器进行更新. 假设在测量周期内丢包数目 L L L为已知, 则我们的采样频率应该设为 Θ ( m L ) \Theta(\frac{m}{L}) Θ(Lm). 不妨设我们的采样频率为 p < m L p < \frac{m}{L} p<Lm, 则我们采样的数据包中丢失的个数 (即被A记录而没有被B记录的数据包个数)为 p L < m pL < m pL<m. 因此, 我们的 m m m对计数器中, 至少有一对计数器在A和B上的具有相同的 S S S. 因此, 我们仍然能够估计网络的延迟.
丢包频率未知
在实际的网络测量中, 最常见的情况应该是数据包的丢包频率未知. 在这种情况下, 我们可以使用若干组 (比如2组)计数器, 每组计数器包含 m m m对计数器. 每组计数器都对应于不同的采样频率, 而在一组计数器之内, 一个数据包映射到这些计数器的概率相等. 比如我们有 t t t组计数器, 一个数据包被映射到这些组计数器的概率分别为 1 2 1 , ⋯ , 1 2 t \frac{1}{2^1}, \cdots, \frac{1}{2^t} 211,⋯,2t1. 具体实现的过程中, 我们可以将这个数据包映射到一个32为的正整数, 然后用前 t t t为表示这个数据包应该被映射到哪组计数器, 并用后 32 − t 32-t 32−t位表示应该将这个数据包映射到被选定计数器组中的那个位置. 比如, 如果正整数的前 t t t位开头有 i i i个0, 0 ≤ i ≤ t − 1 0 \le i \le t-1 0≤i≤t−1, 则我们将这个数据包映射到第 i + 1 i + 1 i+1组计数器.
这篇文章还提出对个数据包的延迟的方差进行估计的方法, 因为数据包的延迟的方差和网络的抖动 (jitter)密切相关, 但是我暂且把这部分内容放一放, 之后如果有必要再回头仔细研究.