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

news2024/9/8 7:10:48

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.coloradmin.cn/o/1912033.html

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

相关文章

Django 更新数据 save()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFie…

9.pwn 栈溢出

栈溢出简介 函数中的存储在栈中的局部变量数组边界检查不严格发生越界写,造成用户输入覆盖到缓冲区外的数据内容, 由于栈中同时存在着与函数调用参数的相关信息,栈溢出可以导致控制流劫持 基础栈溢出(hello world in pwn) 多数情况下我们需…

【 正己化人】 把自己做好,能解决所有问题

阳明先生说:与朋友一起辩论学问,纵然有人言辞观点浅近粗疏,或者是炫耀才华、显扬自己,也都不过是毛病发作。只要去对症下药就好,千万不能怀有轻视别人的心理,因为那不是君子与人为善的心。 人会爱发脾气、…

UE5.3-基础蓝图类整理一

常用蓝图类整理: 1、获取当前关卡名:Get Current LevelName 2、通过关卡名打开关卡:Open Level(by name) 3、碰撞检测事件:Event ActorBeginOverlap 4、获取当前player:Get Player Pawn 5、判断是否相等&#xff1…

阿里云人工智能平台PAI部署开源大模型chatglm3之失败记录--update:最后成功了!

想学习怎么部署大模型,跟着网上的帖子部署了一个星期,然而没有成功。失败的经历也是经历,记在这里。 我一共创建了3个实例来部署chatglm3,每个实例都是基于V100创建的(当时没有A10可选了),其显…

自动化测试之unittest框架详解

1、什么是Unittest框架? python自带一种单元测试框架 2、为什么使用UnitTest框架? >批量执行用例 >提供丰富的断言知识 >可以生成报告 3、核心要素 1).TestCase(测试用例) 2).TestSuite(测试套件) 3).Test…

比赛获奖的武林秘籍:05 电子计算机类比赛国奖队伍技术如何分工和学习内容

比赛获奖的武林秘籍:05 电子计算机类比赛国奖队伍技术如何分工和学习内容 摘要 本文主要介绍了在电子计算机类比赛中技术层面上的团队分工和需要学习的内容,分为了嵌入式硬件、嵌入式软件、视觉图像处理、机械、上位机软件开发和数据分析等六个方向&am…

ORA-12537: TNS:连接关闭/Io 异常: Got minus one from a read call

在另外一个数据库建立dblink的时候,发现执行命令报错: 被连接的数据库我也上去过,用工具尝试登陆也报错: IO Error: Got minus one from a read call, connect lapse 1 ms., Authentication lapse 0 ms. Got minus one from a …

PTA - 编写函数计算圆面积

题目描述: 1.要求编写函数getCircleArea(r)计算给定半径r的圆面积,函数返回圆的面积。 2.要求编写函数get_rList(n) 输入n个值放入列表并将列表返回 函数接口定义: getCircleArea(r); get_rList(n); 传入的参数r表示圆的半径&#xff0c…

新闻资讯整合平台:一站式满足企业信息需求

摘要: 面对信息爆炸的时代,企业如何在海量数据中快速获取有价值资讯,成为提升竞争力的关键。本文将探讨如何通过一站式新闻资讯整合平台,实现企业信息需求的全面满足,提升决策效率,同时介绍实用工具推荐&a…

如何构建数据驱动的企业?爬虫管理平台是关键桥梁吗?

一、数据驱动时代:为何选择爬虫管理平台? 在信息爆炸的今天,数据驱动已成为企业发展的核心战略之一。爬虫管理平台,作为数据采集的第一站,它的重要性不言而喻。这类平台通过自动化手段,从互联网的各个角落…

AI Earth——1990-2022年全国月度气象数据检索应用app

应用结果 代码 #导入安装包 import os import json import datetime import streamlit as st import streamlit.components.v1 as components import traceback from PIL import Imageimport aie#读取当前目录的内容 current_work_dir = os.path.dirname(__file__) #添加地图…

PolarisMesh源码系列——服务端启动流程

前话 PolarisMesh(北极星)是腾讯开源的服务治理平台,致力于解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题,针对不同的技术栈和环境提供服务治理的标准方案和最佳实践。 PolarisMesh 官网&am…

开发个人Go-ChatGPT–6 OpenUI

开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI,旨在完全离线运行。它支持各种 LLM 运行器,包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由,OpenAI 的接口需要密钥才…

网络安全——防御实验

防御实验一 拓扑结构展示: 一、 根据题目,先为办公区做安全策略主要策略有以下几点: 1、书写名称和描述,名称和描述要明确,让除本人以外的人也能理解 2、确定源地址为办公区,目标地址为DMZ区 3、确定时间…

QT程序异常结束解决方法

在用QT开发第三方SDK的时候,刚开始是运行正常的,但是重装系统之后再次运行程序总是出现:程序异常结束。 以下方法尝试无效,但不失为一种排查方法: 重新安装QT;检查Qt Creator配置,编译器位数和…

java LogUtil输出日志打日志的class文件内具体方法和行号

最近琢磨怎么把日志打的更清晰,方便查找问题,又不需要在每个class内都创建Logger对象,还带上不同的颜色做区分,简直不要太爽。利用堆栈的方向顺序拿到日志的class问题。看效果,直接上代码。 1、demo test 2、输出效果…

什么是O2O?线上线下怎么完美结合?

现如今互联网技术飞速发展,智能手机普及。O2O(Online To Offline)模式已经成为一种新的商业模式,人们的生活和消费习惯也逐渐被改变。经常听到企业提到“O2O”,它究竟是什么呢?对企业有着什么魅力呢&#x…

随笔(一)

1.即时通信软件原理(发展) 即时通信软件实现原理_即时通讯原理-CSDN博客 笔记: 2.泛洪算法: 算法介绍 | 泛洪算法(Flood fill Algorithm)-CSDN博客 漫水填充算法实现最常见有四邻域像素填充法&#xf…

idea创建dynamic web project

由于网课老师用的是eclipse,所以又得自己找教程了…… 解决方案: https://blog.csdn.net/Awt_FuDongLai/article/details/115523552