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,一经查实,立即删除!

相关文章

缓存新境界:Eureka中服务的分布式缓存实现策略

缓存新境界:Eureka中服务的分布式缓存实现策略 引言 在微服务架构中,服务间的通信和数据交换频繁,引入分布式缓存可以显著提高系统性能和响应速度。Eureka作为Netflix开源的服务发现框架,虽然本身不提供缓存机制,但可…

【线程状态-2】

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

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

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

【AI工具介绍】— webkit简介

目录 一、起源与发展 二、核心组件与功能 三、特性与优势 四、应用与影响 五、结论 一、起源与发展 WebKit起源于苹果公司,最初是为了开发Safari浏览器而创建的。WebKit项目的起源可以追溯到苹果公司在2001年推出基于Unix的操作系统Mac OS X时,对浏…

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 的官方支持已经进入了维护阶段,这意味着它将不再收到常规的更新和新功能,…

图像类别生成数字标签

类别 COCO 2017数据集分类标签。coco2017数据集下载。 cls [background, person, bicycle, car, motorcycle, airplane, bus,train, truck, boat, traffic light, fire hydrant,stop sign, parking meter, bench, bird, cat, dog,horse, sheep, cow, elephant, bear, zebra,…

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

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

java.lang.annotation包介绍

java.lang.annotation 包是 Java 标准库中的一个核心包,专门用于定义和支持 Java 注解(Annotation)。该包中包含了一些核心的接口和枚举类型,用于定义和控制注解在 Java 程序中的行为和使用方式。 主要的类和接口 Annotation 接口 java.lang.annotation.Annotation 所有注…

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

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

C++惯用法: 通过std::decltype来SFINAE掉表达式

目录 1.什么是SFINAE 2.SFINAE(替换失败不是错误) 3.通过std::decltype来SFINAE掉表达式 1.什么是SFINAE SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去…

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

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

量化交易常用名词介绍(七)——模块篇

目录 七、模块篇 1. NumPy 2. pandas 3. matplotlib 4. scikit-learn 5. TensorFlow 6. TA-Lib 7. statsmodels 8. Backtrader 9. PyPortfolioOpt 10. Zipline 七、模块篇 在量化交易中,Python 及其丰富的库生态系统提供了强大的支持。以…

Redis部署和基础命令

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

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

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

Linux内核 -- 内存管理之scatterlist结构使用

Linux Kernel Scatterlist 使用指南 1. 简介 scatterlist 结构在 Linux 内核中主要用于 DMA(直接内存访问)操作中的内存管理。它允许将不连续的物理内存片段表示为一个逻辑上的连续块,从而使 DMA 操作可以高效地处理这些不连续的内存片段。…

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

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

IDEA如何创建原生maven子模块

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