Linux 系统收发网络包

news2024/11/15 8:34:02

国际标准网络模型

        国际标准网络模型通常指的是 OSI(Open Systems Interconnection)参考模型,它是一个由国际标准化组织(ISO)定义的网络通信模型,用于指导网络协议的设计和实现。该模型将计算机网络通信划分为七个不同的层次,每个层次负责特定的功能,从物理连接到应用程序。

以下是 OSI 参考模型的七个层次及其功能:

1. 物理层(Physical Layer):

2. 数据链路层(Data Link Layer):

3. 网络层(Network Layer):
   - 控制数据包在网络中的路由和转发。
   - 提供寻址、路由、流量控制和错误处理等功能。

4. 传输层(Transport Layer):
   - 提供端到端的数据传输服务,确保数据在源与目的地之间的可靠传输。
   - 通常包括错误检测、流量控制和数据分段等功能。

5. 会话层(Session Layer):

6. 表示层(Presentation Layer):

7. 应用层(Application Layer):

每个层次的功能相对独立,通过定义清晰的接口,不同层次之间能够有效地协同工作,实现端到端的通信。OSI 参考模型为网络协议的设计和实现提供了一个标准化的框架,促进了不同厂商和组织之间的互操作性。

TCP/IP 模型是另一个网络通信模型,通常与 OSI 模型进行对比。在 TCP/IP 模型中,功能被划分为四个层次,分别是网络接口层、互联网层、传输层和应用层。以下是 TCP/IP 模型的四个层次及其对应的功能:

1. 网络接口层(Network Interface Layer):
   - 对应 OSI 模型中的物理层和数据链路层。
   - 负责将数据包封装成帧,在网络中传输。
   - 与硬件设备和网络介质直接交互,处理物理连接和数据帧传输。

2. 网络层(Internet Layer):
   - 对应 OSI 模型中的网络层。
   - 负责数据包的路由和转发,实现不同网络之间的通信。
   - 使用 IP 协议来定义数据包的寻址和路由。

3. 传输层(Transport Layer)

4. 应用层(Application Layer):
   - 对应 OSI 模型中的会话层、表示层和应用层。
   - 提供各种网络应用服务,如 HTTP、FTP、SMTP 等。
   - 包含各种应用层协议,用于实现不同的网络应用服务。

由于 OSI 模型实在太复杂,提出的也只是概念理论上的分层,并没有提供具体的实现方案。所以事实上我们常见的网络模型只是TCP/IP模型,Linux也是采用的这种模型

Linux的网络协议栈

知道了 TCP/IP 网络模型,以及网络包的封装原理后,那么 Linux 网络协议栈的样子,它其实就类似于 TCP/IP 的四层结构:

        不过Linux 的网络协议栈是作为 Linux 内核的一部分存在的,因此网络协议栈中的网络功能代码运行在内核空间。这种设计使得网络协议栈能够直接访问硬件设备,提供更高的效率和更快的响应速度。

Linux的传输过程和软中断

        在Linux系统中,数据包的传输过程和软中断密切相关,因为软中断是一种机制,用于处理网络数据包和其他异步事件。

