Linux 网络--TCP协议收包流程(NAPI机制)(非常详细)零基础入门到精通,收藏这一篇就够了

Docker常用命令汇总(100条) 管理不同的Docker守护进程上下文。- 搜索一个Docker仓库中的镜像。- 显示Docker守护进程的事件。- 显示Docker守护进程的信息。- 启动Docker后台守护进程。- 从一个压缩文件中加载一个镜像。- 登录一个Docker镜像仓库。- 登录到一个Docker仓库。- 查看Docker的系统信息。- 查看Docker的版本信息。- 查看容器中正在运行的进程。- 从一个归档文件中加载镜像。- 将一个镜像打包为归档文件。- 列出所有正在运行的容器。- 导入一个tar包为镜像。 阅读详情

平台环境简介:
宿主机: ubuntu18.04
Linux内核源码版本: Linux-4.15
网卡驱动: Intel e1000 (ubuntu 虚拟机默认网卡驱动)
协议:TCP协议,本文分析收包过程

本文以 Linux4.15 内核版本对TCP协议的网络数据包接收处理过程进行分析。

NAPI机制引入
New API(NAPI)是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据。随着网络的接收速度的增加,NIC 触发的中断能做到不断减少,目前 NAPI 技术已经在网卡驱动层和网络层得到了广泛的应用,驱动层次上已经有 E1000 系列网卡,RTL8139 系列网卡,3c50X 系列等主流的网络适配器都采用了这个技术,而在网络层次上,NAPI 技术已经完全被应用到了著名的netif_rx 函数中间,并且提供了专门的 POLL 方法–process_backlog 来处理轮询的方法;根据实验数据表明采用NAPI技术可以大大改善短长度数据包接收的效率,减少中断触发的时间。

OSI七层模式和TCP/IP四层模型
进入正题前,我们先重温一下TCP/IP模型以及对应Linux系统的各部分功能。

数据包流转
您粘贴的区域不支持图片插入。函数调用流程

1.系统调用

应用程序调用read()阻塞等待读取网络数据,通过sk_wait_data()进行阻塞,当有数据到来时,触发等待队列,调用skb_copy_datagram_msg()进行数据拷贝。具体函数调用流程如下所示:

=>read() 系统调用
=>vfs_read()
=>new_sync_read()
=>call_read_iter()
=>sock_recvmsg() 进入sock接收
=>sock_recvmsg_nosec()
=>inet_recvmsg()
=>tcp_recvmsg() 阻塞,进入tcp协议栈
 =>sk_wait_data() 等待数据到来
 =>skb_copy_datagram_msg() 数据来了拷贝

2.网卡中断处理函数

当网卡收到数据时,通过e1000网卡驱动绑定的 e1000_intr() 中断函数进行处理,因为e1000网卡支持NAPI机制,所以进入__napi_schedule()进行触发,将当前节点加入napi_poll链表并触发软中断进入 NAPI处理 。中断函数的调用流程如下所示:

=> irqreturn_t e1000_intr(int irq, void *data) 中断处理函数
=> __napi_schedule(&adapter->napi) 调度NAPI
=> ____napi_schedule() NAPI调度
  =>list_add_tail(&napi->poll_list,&sd->poll_list);添加到poll链表
  =>__raise_softirq_irqoff(NET_RX_SOFTIRQ); 触发软中断

3.NAPI处理

=> invoke_softirq() 软中断
=> __do_softirq()
=> net_rx_action()
=> napi_poll() 执行NAPI机制
=> e1000_clean()
=> e1000_clean_rx_irq()
=> e1000_copybreak() 拷贝数据
 =>e1000_alloc_rx_skb() 申请skb内存
 =>dma_sync_single_for_cpu() 同步DMA数据
 =>skb_put_data() 拷贝DMA数据到SKB
=> e1000_receive_skb()
=> napi_gro_receive()
=> napi_skb_finish()
=> netif_receive_skb_internal()
=> __netif_receive_skb()
=> __netif_receive_skb_core()

=> ip_rcv() 进入网络层
=> ip_rcv_finish()
=> dst_input()
=> ip_local_deliver()
=> ip_local_deliver_finish()
=> tcp_v4_rcv()
=> tcp_v4_do_rcv()
 => tcp_rcv_established()
 => sk_data_ready() 唤醒等待队列
=> tcp_add_backlog()
=> release_sock()唤醒

总结

