Linux中网卡收发包的流程

news2024/11/25 14:52:51

        进来在一个RTOS上移植开发网卡驱动,最终DMA收发包流程打通之后,在使用过程中觉得RTOS的处理逻辑太差了,因此有想法来梳理下Linux中对收发包流程处理,来给一些参考。

一、Linux接收网络包的流程

        网卡是一个计算机的硬件,对应的驱动专门负责接收和发送网络包,当网卡接收到一个网络包后,会通过DMA技术将网络包写入到指定的DMA内存中,也就是Ring Buffer,这是一个环形缓存区。接着会告诉操作系统这个网络包已经到达,但怎么告诉,可以是中断。但在高性能模式下,频繁的触发中断,导致其他任务无法继续进行,从而影响系统的整体效率,为了解决性能开销,在2.6中引入了NAPI机制,核心概念是:中断+轮询,中断唤醒数据接收服务,然后poll轮询数据。

        具体可以参考下面:

上图中虚线步骤的解释:

  1. DMA 将 NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff , sk_buff 读写顺序遵循FIFO(先入先出)原则。
  2. DMA 读完数据之后,NIC 会通过 NIC Interrupt Handler 触发 IRQ (中断请求)。
  3. 首先需要关中断,表示已经知道内存中有数据,避免CPU不停的中断;接着发起软中断,然后恢复刚才屏蔽的中断,实际可以看到硬件中断处理函数做的事情很少,主要在软中断中处理;软中断处理函数:根据三个条件唤起ksoftirqd内核线程,ksoftirqd会轮询的处理数据,从Ring Buffer中获取一个数据帧,用sk_buffer表示,从而可以作为一个网络包交给网络协议栈逐层处理。
  4. NIC driver 注册 poll 函数。
  5. poll 函数对数据进行检查,例如将几个 sk_buff 合并,因为可能同一个数据可能被分散放在多个 sk_buff 中。
  6. poll 函数将 sk_buff 交付上层网络栈处理。

二 、Linux发送网络包的流程

        1、调用socket发送数据包时,由于系统调用,陷入到内核态,内核态中的socket层会申请一个sk_buff内存,将用户的数据从用户态拷贝到sk_buff,并加入到发送队列。

        2、网络协议栈基于sk_buff从上到下逐层封装,如果使用TCP传输协议发送数据,先要拷贝一个副本,副本发送完会删除,等到收到ACk后,sk_buff才会真正删除。

        3、触发软中断告诉网卡驱动程序,有新的网络包需要发送,驱动程序会从发送队列中读取sk_buff,将sk_buff挂到RingBuffer中,接着将sk_buff的数据映射到网卡可以访问的内存DMA区域后,然后触发真实的发送。

        4、当数据发送完毕后会触发一个【硬中断】,CPU响应该硬中断,吊起网卡驱动启动时向内核注册的该硬中断对应的处理函数,执行处理函数,在处理函数中最终会发起一个【软中断】。

        5、【内核线程ksoftirqd】响应并处理该软中断,该线程会吊起网卡启动时注册的【该类型的软中断】(有很多类型的软中断,他们都对应不同的处理函数)的处理函数,执行处理函数,在处理函数中会执行如下操作:

       ①、 释放掉RingBuffer中的数组对skb的引用(注意:此时RingBuffer里的数组虽然放弃了对skb的引用,但是该skb并不会被立即清除,因为TCP有重传机制,必须要保证收到了对方的ack应答后再彻底删除该skb,如果没有收到对方的ack,那么传输层还可以重传该skb)

        ②、清理RingBuffer(以便于下次使用)

三、RTOS收包流程

四、RTOS发包流程

Linux收包参考链接:https://www.cnblogs.com/mauricewei/p/10502300.html

Linux发包参考链接:从内核角度看网络包发送流程_网卡 ringbuffer skb-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈线性表——顺序表

文章目录 一、List接口二、线性表2.1、什么是线性表? 三、顺序表ArrayList什么是顺序表? 一、List接口 从上图看到List接口继承自Collection接口,而 ArrayList、LinkedList、Stack 类都实现了List接口,List是个接口,不…

论文新体验!分享8款人工智能AI软件论文网站

最近看到这个AI工具推广做的比较多,号称长文写的比kimi还要好!难道大学生的救星下凡了?? 本文将分享8款优秀的AI软件论文网站,并重点推荐千笔-AIPassPaPer,这是一款备受用户好评的AI原创论文写作平台。 1…

C++ | 掌握C++异常处理:从基础到自定义异常体系的全面指南

09--异常 1、C语言传统的错误处理方式: 包括终止程序和返回错误码两种方式。 直接使用assert终止程序过于粗暴:用户无意的小错误也会造成程序结束运行。 return返回错误码,再通过错误码查找错误类型:过程繁琐,对用…

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而,如何确保我们的可视化设计既美观又简单易懂呢?本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则(Proximity) 定义与应用&am…

学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上

