当前位置: 首页 > news >正文

linux imq原理图,(linux内核IMQ源码实现分析.doc

(linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。

E-mail: wwwlkk@126.com

来源: /?business&aid=6&un=wwwlkk#7

linux2.6.35内核IMQ源码实现分析

(1)数据包截留并重新注入协议栈技术1

(2)及时处理数据包技术2

(3)IMQ设备数据包重新注入协议栈流程4

(4)IMQ截留数据包流程4

(5)IMQ在软中断中及时将数据包重新注入协议栈7

(6)结束语9

前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。

首先揭示IMQ的核心技术:

如何从协议栈中截留数据包,并能把数据包重新注入协议栈。

如何做到及时的将数据包重新注入协议栈。

实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。

(1)数据包截留并重新注入协议栈技术

okfn参数:

int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev){

。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。

return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,

ip_rcv_finish);//下一流程是进入函数ip_rcv_finish。

}

static inline int

NF_HOOK(uint8_t pf, unsigned int hook, struct sk_buff *skb,

struct net_device *in, struct net_device *out,

int (*okfn)(struct sk_buff *))//将ip_rcv_finish地址作为参数传入。

{

return NF_HOOK_THRESH(pf, hook, skb, in, out, okfn, INT_MIN);

}

static inline int

NF_HOOK_THRESH(uint8_t pf, unsigned int hook, struct sk_buff *skb,

struct net_device *in, struct net_device *out,

int (*okfn)(struct sk_buff *), int thresh)

{

int ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, thresh);

if (ret == 1)

ret = okfn(skb);//根据函数地址进入之前的ip_rcv_finish函数。

return ret;

}okfn应该是下一个流程函数,不应该是本流程函数,这样做就很稳定了。

IMQ设备的做法就是使用到了这个okfn,IMQ设备发送数据包不是调用网卡驱动,而是根据okfn,将数据包发给下一个流程函数。

这里函数的概念和模块的概念是一样的,一个函数就是一个模块,一个模块处理完就将数据扔给下一个模块处理,各个模块间的数据处理是互补干扰的。从这个概念看使用okfn是很合理的。(2)及时处理数据包技术

QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数据包被及时的发送出去呢?linux有一套机制来解决这个问题,下面先了解这套机制:

int dev_queue_xmit(struct sk_buff *skb)

{

。。。。。。。。。。。。。。。。。。。。。。。。。。

txq = dev_pick_tx(dev, skb);

q = rcu_dereference_bh(txq->qdisc);获得设备上的发送队列

。。。。。。。。。。。。。。。。。。。。。。。。。。

if (q->enqueue) {

rc = __dev_xmit_skb(skb, q, dev, txq);

goto out;数据包入队后,整个入队流程就结束了

}

}以上是入队过程,那么需要保证入队的数据包被及时的发送出去。

static inline int __dev_xmit_skb

相关文章:

  • rman从aix到linux跨平台恢复,利用RMAN跨平台迁移数据库
  • Linux权限分析
  • tcp连接超时断开linux,linux – FTP’ing大文件时如何防止TCP连接超时?
  • 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包
  • c语言二级指针的作用,C语言中二级指针的实例详解
  • c语言二叉搜索树程序,二叉搜索树 C语言实现
  • Baidu IoT Study
  • 对ch452芯片初始化用c语言,用C8051F020单片机的伺服阀温度零漂测控系统
  • 逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.
  • crc16 ibm c语言,CRC16常见几个标准的算法及C语言实现
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • c语言打印http协议的代码,基于http协议的C语言客户端代码
  • [poj3686]The Windy's(费用流)
  • c语言x图形界面,「分享」C语言如何编写图形界面
  • 网站访问慢体系
  • 【译】JS基础算法脚本:字符串结尾
  • 【css3】浏览器内核及其兼容性
  • 11111111
  • 78. Subsets
  • Docker下部署自己的LNMP工作环境
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • node入门
  • php ci框架整合银盛支付
  • React16时代,该用什么姿势写 React ?
  • use Google search engine
  • Vue小说阅读器(仿追书神器)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • win10下安装mysql5.7
  • 爱情 北京女病人
  • 分享几个不错的工具
  • 目录与文件属性:编写ls
  • 如何选择开源的机器学习框架?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 算法之不定期更新(一)(2018-04-12)
  • 网络应用优化——时延与带宽
  • 网页视频流m3u8/ts视频下载
  • 一天一个设计模式之JS实现——适配器模式
  • 优秀架构师必须掌握的架构思维
  • Python 之网络式编程
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # 计算机视觉入门
  • (1)(1.9) MSP (version 4.2)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (javascript)再说document.body.scrollTop的使用问题
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (待修改)PyG安装步骤
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转载)(官方)UE4--图像编程----着色器开发
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端