注: 不同的Linux内核版本,可能函数名不太一样,但是总体流程是一样的,可参考进行分析。

通过对网络收包过程的梳理,让我们对Linux网络数据包的流转有一定的概念,在需要分析源码的时候能找到对应位置进行分析。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

优快云大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

Nmap扫描实战命令汇总 Nmap实战详解 阅读详情

相关推荐

docker 常用命令大全

Docker 常用命令大全

胖虎儿的博客 38万+

vmware虚拟机使用教程

以下是我总结的虚拟机的一些经验【不一定正确,仅仅用作参考】 1.vmware选择什么版本比较好,越新的版本越好吗? 并不一定要选择最新的版本。可以选择vmware 12 pro ,这个版本好用。 2.使用教程 点击启动虚拟机 下一步下一步就可以 安装vmtools,安装后就可以...

xijieyuan2qi的博客 17万+

Linux 内核收包流程与 epoll 回调触发机制解析

本文深入解析Linux内核网络收包与epoll回调机制,从硬件到用户态完整呈现数据流路径。首先介绍软中断注册机制,重点分析NET_RX_SOFTIRQ处理流程;然后详细阐述网卡驱动NAPI注册、poll函数调用及协议栈处理(IP/TCP层);最后揭示epoll回调触发原理:从socket可读事件通过wait queue唤醒,到ep_poll_callback将事件加入rdllist,最终唤醒epoll_wait。整个过程形成高效的事件驱动I/O模型,实现内核到用户态的无缝衔接。

weixin_49516030的博客 363

Web安全和渗透测试有什么关系?

做渗透测试的一个环节就是测试web安全,需要明白漏洞产生原理,通过信息收集互联网暴露面,进行漏洞扫描,漏洞利用,必要时进行脚本自编写和手工测试,力求挖出目标存在的漏洞并提出整改建议,当然如果技术再精一些,还要学习内网渗透(工作组和域环境),白盒审计,app,小程序渗透那些了......可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。总之,web安全包含于渗透测试,但不是渗透测试的全部。

Python_0011的博客 4858

Linux 操作系统原理 — 内核协议栈收包/发包流程

INET socket 层会调用具体传输层协议的 write 函数,该函数是通过调用本层的 inet_send() 来实现的,inet_send() 的 UDP 协议对应的函数为 udp_write()。:udp_write() 调用本层的 udp_sendto() 完成功能。在具体的实现中,poll() 会轮训检查 BDT Entries 的状态,如果发现当前 BDT 指针指向的 Entry Ready,则将该 Entry 对应的 sk_buff 取出来,并恢复该 Entry 的空闲状态。

烟云的计算 3436

Linux Kernel TCP/IP Stack — 协议栈初始化处理流程

目录 文章目录目录数据报文数据报文的封装与分用数据报文首部的数据结构ethhdr:描述以太网数据帧首部iphdr:描述 IP 数据报首部udphdr:描述 UDP 数据段首部Linux 内核网络协议栈内核网络协议栈的分层结构数据结构参考文章 数据报文 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作...

烟云的计算 8124

Linux 网络--TCP协议收包流程(NAPI机制)

通过对网络收包过程的梳理,让我们对Linux网络数据包的流转有一定的概念,在需要分析源码的时候能找到对应位置进行分析。

weixin_46564301的博客 1810

Linux Kernel TCP/IP Stack — 协议栈收包处理流程

目录 文章目录目录Linux 收包处理流程概览Linux 收包处理流程详细展开 Linux 收包处理流程概览 数据帧到达 NIC。 NIC Controller 中的 DMA Controller 模块,主动将数据帧写入主存储器。 NIC 给 CPU 的相关引脚上触发一个电压变化,以此触发 CPU 的硬中断,通知 CPU 执行硬中断处理程序。CPU 的硬中断处理函数的作用就是调用 NIC Controller Registered 的中断处理函数,该函数的作用就是发出软中断请求,然后释放 CPU。 ks

烟云的计算 8932

DPDK 网卡收包流程

Table of Contents 1、Linux网络收发包流程 1.1 网卡与liuux驱动交互 1.2 linux驱动与内核协议栈交互 题外1: 中断处理逻辑 题外2:中断的弊端 2、linux发包流程 2、DPDK 收发包流程 2.1 网卡DMA描述符环形队列 2.2 dpdk 收包流程 1、构造收包队列 2.启动 3.收包 3、 PCIE 带宽调优 1)减少MMIO访问的频度。 (2)提高PCIe传输的效率。 (3)尽量避免Cache Line的部分写。 4、软..

