linux 网卡数据包源码,多队列网卡简介以及Linux通过网卡发送数据包源码解读

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

uid-29109799-id-3842673.html

非多队列:

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

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

uid-29109799-id-3842673.html

多队列:

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

uid-29109799-id-3842673.html

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

uid-29109799-id-3842673.html

解释:

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

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

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

uid-29109799-id-3842673.html

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

uid-29109799-id-3842673.html

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

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

uid-29109799-id-3842673.html

步骤四:tx lock->hard_start_xmit

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

uid-29109799-id-3842673.html

Dev_hard_start_xmit的定义:

uid-29109799-id-3842673.html

很明显我们应该拨开云雾看到一些本质,再次回到设备支持队列的分支中(这才是我们关心的):不管怎么样,你总该有发送的函数调用吧,就是下面圈起来的这个:

uid-29109799-id-3842673.html

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

uid-29109799-id-3842673.html

参考:

Linux源码解读(三十四):网络通信简介——UDP协议实现与性能优化 本文深入解读Linux内核中UDP协议的实现原理与核心性能优化策略。通过分析UDP数据包的发送与接收流程,详解了sk_buff、sock等核心数据结构,并重点探讨了SO_REUSEPORT、MSG_ZEROCOPY、XDP等关键技术如何解决高并发场景下的锁竞争与数据拷贝瓶颈,帮助开发者构建高性能、低延迟的网络应用。 阅读详情

相关推荐

获取网口流量的源代码

这个是Linux下获取网络流量的源代码,能够实时获取各个网卡的网络流量,可以分别解析发送或者接收的流量,功能已验证通过

io 单队列和多队列理解

传统单队列框架适应的是老式机械盘。而多队列则适应追求更高iops的SSD等新设备 Software Queues 主要负责io调度和优化,可以配置一个 CPU core 一个队列,或者一个 CPU socket 一个队列。这将消除或大大减少锁争用。I/O 调度和优化只会在 Software Queues 中完成,并且不会发生跨队列的 I/O 合并和排序。 harware queues负责将从 Software Queues 过来的 I/O 请求发送给底层硬件,其数量和硬件相关。目前普通硬件一般...

wu7244582的专栏 1459

Linux网络数据包抓取源码分析和包过滤

Linux下网络数据包抓取源码分析和包过滤,请大家下载学习,用C开发的

【Linux 内核网络协议栈源码剖析】数据包接收(含TCP协议状态变换)

接前文connect 函数剖析(一) 接收数据包函数,release_sock 函数是在 sock.c中,该函数是在 inet socket 层,其内部的数据结构为 sock 结构 该函数被 tcp_connect 函数最后调用,用于接收数据包 //如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收 //数据包要插入receive_queue

wenqian 'blog 5235

【Linux 内核网络协议栈源码剖析】数据包发送

release_sock 函数是在 sock.c中 //如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收 //数据包要插入receive_queue中才能算真正完成接收 //release_sock函数则是从back_log中取数据包重新调用tcp_rcv函数对数据包进行接收 void release_sock(struct sock *sk)

wenqian 'blog 5173

Linux 读取设备网卡/IP信息 源码

Linux 设备下读取以太网、WiFi网卡的MAC和IP信息,以供应用程序使用

linux内核源码分析之网络数据收发流程

目录 一、TCP/IP 模型与 ISO模型 二、内核中分层模型的结构 三、数据帧的封装 四、协议栈收发包流程 1、网络包接收流程 2、网络包发送流程 一、TCP/IP 模型与 ISO模型 内核中使用的是TCP/IP 模型,把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层。 应用层,负责向用户提供一组应用程序; 传输层,负责端到端的通信; 网络层,负责网络包的封装、寻址和路由; 网络接口层,负责网络包在物理网络中的传输。 二、内核中分层模型的结构 ..

6197

基于STM32智能震动报警器震动检测声光报警系统设计

*单片机设计介绍,基于STM32智能震动报警器震动检测声光报警系统设计。

2201_75940997的博客 2136

多队列网卡简介以及Linux通过网卡发送数据包源码解读

首先我们看一下一个主流多队列网卡(E1000)跟多核CPU之间的关系图:非多队列:linux的网卡由结构体net_device表示,一个该结构体对应一个可以调度的数据包发送队列。数据包的实体在内核中以结构体sk_buff(skb),形如:多队列:一个网卡可以拥有多个队列接下来,看看TX引擎是如何工作的(注:对于发送和接收数据包有两个名词,分别应对TX,RX)解释:函数-dev_queue_xmit

VinoYang的专栏 7674

linux 绑定网卡发送数据,多队列网卡简介以及Linux通过网卡发送数据包源码解读...

首先我们看一下一个主流多队列网卡(E1000)跟多核CPU之间的关系图: 非多队列:linux的网卡由结构体net_device表示,一个该结构体对应一个可以调度的数据包发送队列。数据包的实体在内核中以结构体sk_buff(skb),形如: 多队列:一个网卡可以拥有多个队列 接下来,看看TX引擎是如何工作的(注:对于发送和接收数据包有两个名词,分别应对TX,RX) 注:TXQ代表网卡中的队列。解释...

weixin_39927993的博客 592

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 693

网卡驱动架构以及源码分析

网卡驱动架构以及源码分析

389

资产会计 Transaction Type 与业务交易的 Post to Affiliated Company 不一致导致的 AAPO176:成因剖析与修复指引

本文解析了SAP资产会计中常见的"AAPO176"错误提示,指出当交易类型(TType)与业务交易(Business Transaction)的"关联公司过账"(Post to Affiliated Company)标志不一致时,系统会拒绝过账。作者详细说明了该标志的作用机制,并提供了四种解决方案:修正交易类型使用、匹配正确的业务交易、调整系统配置或建立映射关系。文章还通过实际案例展示了配置错误对集团合并报表的影响,并附带了用于检查配置一致性的ABAP脚本。该错误通常

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 339

如何在Linux上安装Realtek R8125 2.5GbE网卡驱动:终极完整指南

你是否正在为Linux系统无法充分发挥Realtek RTL8125 2.5GbE网卡性能而烦恼?当你的高速网卡被系统默认的通用驱动限制在1GbE速度时,这种性能瓶颈确实令人沮丧。别担心,这份完整的Realtek R8125驱动安装指南将帮助你轻松解决这个问题,让你的2.5GbE网卡在Linux系统上发挥全部潜力。 ## 📋 问题引入与痛点分析 许多Linux用户在使用Realtek RTL

gitblog_00510的博客 774
上一篇: linux恢复的文件提示不对,如何使用'fsck'修复Linux中的文件系统错误
下一篇: linux字符设备驱动程序操作流程,Linux字符设备驱动程序工作机理分析
weixin_39638309
博客等级 码龄9年 42粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值