网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Java Applet 入门(目录).
.weblogic使用JMX监控应用程序内、.
.[java技术] Java常用术语解释.
.Java性能优化.
.工欲善其事,必先利其器之easymo.
.用 Apache JMeter 测试 WebSpher.
.优化Java动画编程中的显示效果.
.《Java 手机/PDA 程序设计入门》.
.作为一个初学者如何开发第一个 B.
.Java编程交互管理工具:SecureJS.
.初识JINI技术.
.sqlserver在JAVA中的应用.
.Struts用户指南.
.使用JAVA技术实现文件的上传.
.Java桌面应用程序设计新贵:SWT .
.优秀IT书籍下载集锦100本.
.继承初始化.
.JavaApplet编程之实现显示图像.
.Java算术运算符.
.Function 对象.

Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现

发表日期:2008-1-5


 

祝顺民

2003 年 6 月 15 日

本文描述了Linux 2.4.x内核中对QoS支持的设计与实现,并且对缺省的数据包调度机制PFIFO进行了具体的分析。

在传统的TCP/IP网络的路由器中,所有的IP数据包的传输都是采用FIFO(先进先出),尽最大努力传输的处理机制。在早期网络数据量和要害业务数据不多的时候,并没有体现出非常大的缺点,路由器简单的把数据报丢弃来处理拥塞。但是随着计算机网络的发展, 数据量的急剧增长,以及多媒体,VOIP数据等对延时要求高的应用的增加。路由器简单丢弃数据包的处理方法已经不再适合当前的网络。单纯的增加网络带宽也不能从根本上解决问题。所以网络的开发者们提出了服务质量的概念。概括的说:就是针对各种不同需求,提供不同服务质量的网络服务功能。提供QoS能力将是对未来IP网络的基本要求。

1.Linux内核对QoS的支持

Linux内核网络协议栈从2.2.x开始,就实现了对服务质量的支持模块。具体的代码位于net/sched/目录。在Linux里面,对这个功能模块的称呼是Traffic Control ,简称TC。

首先我们了解一下Linux网络协议栈在没有TC模块时发送数据包的大致流程。如图1。
Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现(图一)

注:上图的分层是按照Linux实现来画,并没有严格遵守OSI分层

从上图可以看出,没有TC的情况下,每个数据包的发送都会调用dev_queue_xmit,然后判定是否需要向AF_PACKET协议支持体传递数据包内容,最后直接调用网卡驱动注册的发送函数把数据包发送出去。发送数据包的机制就是本文开始讲到的FIFO机制。一旦出现拥塞,协议栈只是尽自己最大的努力去调用网卡发送函数。所以这种传统的处理方法存在着很大的弊端。

为了支持QoS,Linux的设计者在发送数据包的代码中加入了TC模块。从而可以对数据包进行分类,治理,检测拥塞和处理拥塞。为了避免和以前的代码冲突,并且让用户可以选择是否使用TC。内核开发者在上图中的两个红色圆圈之间添加了TC模块。(实际上在TC模块中,发送数据包也实现对AF_PACKET协议的支持,本文为了描述方便,把两个地方的AF_PACKET协议处理分开来了)。

下面从具体的代码中分析一下对TC模块的支持。

net/core/dev.c: dev_queue_xmit函数中略了部分代码:


int dev_queue_xmit(strUCt sk_buff *skb)
{
……………….
    q = dev->qdisc;
    if (q->enqueue) {
	   /*假如这个设备启动了TC,那么把数据包压入队列*/
        int ret = q->enqueue(skb, q);
	   /*启动这个设备发送*/
        qdisc_run(dev);
        return;
    }
    if (dev->flags&IFF_UP) {
………….
                if (netdev_nit)
                    dev_queue_xmit_nit(skb,dev);
				/*对AF_PACKET协议的支持*/
                if (dev->hard_start_xmit(skb, dev) == 0) {
				/*调用网卡驱动发送函数发送数据包*/
                    return 0;
                }
            }
………………
}

从上面的代码中可以看出,当q->enqueue为假的时候,就不采用TC处理,而是直接发送这个数据包。假如为真,则对这个数据包进行QoS处理。


Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现(图二)
Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现(图三) Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现(图三)
Linux 2.4.x 网络协议栈QoS模块(TC)的设计与实现(图四)
回页首


上一篇:Jetspeed开发文档2 人气:949
下一篇:ITS-CMS 2.0 URL设计构想 人气:562
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