RToax 9259

ACT代码梳理:新手学具身智能,不需要学会一堆理论,先跑起来再说

我是一个刚接触具身智能的小白。第一次看 ACT 项目,什么 Transformer、VAE、Mujoco、rollout,全是天书。但我没打算先把理论补完。太难,也太慢。我的策略是:直接上手,边做边学,卡在哪就学到哪。这篇文章是我的第一站——带你一起看懂 ACT 项目的整体架构,了解它的核心模块和流程。开始前,我列了 本文出现的18 个关键词,是我一开始完全搞不懂的。你可以先扫一眼,如果不认识的超过 10 个,那我们就是同路人,可以放心往下看了。

qq_17405041的博客 1207

USB设备识别码VID和PID详解:如何查询和自定义你的设备ID

本文详细解析了USB设备识别码VID和PID的核心作用、查询方法及自定义配置技巧。VID(供应商识别码)和PID(产品识别码)是USB设备的唯一身份证,用于驱动匹配和功能识别。文章提供了Windows和Linux系统下的查询方法,并探讨了如何合法获取和自定义VID/PID,适合硬件开发者和DIY爱好者参考。

weixin_29168675的博客 1459

【深入理解 Linux 网络】收包原理与内核实现(上) 从网卡到协议层

这种方式仅拷贝 256 字节的头部数据,而 i40e_build_skb() 函数的执行更为激进,它直接在 DMA 空间构建 skb,最后将指针赋值给 skb,从而实现真正的零拷贝,这对于小包处理性能提升尤为明显,是高性能网络处理的关键优化之一。有时候我们通过 tcpdump 抓包时会抓到实际大小远超 MTU 的巨帧(Jumbo Frames),就是由于 GRO 特性导致的,因为 tcpdump 的处理是在更往后的步骤处理的。但和硬件实现相比,这里的软件实现本身并不能提升性能,主要用来测试功能。

艾希射日 2086

AIGC内容溯源技术:如何追踪AI生成内容的原始来源

本文旨在系统性地介绍AIGC内容溯源的技术体系,帮助读者理解如何追踪AI生成内容的来源。我们将覆盖从基础概念到前沿技术的完整知识链,包括但不限于数字水印、区块链存证、内容指纹等技术方案。文章将从AIGC的基本概念出发,逐步深入探讨各种溯源技术,分析其原理和实现,最后讨论实际应用和未来趋势。AIGC:AI Generated Content,人工智能生成内容内容溯源:追踪数字内容的创作、修改和传播历史数字水印:嵌入在数字内容中的不可见识别信息数字水印:隐藏在内容中的识别信息,像隐形墨水内容指纹。

SuperAGI2025 2070

linux网络收包过程

