Nagle公平队列

为保护正常行为(well-behaved)的源主机流量,免受异常(badly-behaved)主机的影响,或者是在两种流量混合的网络中,确保正常行为的主机获得优于异常主机的流量服务,在RFC970中,Nagle提出了一种公平队列。

我们假设一个高带宽的LAN通过网关(交换设备)与WAN相连,LAN网络中的没有流量控制。任何主机如果发送到WAN网络的报文速率超过网关可处理的极限,将会在网关处造成拥塞。如果网关采用先入先出队列(First-In-First-Out),异常行为的主机将严重干扰正常主机的流量。

网关(报文交换设备)需引入公平处理,每个主机应当获得相等的报文交换机会。这就需要替换掉单一的先入先出队列,对于每个数据链路采用多个队列,每个队列存储一个主机的流量。这些队列以一种轮询(Round-Robin)的方式处理,依次由非空队列中取出一个报文(其生存期有效),发送此报文,如果报文生存期已过,丢弃此报文。当前的空队列将被跳过,在本次轮询中无效。

以上机制可以说是公平的,出接口带宽被平均的分配给每个主机。在每个轮询周期中,每个主机对应的队列中的报文都可被发送一个。因此,实现了一定意义上的负载均衡。

因此,对于每个主机而言,此时较优的策略不再是尽可能的发送大量的报文,而是以一定的速率进行发送,只要报文有一个报文在网关(报文交换设备)的队列中等待即可。这样,每个轮询周期中此报文都会被发送。主机的报文将获得最小的传输延迟。通常,网关队列中保存1到2个报文,对整个网络是可接收的,包括网关内存需求。

另外,主机需要从网络中获取反馈信息以优化其发送策略,当前已有的源抑制(Source Quench)机制,足够支持此功能。网关设备可在当特定主机的队列长度超过某个值(如:2)时,发送源抑制消息到主机。如果主机在接收到此消息之后,降低其发送速率,这个网络中交换设备的每个队列长度可为此在某个水平(如小于2)。

异常行为的主机可发送其想发送的所有报文,但是其占用的网络带宽并不会因此增加,这些报文将经历较长的发送延迟。异常行为的主机如果发送足够多的报文,终有一些报文在网关设备的队列中过期(假设网关内存足够大,并采用某种计时机制),这些报文将得不到发送。相比于单一的FIFO队列,采用公平队列机制,将使的异常行为主机的报文更容易发送过期,因为其对应的队列仅可获得所有主机队列发送机会中的一个,相比FIFO,更容易造成大量报文的堆积。这反过来,促使异常行为的主机规范发送行为。

但是,对于恶意的主机,其可能通过在报文中伪造不同的源地址,使网络(网关设备等)处于过载状态。其模拟大量不同的主机,来获得大部分的网络带宽。这算是一种网络攻击,并不会是偶然发生的,应作为网络安全问题处理。

虽然以上机制使得报文交换设备具有了公平性,但是,并不是整个网络都是公平的。开启此机制的设备应当放置在网络的关键通路上,比如LAN和WAN网络的连接点处。

在实现上,交换设备为每个外出接口的每个主机源创建一个单独的队列,看起来会为队列机制带来很大复杂性。但是,虽然有复杂性,但是并没有要求的那样复杂,例如使用平衡二叉树实现(balanced binary trees)。一种简单的实现是,在每个报文缓存的头部预留空间,用于存放指针,将每个主机的队列通过单链表连接。队列头部(即每个队列的第一个缓存区)通过双向链表连接,方便在某个队列空时删除整个队列。这样,对于每个报文缓存区,我们额外需要3个指针。

对于有限的缓存空间,总会面临耗尽的风险,此时,需要丢弃最长队列的尾部报文,这些报文本就是最后传输。这样为了实现公平性,就需要牺牲发送大量报文的主机的性能。

最后,如果每个队列中包含的报文大小不同,即不同的主机使用不同的报文大小,Nagle队列的公平性将不能保证。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页