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

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

平台环境简介
宿主机: 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网络数据包的流转有一定的概念,在需要分析源码的时候能找到对应位置进行分析。

我是小C,欢迎大家一起交流学习,请关注、点赞、在看吧,不定期分享技术干活哦。

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

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

相关文章

【线程状态-2】

1、线程礼让 (1)礼让线程,让当前正在执行的线程暂停,但不阻塞 (2)将线程从运行状态转为就绪状态 (3)让cpu重新调度,礼让不一定成功!看cpu心情 package st…

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网(Single Pair Ethernet,简称SPE)是一种新兴的以太网技术,它通过一对双绞线实现数据传输,支持PoDL(Power over Data Line)技术,为终端设备提供电力供…

windows JDK11 与JDK1.8自动切换,以及切换后失效的问题

1.windows安装不同环境的jdk 2.切换jdk 3.切换失败 原因:这是因为当我们安装并配置好JDK11之后它会自动生成一个环境变量(此变量我们看不到),此环境变量优先级较高,导致我们在切换回JDK8后系统会先读取到JDK11生成的…

Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小型企业财务管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单…

Spark实现电商消费者画像案例

作者/朱季谦 故事得从这一张图开始说起—— 可怜的打工人准备下班时,突然收到领导发来的一份电商消费者样本数据,数据内容是这样的—— 消费者姓名|年龄|性别|薪资|消费偏好|消费领域&#x…

CentOS 7:停止更新后如何下载软件?

引言 CentOS 7 是一个广受欢迎的 Linux 发行版,它为企业和开发者提供了一个稳定、安全、且免费的操作系统环境。然而,随着时间的推移,CentOS 7 的官方支持已经进入了维护阶段,这意味着它将不再收到常规的更新和新功能,…

2024建博会|博联AI大模型全屋智能引领智能体验新纪元

7月8日,2024中国建博会(广州)在广交会展馆及保利世贸博览馆盛大启幕。BroadLink博联智能携AI大模型全屋智能以及AI商业照明解决方案惊喜亮相,全方位展示AI大模型在智能家居领域的前沿应用成果。 本次建博会,博联智能带…

NPDP含金量高吗?什么人适合学习NPDP?

PMP考完了,最近在考NPDP,这也是一个有意思的证书,含金量还不错,非常适合想转型和升级的人来考。 一、NPDP是什么 NPDP其实就是产品经理国际资格认证(New Product Development Professional),是…

嵌入式c语言——指针加修饰符

指针变量可以用修饰符来修饰

Redis部署和基础命令

一、Redis基本概念 1.1 Redis简介 Redis(远程字典服务器) 是一个开源的、使用 C 语言编写的 NoSQL 数据库。 Redis 基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或…

python爬虫之scrapy基于管道持久化存储操作

python爬虫之scrapy基于管道持久化存储操作 本文基于python爬虫之基于终端指令的持久化存储和python爬虫之数据解析操作而写 scrapy持久化存储 基于管道: 编码流程: 1、数据解析 2、在item类中定义相关属性 3、将解析的数据封装存储到item类型的对象 4、…

【问题记录】VsCode中以管理员权限运行Powershell

问题展示 今天在尝试运行nodemon命令的时候出问题,显示没法识别,经过分析发现是管理员权限的问题,由于是在vscode里面进行开发,因此特此进行配置。 方法一 直接在vscode命令行中输入如下命令: Start-Process powers…

IDEA如何创建原生maven子模块

文件 -> 新建 -> 新模块 -> Maven ArcheTypeMaven ArcheType界面中的输入框介绍 名称:子模块的名称位置:子模块存放的路径名创建Git仓库:子模块不单独作为一个git仓库,无需勾选JDK:JDK版本号父项:…

Linux网络命令:网络工具socat详解

目录 一、概述 二、基本用法 1、基本语法 2、常用选项 3、获取帮助 三、用法示例 1. 监听 TCP 端口并回显接收到的数据 2. 通过 TCP 端口转发数据到 UNIX 套接字 3. 将文件内容发送到 TCP 端口: 4. 使用伪终端进行串行通信 5、启动一个TCP服务器 6、建…

Hi3861鸿蒙开发环境搭建

1.1 安装配置Visual Studio Code 打开Download Visual Studio Code - Mac, Linux, Windows选择下载安装Windows系统的Visual Studio Code。 下载后进行安装。Visual Studio Code安装完成后,通过内置的插件市场搜索并安装开发所需的插件如图所示: 1.2 安…

实时消息推送系统,写得太好了!

websocket 协议是在 http 协议上的一种补充协议,是 html5 的新特性,是一种持久化的协议。其实 websocket 和 http 关系并不是很大,不过都是属于应用层的协议,接下来我们就开始实战。 websocket 定时推送 本教程基于 springboot …

STL--栈(stack)

stack 栈是一种只在一端(栈顶)进行数据插入(入栈)和删除(出栈)的数据结构,它满足后进先出(LIFO)的特性。 使用push(入栈)将数据放入stack,使用pop(出栈)将元素从容器中移除。 使用stack,必须包含头文件: #include<stack>在头文件中,class stack定义如下: namespace std…

13 - matlab m_map地学绘图工具基础函数 - 介绍创建管理颜色映射的函数m_colmap和轮廓图绘制颜色条的函数m_contfbar

13 - matlab m_map地学绘图工具基础函数 - 介绍创建管理颜色映射的函数m_colmap和轮廓图绘制颜色条的函数m_contfbar 0. 引言1. 关于m_colmap2. 关于m_contfbar3. 结语 0. 引言 本篇介绍下m_map中用于创建和管理颜色映射函数&#xff08;m_colmap&#xff09;和 为轮廓图绘制颜…

基于深度学习的电影推荐系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天&#xff0c;精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此&#xff0c;开发了一个基于深度学习的商品销售数据预测系统&#xff0c;该系统利用Python编程语言与Django框架&a…

SQLite 命令行客户端 + Windows 批处理应用

SQLite 命令行客户端 Windows 批处理应用 下载 SQLite 客户端1. Bat 辅助脚本1. 执行SQL.bat执行 2. 导出Excel.bat执行效果 3. 导出HTML.bat执行效果 4. 清空-订单表.bat5. 订单表.bat 2. 测试 SQL1. 创建订单表.sql2. 插入订单表.sql3. 查询订单表.sql4. 清空订单表.sql5. 删…