网卡收到包,通过DMA放在Ring Buffer中描述符指定的内存位置;DMA完成后,网卡触发硬中断给CPUCPU调用网卡注册好的硬中断处理函数igb_msix_ringigb_msix_ring会把驱动的poll_list注册给CPU变量softnet_data里的poll_list(),然后触发软中断NET_RX_SOFTIRQ(内核一直运行的ksoftirqd中两个线程函数ksoftirqd_should_run和run_ksoftirqd;

qq_48057735的博客 1240

Open3D 点云变换【2025最新版】

点云平移、旋转、缩放、欧式变换的python代码实现。博客长期更新,本文最近更新时间为:2025年1月16日。

点云侠的博客 37万+

MOSFET关断尖峰电压的机理与抑制

MOSFET在电力电子系统中存在开关尖峰电压/电流问题,主要源于寄生电感、密勒电容及开关瞬态特性。尖峰会引发过压击穿、功率损耗和EMI干扰。抑制措施包括优化驱动电路、添加缓冲网络(RC/RCD)、降低寄生电感(改进PCB布线/封装)、使用快速二极管及远端负载特殊处理(电抗器/滤波器)。系统性的器件选型与电路设计是确保功率电子稳定运行的关键。

硬核科技 1824

linux收包——NAPI机制<面试版>

本文简要介绍了Linux网络协议栈的数据接收流程:网卡通过DMA技术将数据包直接写入内存环形缓冲区(Ringbuffer),传统方式通过硬件中断通知CPU,但高并发场景下频繁中断会导致性能问题。为此Linux引入NAPI机制,采用"中断唤醒+轮询收包"的混合模式——先由硬中断触发处理程序,随后转为软中断轮询方式从缓冲区取出数据包,经协议栈逐层拆解。该机制有效减少了中断次数,提升了网络吞吐性能。

AugusXin的博客 237

Claude Code Skills 入门:内置技能与自定义技能开发

│ Skill 的特点 │1. 封装性:把复杂操作封装成简单命令2. 可复用:一次定义,随处使用3. 可定制:支持参数传入4. 可发现:通过 /skill-name 方式调用打个比方,如果说 Claude Code 的基础工具是「原材料」,那 Skills 就是「预制菜」——只需要简单加热(调用),就能得到成品(结果)。你可以创建自己的 Skill 来封装常用操作。Skill 支持参数,通过。

gaoxiang_120的专栏 671

Linux 网络协议栈收消息过程-Ring Buffer

https://ylgrgyq.github.io/2017/07/23/linux-receive-packet-1/ 想看能不能完整梳理一下收消息过程。从 NIC 收数据开始,到触发软中断,交付数据包到 IP 层再经由路由机制到 TCP 层,最终交付用户进程。会尽力介绍收消息过程中的各种配置信息,以及各种监控数据。知道了收消息的完整过程,了解了各种配置,明白了各种监控数据后才有可能在今后的工...

weixin_30420305的博客 679

【车联网】Automotive 软件过程能力成熟度模型——ASPICE标准入门介绍

ASPICE标准详细定义了与汽车电子软件开发相关的各种术语和概念,包括软件组件、系统集成、测试和验证等。这些定义确保了所有开发团队在使用相同术语时具有一致的理解。

奶爸的编程之路,也就一周冷个三天 2679

2026 Claude Code 标准化前端UI SKILL——Frontend Design

是 Anthropic 官方开源的技能包,在 Claude 官方插件站中排名第一,超过 52k 的下载量。场景推荐方案快速体验批量安装官方 Skills深度设计策略叠加完整打磨流程集成终端跑claude一句话总结:Frontend Design 不是给 AI 加新能力,而是给 AI 加审美标准。它让 AI 从“能画”变成“会设计”——先想清楚风格,再动手写代码。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 3612

linux之网络子系统(6)-GRO机制分析

接收合并函数定义:参数:head:等待合并的skb链表头skb:接收到的skb。返回值:如果为空,表示报文被合并后不需要现在送入协议栈。如果不为空,表示返回的报文需要立即送入协议栈。合并后处理函数定义:该函数对合并好的报文进行进一步加工,比如更新校验和。

z20230508的博客 2824

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux内核网卡收包流程,以及cpu、设备关开中断情况

阶段动作CPU 中断状态网卡中断状态原因/目的硬中断入口硬件触发🔴OFF(自动)🟢 ON硬件自动保护现场。硬中断处理中🔴 OFF🔴OFF(手动)核心:屏蔽网卡,转为轮询模式,避免中断风暴。硬中断出口返回🟢ON(自动)🔴 OFF允许其他设备中断,但网卡仍静默。软中断开始🟢 ON🔴 OFF开始批量轮询收包。软中断轮询中poll循环🟢 ON🔴 OFF高效批量处理,无中断开销。软中断结束前🟢 ON🟢ON(手动)核心:队列清空,恢复网卡中断通知能力。后续处理协议栈/应用。

yiyeguzhou100的专栏 408

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

转载:[内核源码] Linux 网络数据接收流程(TCP)- NAPI

Linux网络接收流程

chch414的博客 714

Linux操作系统学习笔记(二十三)网络通信之收包

Linux操作系统学习笔记(二十三)网络通信之收包 | Ty-Chen's Home一. 简介  本文将分析网络协议栈收包的整个流程,收包和发包是刚好相反的过程。根据顺序我们将依次介绍硬件设备驱动层、数据链路层、网络层、传输层、套接字文件系统的相关发包处理流程,内容较多较复杂,主要掌握整个流程即可。https://ty-chen.github.io/linux-kernel-tcp-receive/ 一. 简介   本文将分析网络协议栈收包的整个流程,收包和发包是刚好相反的过程。根据顺序我们将依次介绍硬

maimang1001的专栏 1045
上一篇: 想转行当程序员能不能成功?我们有话说!
下一篇: 运维新手书籍推荐(非常详细)零基础入门到精通,收藏这一篇就够了
网络安全大白
博客等级 码龄5年 7305粉丝 698原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值