linux 网络包接收过程

网络分层模型和对应实现

TCP/IP 网络分层模型
物理层、链路层、网络层、传输层、应用层

物理层对应网卡网线
应用层对应常见的Nginx,HTTP、FTP等等各种应用
linux 实现链路层、网络层和传输层

链路层协议靠网卡驱动实现,内核协议栈实现网络层和传输层
内核对更上层的应用曾提供socket接口供用户进程访问


硬中断和软中断

内核和网络设备驱动是通过中断的方式来处理的

当设备有数据到达,会给CPU对应引脚上触发一个电压变化,通知CPU处理数据,这就是硬中断

对网络模块来说,处理流程较复杂以及耗时,如果在中断函数中处理所有事情,会过度占据CPU,导致CPU无法响应其他设备,例如键鼠

因此linux 中断处理函数分为上下两个部分,上半部分只进行最简单的部分,快速处理然后释放CPU,接着CPU就可以允许其他中断进来

剩下的绝大部分工作可以在下半部分进行,从容处理

2.4以后的内核版本下半部分的实现方式是软中断,由ksoftirqd 内核线程全权处理,通过给内存的一个变量的二进制值来通知软中断处理程序,这就是软中断


内核收包路径

  1. 数据帧从外部网络到达网卡
  2. 网卡把桢DMA到内存
  3. 硬中断通知CPU
  4. CPU响应硬中断,简单处理后发出软中断
  5. ksoftirqd 进程处理软中断,调用网卡驱动注册的poll函数开始收包
  6. 帧被从Ring buffer 上摘下来保存为一个skb
  7. 协议层开始处理网络帧,处理完后的数据data被放到socket的接收队列中

当网卡收到数据后,linux第一个工作模块是网络驱动,网络驱动会以DMA的方式把网卡上收到的帧写到内存里,再向CPU发起一个中断,通知CPU有数据到达

当CPU收到中断请求后,会调用网络驱动注册的中断处理函数,网卡的终端处理函数并不会做过多工作,发起软中断请求,释放CPU

ksoftirqd 检测到软中断请求到达,调用poll开始轮询收包,收到后交由各级协议栈处理,放入到socket 的接收队列中


硬中断在哪个CPU上被响应,那么软中断也是在这个CPU上处理的,所以说,如果你发现你的linux软中断CPU消耗都集中在一个核上的话,做法就是调整硬中断的CPU亲和性,将硬中断打散到不同CPU核上去


总结

开始收包前,linux做了很多准备工作

  1. 创建ksoftirqd 线程,设置好它自己的线程函数,用来处理后续的软中断
  2. 协议栈注册,linux要实现很多协议,例如:ip\udp\tcp 每一个协议会将自己的处理函数注册一些,方便包来了迅速找到对应的处理函数
  3. 网卡驱动初始化,每个驱动都有一个初始化函数,内核会让驱动也初始化一下,准备好DMA,把NAPI的poll函数地址告诉内核
  4. 启动网卡,分配RX,TX队列,注册中断对应的处理函数

上述准备好后,打开硬中断,等待数据包到来

数据到了以后,第一个迎接它的是网卡

  1. 网卡将数据帧DMA到内存的RingBuffer中,然后向CPU发起终端通知

  2. CPU响应中断请求,调用网卡启动时注册的终端处理函数

  3. 中断处理函数几乎没干啥,就发起了软中断请求

  4. 内核线程ksoftirqb 线程发现有软中断请i去到来,先关闭硬中断

  5. ksoftirqd 线程开始调用驱动的poll函数收包

  6. poll函数将收到的包送到协议栈注册的ip_rev函数中

  7. ip_rev函数再将包送到udp_rcv 函数中(对于tcp包就送到tcp_rcv)


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PFC前端电路 -- EMI电路

一、EMI(Electromagnetic Interference)抗干扰电路 在PFC(功率因数校正)电路中,EMI(电磁干扰)滤波电路是至关重要的组成部分。EMI滤波电路的主要功能是抑制电磁干扰,以确保电源的电磁兼容性(EM…

网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?

文章整体介绍 本文旨在解答关于微服务网关的三个核心问题: 1)为什么需要网关?也即在何种场景下应采用微服务网关以优化系统架构; 2)什么是微服务网关?主要讲构成微服务网关的关键能力,包括但…

【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数

【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数 模型定义编码一个大型语言模型(LLM)架构 使用层归一化对激活值进行归一化LayerNorm代码实现scale和shift 实现带有 GELU 激活的前馈网络测试 模型定义 编码一个大…

基于vue框架的的考研网上辅导系统ao9z7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:学生,公告信息,课程分类,考研资料,考研视频,课程信息,院校建议,教师 开题报告内容 基于Vue框架的考研网上辅导系统开题报告 一、研究背景与意义 随着高等教育的普及和就业竞争的加剧,考研已成为众多大学生提升学历、增强就…

GPU 学习笔记二:GPU单机多卡组网和拓扑结构分析(基于A100的单机多卡拓扑结构分析)

