本节旨在介绍骨干路由,它通常涉及小于 100 兆比特的带宽,这需要与您家中的 ADSL 调制解调器不同的方法。
互联网上路由器队列的正常行为称为尾部丢弃(tail-drop)。尾部丢弃的工作原理是将数据包排队到一定量,然后丢弃所有“溢出”的流量。这非常不公平,并且还会导致重传同步。当发生重传同步时,来自已满路由器的突然丢包爆发将导致延迟的重传爆发,这将再次过度填充拥塞的路由器。
为了应对链路上的瞬时拥塞,骨干路由器通常会实现大型队列。不幸的是,虽然这些队列有利于吞吐量,但它们会大大增加延迟,并导致 TCP 连接在拥塞期间表现得非常突发。
尾部丢弃的这些问题在互联网上变得越来越麻烦,因为网络不友好型应用程序的使用正在增加。Linux 内核为我们提供了 RED,它是 Random Early Detect(随机早期检测)的缩写,也称为 Random Early Drop(随机早期丢弃),因为它就是这样工作的。
RED 并非解决所有问题的灵丹妙药,不恰当地未能实现指数退避的应用程序仍然会获得不公平的带宽份额,但是,使用 RED,它们不会对其他连接的吞吐量和延迟造成太大的损害。
RED 在统计上会在数据流达到其硬性限制之前丢弃数据包。这使得拥塞的骨干链路能够更平缓地减速,并防止重传同步。通过允许一些数据包更快地被丢弃,保持队列大小较小并将延迟控制在较低水平,这也有助于 TCP 更快地找到其“公平”速度。从特定连接丢弃数据包的概率与其带宽使用率成正比,而不是与其传输的数据包数量成正比。
对于骨干网络来说,RED 是一个很好的队列,在骨干网络中,您无法承担公平队列所需的每会话状态跟踪的复杂性。
为了使用 RED,您必须确定三个参数:Min(最小值)、Max(最大值)和 burst(突发)。Min 设置开始丢弃之前的最小队列大小(以字节为单位),Max 是算法尝试保持低于的软性最大值,而 burst 设置可以“突发通过”的最大数据包数量。
您应该通过计算您希望的最高可接受的基本排队延迟,并将其乘以您的带宽来设置 min。例如,在我的 64kbit/s ISDN 链路上,我可能想要 200 毫秒的基本排队延迟,所以我将 min 设置为 1600 字节。将 min 设置得太小会降低吞吐量,而设置得太大则会降低延迟。在慢速链路上设置较小的 min 并不能替代减小 MTU 以改善交互响应。
您应该使 max 至少是 min 的两倍,以防止同步。在具有较小 Min 值的慢速链路上,将 max 设置为 min 的四倍或更多倍可能是明智的。
Burst 控制 RED 算法如何响应突发。Burst 必须设置得大于 min/avpkt。经过实验,我发现 (min+min+max)/(3*avpkt) 工作良好。
此外,您需要设置 limit(限制)和 avpkt(平均数据包大小)。Limit 是一个安全值,当队列中有 limit 字节后,RED 会“变成”尾部丢弃。我通常将 limit 设置为 max 的八倍。Avpkt 应该是您的平均数据包大小。在具有 1500 字节 MTU 的高速互联网链路上,1000 工作正常。
阅读 Sally Floyd 和 Van Jacobson 撰写的关于 RED 队列的论文,以获取技术信息。