目录 查看电影类型的电影列表 添加电影 修改电影 上机练习 13 使用三层架构完善 web 系统 查看电影类型的电影列表 DAL.py 文件 class MovieDAL(DBHelper): def getMovieByTid(self,typeid): sqlf"""select id,title,release_date,score,tname from Mo…

YOLOv8 | 融合改进 | C2f融合可变核卷积AKConv【附代码+小白可上手】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

【JavaEE】深入理解Spring IoC与DI:从传统开发到依赖注入的转变

目录 IoC & DI ⼊⻔什么是Spring什么是容器什么是IoCIoC介绍传统程序开发问题分析解决方案IoC程序开发IoC优势 IoC & DI ⼊⻔ IoC:Inversion of Control (控制反转) DI:Dependency Injection 在前⾯我们学习了Spring Boot和Spring MVC的开发, 可…

DNS相关内容

一、dns的两种解析方式 1. 正向解析 将域名解析为 ip 地址 2. 逆向解析 将 ip 地址解析为域名 设置解析方式,都是在 zone 文件中 named.conf 解决权限 named.rfc1912.zone 解决解析方式 3.DNS 方向解析 把 192.168.71.145 这个 ip 地址逆向解析为 www.yuany…

Android逆向题解攻防世界-easyjava-难度6

纯Java实现,不涉及so, flag加密之后与指定字符串 “wigwrkaugala"比较判断,循环一个个字符加的,那可以一个个字符对应还原。 加密算法就在a,b类里面,代码直接复制到idea ,枚举暴力破解。 每一位输入范围a-z , 找…

Lua脚本 快速掌握

1.Lua脚本概述 Lua是一种轻量级的编程语言,由巴西里约热内卢天主教大学开发。设计初衷是为了嵌入应用程序中,提供灵活的配置和脚本能力。Lua具有简洁的语法和强大的扩展性,使得它在多个领域得到了广泛应用。 Lua的特点包括动态类型、自动内…

The Sandbox 游戏制作教程第 4 章|使用装备制作游戏,触发独特互动

欢迎回到我们的系列,我们将记录 The Sandbox Game Maker 的 “On-Equip”(装备)功能的多种用途。 如果你刚加入 The Sandbox,On-Equip 功能是 “可收集组件”(Collectable Component)中的一个多功能工具&a…

C++ list【常用接口、模拟实现等】

1. list的介绍及使用 1.1 list的介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前…

MyBatisPlus 第二天

常用注解 1 TableName:数据库表名和实体类名不同时,会出现以下报错 在实体类上添加 TableName("t_user") 在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如t_或tbl_此时,可以使用MyBa…

el-tree自定义节点内容

<el-tree :data"data" :props"defaultProps" ref"treeRef" show-checkbox check-change"handleCheckChange"><!-- 自定义节点内容 --><template #default"{ node, data, store }"><span class"tr…

无人值守人工智能智慧系统数据分析:深度洞察与未来展望

无人值守人工智能智慧系统数据分析&#xff1a;深度洞察与未来展望 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已逐渐渗透到社会经济的各个领域&#xff0c;其中无人值守人工智能智慧系统作为AI技术应用的前沿阵地&#xff0c;正引领着一场深刻的…

【数量关系】毛娃儿笔记

一、导学 1、比例的常见作用 &#xff08;1&#xff09;通过份数求数量 甲&#xff1a;乙1:2 那么甲乙的人数总和一定是3的倍数 &#xff08;2&#xff09;得到倍数关系 不同的说法都可以转化为比例&#xff0c;比如甲是乙的两倍2:1、甲是乙的4/34:3、甲比乙多25%5:4 &am…

基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展&#xff0c;4S店作…

【微前端中常见的问题及其解决办法】

随着前端技术的飞速发展&#xff0c;大型应用系统的复杂性和规模性日益增加&#xff0c;传统的单体前端架构逐渐暴露出维护成本高、升级困难、技术栈单一等问题。为了应对这些挑战&#xff0c;微前端&#xff08;Micro-Frontends&#xff09;作为一种新的架构模式应运而生。微前…

自研Vue3低代码海报制作平台第一步:基础拖拽组件开发

学习来源&#xff1a;稀土掘金 - 幽月之格大佬的技术专栏可拖拽、缩放、旋转组件 - 著作&#xff1a;可拖拽、缩放、旋转组件实现细节 非常感谢大佬&#xff01;受益匪浅&#xff01; 前面我们学习了很多vue3的知识&#xff0c;是时候把它们用起来做一个有意思的平台&#xf…

合合信息OCR支持30类国内常见票据一站式分类识别,支持医疗发票、数电票识别

合合信息TextIn平台明星产品——国内通用票据识别&#xff0c;重磅更新&#xff01; 产品支持票据类型扩展到23大类、30小类&#xff0c;覆盖场景更全面&#xff0c;同时升级优化了多款票据识别模型&#xff0c;平均识别率较前版本提升11.5%&#xff0c;整体识别速度提升21.9%…