文章目录 一、物理拓扑结构A100讲解1.1 单机多卡拓扑结构 二、术语和基础技术介绍2.1 带宽单位2.2 PCIe及PCIe Switch2.3 NVLink2.4 网卡2.5 带宽瓶颈分析2.6 HBM2.7 CPU/GPU 三、其他典型物理拓扑3.1 H100/H800拓扑分析 防止遗忘和后续翻找的麻烦,记录下平时学到和…

Webserver(2.6)有名管道

目录 有名管道有名管道使用有名管道的注意事项读写特性有名管道实现简单版聊天功能拓展:如何解决聊天过程的阻塞 有名管道 可以用在没有关系的进程之间,进行通信 有名管道使用 通过命令创建有名管道 mkfifo 名字 通过函数创建有名管道 int mkfifo …

超分子水凝胶与细胞的互动:现状、难题与未来蓝图

大家好!今天来了解超分子水凝胶文章——《Using Chemistry To Recreate the Complexity of the Extracellular Matrix: Guidelines for Supramolecular Hydrogel–Cell Interactions》发表于《Journal of the American Chemical Society》。在再生医学的舞台上&…

逗号运算符应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用set…

分类算法——决策树 详解

决策树的底层原理 决策树是一种常用的分类和回归算法&#xff0c;其基本原理是通过一系列的简单决策&#xff0c;将数据集划分为多个子集&#xff0c;从而实现分类。决策树的核心思想是通过树形结构表示决策过程&#xff0c;节点代表特征&#xff0c;边代表决策&#xff0c;叶子…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…

一文详解精细化工行业持续增长的策略与路径解析

随着全球经济的快速发展和科技的不断进步&#xff0c;精细化工行业正面临着前所未有的挑战和机遇。在这个过程中&#xff0c;数字化转型已成为推动行业持续增长的关键因素。精细化工行业&#xff0c;作为化学工业的一个重要分支&#xff0c;其产品广泛应用于医药、农药、涂料、…

医疗器械设备语音ic芯片方案-选型大全

在医疗设备领域&#xff0c;深圳唯创知音提供了多款适用的语音IC产品&#xff0c;以下是其中几款较为常见的推荐&#xff1a; 一、WT588F02X-8S 特点&#xff1a; 1&#xff1a;低成本人机交互语音方案&#xff0c;仅需嵌入在产品中&#xff0c;提升医疗设备智能化水平。 2&…

微服务实战系列之玩转Docker(十七)

导览 前言Q&#xff1a;如何实现etcd数据的可视化管理一、创建etcd集群1. 节点定义2. 集群成员2.1 docker ps2.2 docker exec2.3 etcdctl member list 二、发布数据1. 添加数据2. 数据共享 三、可视化管理1. ETCD Keeper入门1.1 简介1.2 安装1.2.1 定义compose.yml1.2.2 启动ke…

Spring Cloud +UniApp智慧工地源码,智慧工地综合解决方案,建筑工程云平台源码

Spring Cloud UniApp智慧工地源码&#xff0c;智慧工地全套源代码包含&#xff1a;PC端大屏端移动端 智慧工地解决方案以工程建设现场管理需求为主线&#xff0c;以AI、物联网、BIM技术为手段&#xff0c;对施工现场进行立体化、全方位、全时段管理&#xff0c;实现规范施工管…

Python 从入门到实战43(Pandas数据结构)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们学习了NumPy数组操作的相关基础知识。今天学习一下pa…

数字信号处理Python示例(1)使用Python生成正弦信号

文章目录 前言一、连续时间周期信号二、正弦波三、使用Python生成正弦信号的步骤内置库说明 四、完整的python代码与运行结果1.完整的python代码2、运行结果 五、总结 前言 介绍如何使用python生成正弦信号&#xff0c;给出详细步骤和完整的python代码和运行结果。 一、连续时…

树叶分类竞赛(Baseline)以及kaggle的GPU使用

树叶分类竞赛(Baseline)-kaggle的GPU使用 文章目录 树叶分类竞赛(Baseline)-kaggle的GPU使用竞赛的步骤代码实现创建自定义dataset定义data_loader模型定义超参数训练模型预测和保存结果 kaggle使用 竞赛的步骤 本文来自于Neko Kiku提供的Baseline&#xff0c;感谢大佬提供代码…

四足机器人实战篇之二十二:四足机器人支撑腿反作用力规划之反馈控制及线性约束条件优化方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、先使用反馈+前馈的控制方式,根据躯干期望的位置速度,计算出当前身体姿态的虚拟反作用力(实现躯体平衡控制器)二、再建立线性约束的凸优化问…

企业物流管理数据仓库建设的全面指南

文章目录 一、物流管理目标二、总体要求三、数据分层和数据构成&#xff08;1&#xff09;数据分层&#xff08;2&#xff09;数据构成 四、数据存储五、数据建模和数据模型&#xff08;1&#xff09;数据建模&#xff08;2&#xff09;数据模型 六、总结 在企业物流管理中&…

设计模式基础概念(行为模式):责任链模式(Chain Of Responsibility)

概述 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 该模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于…