软中断

        网卡是计算机里的一个硬件,专门负责接收和发送网络包,当网卡接收到一个网络包后,会通过 DMA 技术,将网络包写入到指定的内存地址,也就是写入到 Ring Buffer ,这个是一个环形缓冲区,接着就会告诉操作系统这个网络包已经到达。

        在传输过程中怎么告诉操作系统这个网络包已经到达了呢?

        最简单的一种方式就是触发中断,也就是每当网卡收到一个网络包,就触发一个中断告诉操作系统。但是,这存在一个问题,在高性能网络场景下,网络包的数量会非常多,那么就会触发非常多的中断,会导致 CPU 一直没完没了的处理中断,而导致其他任务可能无法继续前进,从而影响系统的整体效率。

        为了解决性能开销, Linux内核引入了NAPI 机制(混合中断和轮询的方式来接收网络包核心概念就是不采用中断的方式读取数据,首先采用中断唤醒数据接收的服务程序,然后 poll 的方法来轮询数据。

        因此,当有网络包到达时,还是先通过会通过 DMA 技术,将网络包写入到指定的内存地址,接着网卡向 CPU 发起硬件中断,当 CPU 收到硬件中断请求后,根据中断表,调用已经注册的中断处理函数。

        这个处理函数需要先暂时屏蔽中断,表示已经知道内存中有数据了,告诉网卡下次再收到数据包直接写内存就可以了,不要再通知 CPU 了,这样可以提高效率,避免 CPU 不停的被中断。接着,发起软中断,然后恢复刚才屏蔽的中断。

        至此,硬件中断处理函数的工作就已经完成。其实硬中断做的事情很少,主要事情都是由软中断完成的。

先来解释一下什么是软中断:

        软中断是Linux内核中一种机制,用于处理异步事件,如网络数据包的到达、定时器事件等。软中断允许内核在不打断正在执行的进程的情况下,及时响应这些异步事件。

        内核中的 ksoftirqd 线程专门负责软中断的处理,当 ksoftirqd 内核线程收到软中断后,就会来轮询处理数据。ksoftirqd 线程会从 Ring Buffer 中获取一个数据帧,用 sk_buff 表示,从而可以作为一个网络包交给网络协议栈进行逐层处理。

数据包传输过程:

        首先数据包生成,内核接收到数据包后,数据包会经过网络协议栈的各个层级进行处理,如链路层、网络层、传输层等。在每个层级,相应的协议会处理数据包,添加必要的头部信息以便路由和传输。

        内核根据数据包的目标地址进行路由选择,确定数据包应该通过哪个网络接口发送或转发。如果目标地址是本地的,则数据包将直接传递给目标应用程序;否则,数据包将被发送到下一个路由器或主机。

        数据包通过合适的网络接口发送到目标主机或路由器,经过网络传输的各种设备,最终到达目标。

        目标主机的网络接口接收数据包,并将其传递给内核进行处理,最终将数据包分发给目标应用程序。

        需要注意的是在发送过程中:

        如果使用的是 TCP 传输协议发送数据,那么先拷贝一个新的 sk_buff 副本 ,这是因为 sk_buff 后续在调用网络层,最后到达网卡发送完成的时候,这个 sk_buff 会被释放掉。而 TCP 协议是支持丢失重传的,在收到对方的 ACK 之前,这个 sk_buff 不能被删除。所以内核的做法就是每次调用网卡发送的时候,实际上传递出去的是 sk_buff 的一个拷贝,等收到 ACK 再真正删除。

        值得注意的是全部数据包只用一个结构体sk_buff 来描述,为了满足这个合理的要求, sk_buff 中 data 的指针可以完美满足他,通过调动指针的位置(这个data的位置在头部

        如当接收报文时,从网卡驱动开始,通过协议栈层层往上传送数据报,通过增加 skb->data 的值,来达到一种层层剥离的效果。

        当要发送报文时,创建 sk_buff 结构体,数据缓存区的头部预留足够的空间,用来填充各层首部,在经过各下层协议时,通过减少 skb->data 的值来增加协议首部。

        至此传输层的工作完成后,经过类似的网络层和网络接口层的操作后会触发软中断告诉网卡驱动程序,这里有新的网络包需要发送,驱动程序会从发送队列中读取 sk_buff,将这个 sk_buff 挂到 RingBuffer 中,接着将 sk_buff 数据映射到网卡可访问的内存 DMA 区域,最后触发真实的发送。(其实我也不太懂这部分)

        当发送完成的时候,网卡设备会触发一个硬中断来释放内存,主要是释放 sk_buff 内存(这里的是备份)和清理 RingBuffer 内存。最后,当收到这个 TCP 报文的 ACK 应答时,传输层就会释放原始的 sk_buff(真实) 。

        多少次拷贝?

        用户空间到内核空间:当应用程序通过套接字发送数据时,数据首先要从用户空间拷贝到内核空间的套接字缓冲区

        从传输层进入网络层的时候:每一个 sk_buff 都会被克隆一个新的副本出来。副本 sk_buff 会被送往网络层

        当sk_buff 大于 MTU 时:可能会发生,申请额外的sk_buff,将原来的拷贝为多个。

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

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

相关文章

若依后端添加子模块swagger分区

前言: 因为接口太多无法快速的找到对应模块的接口swagger文档,所以在对应需要隔离显示的子模块的swagger接口配置。 1、XXXWebConfiguration类配置 例:system模块 需要在controller包的同级目录下创建 framework.web.config.XXXWebConfigur…

94522

springboot 广州应用科技学院的教室管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时…

蓝牙ble建立配对、绑定、连接的流程详解

目录 1. 连接(Connection) 广播和扫描 设备发现 连接请求 连接建立 2. 配对(Pairing) 配对请求和响应 配对方法 密钥生成和分发 加密连接 3. 绑定(Bonding) 密钥存储 后续连接 详细流程图 蓝牙低功耗(Bluetooth Low Energy, BLE)设备之间的配对、绑定和连…

机器学习的入门笔记(第十六周)

本周观看了B站up主霹雳吧啦Wz的图像处理的课程, 课程链接:霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频 下面是本周的所看的课程总结。 MobileNet V2的代码实现 1、定义ConvBNReLU类,将卷积操作,批量归一化操作&…

USB network超全解析,揭秘USB Server背后的黑科技!

一、技术概述 USB Network技术基于USB协议,通过在网络层实现USB设备的虚拟化和共享,使得用户可以在不同的物理位置通过网络访问和操作USB设备。 这种技术打破了传统USB接口的物理限制,极大地扩展了USB设备的使用范围和灵活性。 二、工作原…

DHU 函数 判断质数

思路及代码 #include<iostream> using namespace std;//function: is_prime_number() int is_prime_number(int n){if (n 1){return 0;}for (int i 2; i < n-1; i){if (n%i 0){return 0;}}return 1; } int main(){ //input 多组 Nint N;while(cin >> N){//s…

C#入门篇7(面向对象)

目录 一、值传递和引用传递 1、概念 2、主要区别 3、用法 二、字符串 1、字符串的不可变性可以将字符串看作只读字符数组 2、字符串提供的各种方法 三、继承 1、 概念 2、格式 3、示例 4、子类继承于父类什么&#xff1f; 5、继承的特性 6、查看类图 四、new关键字…

[适合新手的NLP项目]基于机器学习的垃圾信息识别分类

1.项目背景 电子邮件和短信中的垃圾信息是现代通信中常见的问题之一。随着互联网的普及和移动设备的广泛使用&#xff0c;垃圾信息的传播途径和数量也在迅速增加&#xff0c;这些垃圾信息不仅影响用户的日常通信体验&#xff0c;还可能带来严重的安全威胁&#xff0c;如钓鱼攻…

IP地址与SSL证书:保障网络安全的关键

在数字时代&#xff0c;网络安全至关重要&#xff0c;而SSL&#xff08;安全套接层&#xff09;证书作为加密用户与服务器之间数据传输的利器&#xff0c;扮演着不可或缺的角色。然而&#xff0c;谈及SSL证书时&#xff0c;一个常见的误区是它们通常与域名绑定&#xff0c;而非…

逻辑长路短路“或“运算

长路或运算&#xff08;|&#xff09; 1、长路或运算的运算符&#xff1a; 2、长路或运算在两边都是整数时&#xff0c;是逐位或运算&#xff1b;在两边是关系运算时&#xff0c;是逻辑运算。 3、长路或运算会将两边的关系运算结果都计算出来 【示例】5*3>12 | 4<3…

【运维自动化-配置平台】动态分组功能使用场景

蓝鲸智云配置平台&#xff0c;以下简称配置平台 配置平台的动态分组功能是业务纬度下对同类资源实例的聚合&#xff0c;并且能动态的跟随符合条件的资源实例增多或减少&#xff0c;例如负责人是admin的主机聚合。目前动态分组的结果聚合支持两种 主机集群 主机类型的动态分组…

高性价比的创新选择:气膜水族馆—轻空间

在现代城市规划和旅游发展中&#xff0c;水族馆作为独具特色的休闲娱乐场所&#xff0c;深受游客和投资者的青睐。然而&#xff0c;传统水族馆的建设和维护成本高昂&#xff0c;让许多潜在投资者望而却步。气膜水族馆凭借其高性价比和多重优势&#xff0c;成为了水族馆建设领域…

【小白必备】Meta祭出三篇最详尽的LLaMA微调指南

开源&#xff0c;就要开的彻彻底底。 这不&#xff0c;Meta一连放出三篇技术文章&#xff0c;从大模型适配方法出发&#xff0c;介绍了&#xff1a; 如何使用特定领域数据微调LLM&#xff0c;如何确定微调适配自己的用例&#xff0c;以及如何管理良好训练数据集的经验法则。 接…

大学生家教管理系统

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《大学生家教管理系统》。 随着社会对高质量教育资源的渴求日益增加&#xff0c;家长们越来越倾向于为孩子寻找家教服务。大学生家教因其年轻、有活力、专业基础扎实而备受欢迎。然而&#xff0c;传统的家教市…

【基础算法总结】BFS 解决拓扑排序

BFS 解决拓扑排序 1.拓扑排序简介2.课程表3.课程表 II4.火星词典 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.拓扑排序简介 拓扑排序解…

品牌标志识别检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

品牌标志识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着全球经济的快速发展和市场竞争的日益激烈&a…

转mp3格式3步走:在线转换与简易方法大揭秘

现如今&#xff0c;音频格式的转换成了我们生活中的常事。说到音频格式&#xff0c;很多人可能首先想到的就是mp3。它体积小、兼容性强&#xff0c;几乎成了我们手机、电脑里的必备音频格式。那么&#xff0c;怎样才能轻松地把其他格式的音频转mp3格式呢&#xff1f;今天&#…

imx93烧录

本文主要是介绍如何烧录镜像到开发板 这里以evk板为例&#xff1a; 当编译之后&#xff0c;会在目录build/tmp/deploy/images/imx93evk下看到一堆的镜像文件&#xff0c;包括u-boot/kernel/设备树还有完整的镜像 执行下面的命令进行烧录&#xff1a; sudo ./uuu -b emmc_all …

坐牢第三十一天(c++)

一.作业&#xff1a; 使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 #include <iostream> #include <cstring> // 引入cstring以使用memcpy using namespace std; // 类型重命名 using datatype int; // typedef int datatype; s…

【PyTorch][chapter 27][李宏毅深度学习][transformer-1]

前言&#xff1a; transformer 是深度学习四大基础架构之一,最早Google 发表在NIPS&#xff08;NeurIPS 全称神经信息处理系统大会), 是一种seq2seq 的模型.采用的Encoder-Decoder 结构,应用比较广泛。 比如文本生成&#xff0c;语音转换&#xff0c;视频生成. 相对RNN, LSTM …