两种传统的包的调度策略
在介绍Drop
FIFO (First In First Out,先进先出)
是一种经典的包调度策略,它的最大优点在于实施起来简单。FIFO又叫“先到先服务”(FCFS),即第一个到达路由器的数据包首先被传输。FIFO的问题在于在排队的时候没有考虑包的重要程度,对FIFO排队的一个简单改进是优先级排队。基本思想是给每个数据包分配一个优先级标志。这个优先级标志可以放在IP数据包内。路由器则执行多个FIFO排队。一个队列对应一个优先级。路由器在排队的时候总是给优先级高的队列先排队。在同一优先级队列中,数据包仍按FIFO排队。
公平排队算法(Fair Queue,FQ)
是FIFO的一种改进。FIFO排队的主要问题是无法区分不同的数据流。由于整个TCP的拥塞控制是在源端执行,而FIFO排队不提供约束所有数据源遵守拥塞控制的机制,这就有可能让行为不良的数据流强占大量带宽。在Internet环境中,某个应用不使用TCP协议是完全可能的。结果,它可以绕开端到端的拥塞控制机制,向路由器任意发送自己的数据包,从而引起其它应用的包被丢弃。FQ算法则解决了这个问题。在FQ算法中,路由器对每个输出线路有一个排队队列。路由器按“轮询”方式处理包。当一条线路闲时,路由器就来回扫描所有队列,依次将每队每一个包发出。当某个流的数据包到达过快时,其队列就会很快占满,属于这个流的新到的数据包就会被丢弃。采用这种方式,每个数据流就不可能牺牲其它数据流而多占资源。另外,FQ算法并没有告知源端路由器状态的机制,也就是说,FQ仍然要依赖于端到端的拥塞控制机制。它只是将数据流分隔,使不遵守拥塞控制机制的数据流不至于影响其它流。所以它在没有牺牲统计复用的情况下提供了公平性,与端到端的拥塞控制机制也可以较好地协同。
传统的队列长度管理机制是“去尾”(
Drop
基于Drop
优先级排队的主要问题是最高优先级队列能“抢占”其它所有的队列。只要高优先级队列非空,低优先级队列就得不到服务。所以,不能允许用户不受控地指定高优先级。同时,Drop
除了这些,它在具体实施过程中也存在着很多其它的弊端。如:若缓冲器很长,则每个分组所经历的延迟就会增大;而若缓冲器很短的话,又不能够适应突发性数据流;另外,全局同步的发生又将直接导致吞吐率的减小,等等。所有这些都可能引起网络崩溃。
常见的队列调度算法
先到先服务(First Come First Served)
FIFO队列实现的FCFS是Internet使用最多的一种方式,它的最大优点在于实施简单。FIFO本质上是一种“去尾”(Drop-tail)的算法,不需要选择丢弃的分组,只是在系统中没有空闲缓冲资源时丢弃到达的分组。虽然这种算法已经在Internet上成功工作了
另外,DropTail容易造成TCP全局同步(TCP
随机早期检测算法(Random Early Detection)
RED配置在路由器监视网络流量以便避免拥塞,当即将拥塞发生时,它随机丢弃进来的分组,而不是等到队列缓冲区满时才开始丢弃所有进来的分组,这样可以最少化全局同步的发生。当拥塞发生时,RED丢弃每个连接分组的概率与该连接占用的带宽成比例,它监视每个输出队列的平均队列长度,
RED算法相比DropTail的两个好处是:首先,队列缓冲总是预留了一定的缓冲空间,这样可以更好地处理突发性。其次,保持较短的队列长度,可以更好地支持实时应用。
分组公平队列(Packet Fair Queuing)
PFQ算法是基于GPS(Generalized
基于轮循的调度算法(Round Robin)
传统的RR算法对不同队列(业务流)进行无区别的循环调度服务。这样,如果不同的队列具有不同的分组长度,则分组长度大的队列可能会比分组长度小的队列接受更多的服务,使队列之间产生不公平的现象;而且,这种算法不能对业务提供时延保证。为了改进RR算法的时延特性和其在变长分组环境下的不公平性,出现了一些改进型的算法,如加权轮循WRR(Weighted
NS2集成了多种网络协议(如TCP、UDP),业务类型(如FTP、Telnet、Web等),路由队列调度算法(如Drop
被动式队列管理机制和主动式队列管理机制
(1)被动式队列管理机制——DropTail,Random
NS2仿真程序示例分析
# 设置源节点和目的节点
set src($i) [$ns node] #s($i)
set dst($i) [$ns node] #d($i)
# 仅用一句话便完成TCP联机的建立
for {set i 0} {$i<$par2} {incr i} {
set tcp($i) [$ns create-connection TCP/Reno $src($i) TCPSink $dst($i) 0]
$tcp($i) set fid_ $i
}
# 在TCP联机之上建立FTP应用程序
for {set i 0} {$i<$par2} {incr i} {
set ftp($i) [$tcp($i) attach-app FTP]
$ns at $startT($i) "$ftp($i) start"
}
该实验的目的是将被动队列管理机制DropTail和主动队列管理机制RED在吞吐量、延时、队列长度方面做比较。实验中并没有直接采用
set q_ [[$ns link $r1 $r2] queue]
set queuechan [open q-$par1-$par2.tr w]
$q_ trace curq_
if {$par1=="RED"} {
$q_ set bytes_ false
$q_ set queue_in_bytes_ false
}
$q_ attach $queuechan
我在实验中尝试将链路参数直接设定为DropTail(而非myfifo),结果提示"$q_
$ns
[$ns
至此,可以在运行时将参数给定为正常的链路类型,DropTail,FQ,RED,等,myfifo仍然可以使用。但后面用gnuplot画图
plot
而不是原来的
plot
因为新的输出文件的第1列和第5列才是所需数据。(顺便强调一下,plot命令中,using
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q
Q