drop-tail队列管理分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Tail Drop队列管理算法分析
赵俊安 09053119
1.Tail Drop 算法概要
传统的 Internet 路由器用 Tail Drop 策略来进行队列管理,如果输出端缓存产生溢出,则丢弃到达的包。

Tail Drop 不需要选择丢弃的包,只是在系统没有空闲缓存时丢弃到达的包。

也不需要保留任何与用户流相关的状态信息。

从拥塞控制的角度看,它仅仅是一种拥塞恢复机制。

虽然在 Internet 上工作了许多年,但始终存在三个严重缺陷:持续满队列、业务流全局同步、业务流对缓存死锁。

随后又出现了“首丢弃”及“随机丢弃”策略, 但始终没有解决持续满队列问题。

2.Tail Drop 实现原理
当路由器队列长度达到最大值时,通过丢包来指示拥塞,先到达路由器的分组首先被传输。

由于路由器缓存有限,如果包到达时缓存已满,那么路由器就丢弃该分组。

一旦发生丢包,发送端立即被告知网络拥塞,从而调整发送速率。

3.对ns中drop tail相关源码分析
ns中关于drop tail的实现代码是ns-版本号目录下queue子目录的drop-tail.h和 。

drop-tail.h头文件定义DropTail类,实现该类的功能。

在drop-tail.h :
class DropTail : public Queue {
public:
DropTail() {
q_ = new PacketQueue;
pq_ = q_;
bind_bool("drop_front_", &drop_front_);
bind_bool("summarystats_", &summarystats);
bind_bool("queue_in_bytes_", &qib_); // boolean: q in bytes?
bind("mean_pktsize_", &mean_pktsize_);
// _RENAMED("drop-front_", "drop_front_");
}
~DropTail() {
delete q_;
}
protected:
void reset(); //重置队列
int command(int argc, const char*const* argv);
void enque(Packet*); //进入队列
Packet* deque(); //出队列
void shrink_queue(); // To shrink queue and drop excessive packets. 缩小队列和丢弃过多的数据包
PacketQueue *q_; /* underlying FIFO queue */
int drop_front_; /* drop-from-front (rather than from tail) */从队列前项丢包标志
int summarystats; //队列概要状态信息标志,用于判断是
否打印队列概要状态信息
void print_summarystats();//打印队列概要状态信息
int qib_; /* bool: queue measured in bytes? */ //以字节计算队列标志
int mean_pktsize_; /* configured mean packet size in bytes */ //平均包的大小用于计算队列的大小
};
对drop tail队列操作有
1.void enque(Packet*); 进队列操作
该操作为先根据summarystats判断是否更新队列的信息。

然后计算队列限制大小qlimbytes,判断是否满队列,是,根据drop—front
变量标记选择从队列还是从队尾丢弃包。

否,将包进入缓冲队列中。

2.Packet* deque(); 出队列操作
该操作为按照队列先进先出顺序将数据包出队列。

(主要为进队列调用)
3.void shrink_queue(); 缩小队列和丢弃过多的数据包
该操作为计算现在队列的限制大小qlimBytes,通过丢弃队列的包,将队列大小缩减为qlimBytes一般大。

丢弃包可选择为队列前面丢弃和后面丢弃。

4.int command(int argc, const char*const* argv);执行队列管理命令。

通过该函数可以对队列调用
printstats,shrinkqueue,packetqueue-attach命令来管理队列。

Printstats 是打印队列状态概要信息。

shrink-queue是调用shrinkqueue函数来缩减队列到限制大小。

Packetqueue-attach 将队列与tcl命令相关联。

总结:
Drop Tail仍是目前Internet使用最为广泛的分组排队、丢弃的方式。

这种方式将拥塞控制的责任都推给网络边缘。

所以TCP假定网络中的路由器对拥塞控制不起任何作用,而独自承担检测和响应拥塞的全部责任。

本文主要是通过drop tail源码解读该队列管理机制是怎么实现的。

Drop tail虽然不是最优的队列管理算法,但是使用范围最大的,了解它的实现,是很有必要的。

相关文档
最新文档