博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多队列网卡简介以及Linux通过网卡发送数据包源码解读
阅读量:4031 次
发布时间:2019-05-24

本文共 848 字,大约阅读时间需要 2 分钟。

摘自:http://blog.csdn.net/yanghua_kobe/article/details/7485254 

首先我们看一下一个主流多队列网卡(E1000)跟多核CPU之间的关系图:

非多队列:

linux的网卡由结构体net_device表示,一个该结构体对应一个可以调度的数据包发送队列。

数据包的实体在内核中以结构体sk_buff(skb),形如:


多队列:

一个网卡可以拥有多个队列


接下来,看看TX引擎是如何工作的(注:对于发送和接收数据包有两个名词,分别应对TX,RX)

解释:

函数-dev_queue_xmit():入队一个buffer以传输到网络驱动设备。

配合该函数的源码来解释上图的传输过程:

步骤一:可以看到如果设备支持队列,则数据包入设备队列。在入队操作前后,有加锁和释放队列锁的过程。


步骤二:调出设备的qdisc(该对象是队列的排队规则)


QDisc(排队规则)是queueingdiscipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。

步骤三:重置skb的队列映射,置为0

步骤四:tx lock->hard_start_xmit

到这里,我们好像没有看到tx_lock、hard_start_xmit函数,反而我们在无队列的设备分支中看到了这些:


Dev_hard_start_xmit的定义:


很明显我们应该拨开云雾看到一些本质,再次回到设备支持队列的分支中(这才是我们关心的):

不管怎么样,你总该有发送的函数调用吧,就是下面圈起来的这个:

果不其然,这是一个封装函数:


参考:

你可能感兴趣的文章
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
Android DataBinding使用2-Recycleview
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
关于activity保存页面状态的两个方法
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
关于let{a}=B出现的解构赋值
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>
android给文字加边框(修改不能居中的问题)
查看>>
coursesa课程 Python 3 programming course_2_assessment_1
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
coursesa课程 Python 3 programming 输出每一行句子的第三个单词
查看>>
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>