- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux_QOS(TC)_功能實现分析
linux QOS 功能实现分析
在传统的TCP/IP网络的路由器中,所有的IP数据包的传输都是采用FIFO(先进先出),尽最大努力传输的处理机制。在早期网络数据量和关键业务数据不多的时候,并没有体现出非常大的缺点,路由器简单的把数据报丢弃来处理拥塞。但是随着计算机网络的发展, 数据量的急剧增长,以及多媒体,VOIP数据等对延时要求高的应用的增加。路由器简单丢弃数据包的处理方法已经不再适合当前的网络。单纯的增加网络带宽也不能从根本上解决问题。所以网络的开发者们提出了服务质量的概念。概括的说:就是针对各种不同需求,提供不同服务质量的网络服务功能。提供QoS能力将是对未来IP网络的基本要求。Linux内核对QoS的支持
Linux内核网络协议栈从2.2.x开始,就实现了对服务质量的支持模块。具体的代码位于net/sched/目录。在Linux里面,对这个功能模块的称呼是Traffic Control ,简称TC。HOOK是Linux实现netfilter的重要手段,数据从接收到转发得通路上有5个HOOK点,每个HOOK点有若干个挂钩处理函数
(typedef unsigned int nf_hookfn(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out,
int (*okfn)(struct sk_buff *))。对于入口数据部分的控制,LINUX 中挂载的HOOK点如下
/* after ipt_filter */
static struct nf_hook_ops ing_ops = {
.hook = ing_hook,
.owner = THIS_MODULE,
.pf = PF_INET,
.hooknum = NF_IP_PRE_ROUTING,
.priority = NF_IP_PRI_FILTER + 1,
};
Ingress policing用的是NF_IP_PRE_ROUTING这个HOOK点,其挂钩处理函数用的是net/sched/sch_ingress.c ing_hook()。函数处理流程如下所示:
接收数据包的过程中,通过软中断调用net_rx_action()将硬件层得到的数据传输到IP层。
ip_rcv() #net/ipv4/ip_input.c 丢弃校验和不正确的ip包。
nf_hook_slow()#net/core/netfilter.c。
nf_iterate() #net/core/netfilter.c。
ing_hook() 4#net/sched/sch_ingress.c。
QoS:如果设置了qdisc_ingress,则调用ingress_dequeue(),此处可以对流量进行限制#net/sched/sch_ingress.c 。
ip_rcv_finish()#net/ipv4/ip_input.c(sch_ingress.c 的enqueue()有限流制作用,然而dequeue()却是空函数。)。
以下路由:ip_route_input() #net/ipv4/route.c 。
如果转发ip_route_input_slow() #net/ipv4/route.c,如果本地处理 ip_route_input_mc() #net/ipv4/route.c 。
2.0 流出数据包的控制
首先我们了解一下Linux网络协议栈在没有TC模块时发送数据包的大致流程。如图1。从上图可以看出,没有TC的情况下,每个数据包的发送都会调用dev_queue_xmit,然后判断是否需要向AF_PACKET协议支持体传递数据包内容,最后直接调用网卡驱动注册的发送函数把数据包发送出去。发送数据包的机制就是本文开始讲到的FIFO机制。一旦出现拥塞,协议栈只是尽自己最大的努力去调用网卡发送函数。所以这种传统的处理方法存在着很大的弊端。
为了支持QoS,Linux的设计者在发送数据包的代码中加入了TC模块。从而可以对数据包进行分类,管理,检测拥塞和处理拥塞。为了避免和以前的代码冲突,并且让用户可以选择是否使用TC。内核开发者在上图中的两个红色圆圈之间添加了TC模块。net/core/dev.c: dev_queue_xmit函数中略了部分代码:
int dev_queue_xmit(struct sk_buff *skb)
{
……………….
q = dev-qdisc;
if (q-enqueue) {
/*如果这个设备启动了TC,那么把数据包压入队列*/
您可能关注的文档
最近下载
- 2025至2030全球及中国普拉提和瑜伽馆行业市场深度研究及发展前景投资可行性分析报告.docx VIP
- 极速60秒.ppt VIP
- 中国宠物行业白皮书.doc VIP
- 项目插花艺术-全校公选课.doc VIP
- 极速60秒的图片.ppt VIP
- 展频IC规格书之 SSDCI1108AF _REV3.1.pdf VIP
- 2024 CCF非专业级别软件能力认证(CSP-S)第一轮真题.pdf VIP
- TCFNA6104-2022 食品安全-月桂叶(香叶).pdf VIP
- 人美版(2024)小学美术一年级上册《欢快流畅的线》教学设计 .pdf VIP
- 三水平立井多绳摩擦式提升机提升钢丝绳更换安全技术措施:.doc VIP
文档评论(0)