这篇文章实际上提出了两个不同的方案来测量流级别的网络延迟. 第一种方案假设数据包携带了它到达网络节点A时候的时间戳, 但是修改数据包并使其携带一个时间戳在很多情况下并不可行, 所以本文提出了第二种方案, 这种方案不要求数据包携带时间戳. 以下我们将对这两个方案进行简要的介绍.
我们维护了 R R R个哈希表, 每个哈希表对应于一个不同的哈希函数. 这些哈希表中, 每个哈希桶都包含两个域 s s s和 n n n. 当一个数据包到达网络节点A的时候, 它就会把当前时间以时间戳的形式写入数据包. 之后, 数据包到达B的时候, B就会将这个时间戳提取出来, 并用当前时间减去这个时间戳来获取一个数据包的传输延迟 τ \tau τ. 接着, B将数据包的流标识符依次映射到这 R R R个哈希表中. 对于每一个这个数据包映射到哈希桶, 我们都进行如下操作:
s ← s + τ , n ← n + 1 s \gets s + \tau, n\gets n + 1 s←s+τ,n←n+1
如下图所示.
最后, 当我们要估计一个数据流的延迟的时候, 我们将这个数据流的流标识符分别映射到这 R R R个哈希表, 这样我们就会得到 R R R个不同的哈希桶. 在这些哈希桶中, 我们选取 n n n的值最小的哈希桶, 并使用 s n \frac{s}{n} ns的方式来计算当前数据流的延迟, 具体的算法流程可见下图. 这里我们选取 n n n的值最小的哈希桶, 是因为这个哈希桶中当前数据流所占的权值最高, 所以一般情况下这个值最接近当前数据流的传输延迟.
如前所述, SDS要求每个数据包都必须携带它经过节点A时候的时间戳, 但是这在很多场景下是不可行的, 因此文章提出了一个改进的方案 LDS. 和SDS类似, 在LDS中我们也维护了