从小白到大佬,入门Linux系统收发网络数据包的秘密/

news2024/10/7 8:27:51

Linux 服务器收到网络数据包,需求经过哪些处置,一步步将数据传给应用进程的呢?应用进程发送数据包时,Linux 又是如何操作将数据包发送进来的呢?今天我们就来聊聊这个话题。

在准备好接纳网络数据包之前,Linux需求做很多准备工作,例如:网络子系统的初始化、协议栈的注册、网卡驱动的初始化、启动网卡等等,只要这些都准备好了之后,才敢真正开端接纳网络包。

网络协议栈

在引见Linux收发网络数据包之前,我们先来理解一下Linux网络协议栈。

国际规范化组织制定了开放式系统互联通讯参考模型(Open System Interconnection Reference Model),也就是 OSI 网络模型,该模型主要有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层。

由于 OSI 模型太复杂,提出的只是存在于概念和理论上的一种模型,分层太多,增加了网络工作的复杂性,所以没有大范围应用。
我们比拟常见是TCP/IP 网络模型,Linux 系统正是依照这套网络模型来完成网络协议栈的。

TCP/IP 网络模型共有 4 层,分别是应用层、传输层、网络层和网络接口层,每一层担任的职能如下:

1、应用层 对应于OSI参考模型的高层,为用户提供所需求的各种效劳,例如:FTP、Telnet、DNS、SMTP等.

2、传输层 对应于OSI参考模型的传输层,为应用层实体提供端到端的通讯功用,保证了数据包的次第传送及数据的完好性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).

3、网络层 对应于OSI参考模型的网络层,主要处理主机到主机的通讯问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还担任数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。

4、网络接口层 与OSI参考模型中的物理层和数据链路层相对应。它担任监视数据在主机和网络之间的交流。事实上,TCP/IP自身并未定义该层的协议,而由参与互连的各网络运用本人的物理层和数据链路层协议,然后与TCP/IP的网络接入层停止衔接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。
91482f50896ca53ae0b6ba1155f75e8d.jpeg

接纳网络数据包

3d621404f53ceed1e8b9cec3cec4a589.jpeg

网络数据包抵达网卡后,依照FIFO次第被存入网卡的接纳队列,网卡经过 DMA 技术,将网络包写入到指定的内存地址(Ring Buffer)。

Ring Buffer是在网卡驱动程序启动时创立和初始化的,存储的是sk_buff缓冲区的描绘符(物理地址和大小等)。

当网络包抵达时,从Ring Buffer获取指向的sk_buff描绘符,经过DMA将数据写入该地址。等sk_buff中的数据交由上层协议栈处置后,Ring Buffer中的描绘更新为新分配的sk_buff。

接着网卡向 CPU 发起硬件中缀,当 CPU 收到硬件中缀恳求后,依据中缀注册表,找到注册的中缀处置函数。

硬件中缀处置函数会做如下的事情:

1、屏蔽网卡的中缀

目的是防止CPU被频繁中缀而无法处置其他任务,屏蔽中缀是通知网卡曾经晓得内存中有数据了,下次再收到数据包直接写内存就能够了,不要再通知 CPU 了。

2、发起软中缀,恢复方才屏蔽的中缀

内核中的 ksoftirqd 线程收到软中缀后,就会调用相应软中缀的处置函数来轮询处置数据,即:从Ring Buffer 中获取一个数据帧,用 sk_buff 表示,作为一个网络包交给网络协议栈从下到上停止逐层处置。

网络协议栈对网络包的处置流程如下:

1、网络接口层

首先,网络接口层检查报文的合法性和正确性,假如不合法或报文校验不正确则丢弃,否则找出上层协议的类型(IPv4还是IPv6),去掉帧头、帧尾,然后交给上层即网络层处置。

2、网络层

网络层取出IP头,判别网络包下一步的走向,是转发还是交给上层。当确认网络包是要发送给本机后,就取出上层协议的类型(比方TCP或UDP),去掉IP头,然后交给传输层处置。

3、传输层

传输层取出 TCP 头或者 UDP 头后,依据四元组【 源 IP、源端口、目的 IP、目的端口 】,找出对应的 Socket,并把数据拷贝到 Socket 的接纳缓冲区。

4、应用层

最后,应用层程序调用 Socket 接口,将内核的 Socket 接纳缓冲区的数据拷贝到应用层的缓冲区。

到这里,一个网络包的接纳过程就完毕了。

发送网络数据包

我们理解了网络包的接纳流程后,就很容易了解网络包的发送流程了。网络包的发送方向,正好跟接纳方向相反。

首先,应用程序调用 Socket 发送网络包的接口。这是一个系统调用,会从用户态堕入到内核态的套接字层中。

套接字层会申请一个内核态的 sk_buff 内存,将用户待发送的数据拷贝到 sk_buff 内存,并将其参加到Socket发送缓冲区等候网络协议栈的处置。

由于网络数据包从应用程序传到内核时是原始数据,协议栈要在原始数据中参加通讯商定才干保证数据抵达效劳端能被正确辨认。网络协议栈从 Socket 发送缓冲区中,取出数据包,然后依照 TCP/IP 栈的分层(传输层、网络层、网络接口层),从上到下逐层停止处置,各层将协议的头信息不时插入到数据包中。

协议栈对发送数据包的处置流程如下:

1、传输层

在传输层,会为器添加TCP头,同时拷贝一个新的 sk_buff 副本 ,这是由于 sk_buff 在抵达网卡发送完成的时分,会被释放掉,而TCP 协议是支持重传的,为确保网络包牢靠传输,在收到对方的 ACK 之前,这个 sk_buff 不能被删除。

2、网络层

在网络层,主要会做这些工作:选取路由(确认下一跳的 IP)、填充 IP 头、netfilter 过滤、对超越 MTU 大小的数据包停止分片。处置完这些工作后会交给网络接口层处置。

3、网络接口层

网络接口层会停止物理地址寻址,以找到下一跳的 MAC 地址,填充帧头和帧尾,将其放到发送队列中。然后触发软中缀通知网卡驱动程序:队列中有新的网络包需求发送。驱动程序收到通知会经过 DMA ,从发送包队列中读出网络帧,并经过DMA将数据写入网卡的FIFO发送队列。

4、网卡设备

网卡设备从FIFO发送队列中取出数据包,将其发送到网络;当发送完成的时分,网卡设备会触发一个硬中缀来释放内存,主要是释放 sk_buff内存和清算 RingBuffer 内存。最后,当收到这个 TCP 报文的 ACK 应对时,传输层就会释放原始的 sk_buff。

至此,一个网络包的发送流程就完毕了。



来源: 码农猿星球

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

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

相关文章

python---基础小总结

1.常量和布尔值相加 当常量和布尔值相加的时候,如果是True就视为1来和常量相加. 反之,如果是False的话就视为0和常量相加. 但是这样的操作是没有任何意义的! 2.EG:以下情况是会报错的! 3.EG:加不加分号都可以,但是最好不加

相机的格式

图片的格式大体上可以分为yuv格式和RGB格式,以及png,jpg格式; 其中yuv格式对应的摄像头的格式可以是YUYV、UYVV、YVYU、VYUY; rgb格式的图片对应的摄像头格式为RGB,BGR,ARGB8888格式; 一、RGB8888和ARGB8888像素格式如果搞混了…

网站反爬虫策略的分析与研究

随着互联网的发展,爬虫技术也越来越成熟,越来越多的网站开始采取反爬虫策略来保护自己的数据和资源。以下是网站反爬虫策略的分析与研究: IP封禁:网站可以通过封禁某些IP地址来防止爬虫的访问。这种方法比较简单,但是容…

使用ChatGPT设计多选题

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Spring-Retry实现及原理

前言 重试,其实我们其实很多时候都需要的,为了保证容错性,可用性,一致性等。一般用来应对外部系统的一些不可预料的返回、异常等,特别是网络延迟,中断等情况。还有在现在流行的微服务治理框架中&#xff0…

PDF4NET 13.1.0 Crack

PDF4NET 13.1.0 添加对云多边形和云方形注释的支持。 2023 年 6 月 1 日 - 16:50 新版本 特征 PDF4NET 添加了对 Cloud polygon 和 Cloud square 注释的支持。在文本标记注释中添加了对四点的支持。重大变化:重构了圆形、方形、折线和多边形注释的边框。PDF4NET.Ren…

Linux-线程基础

Linux线程基础 一,线程概念什么是线程Linux如何实现的线程 二,页表与虚拟内存虚拟内存多级页表 三,线程的特点线程的优点线程的缺点线程异常线程用途线程与进程比较 四,线程控制创建线程线程终止线程等待线程取消线程分离 五&…

python+vue宠物用品商城网站系统3zy71

依照这一现实为基础,设计一个快捷而又方便的网上宠物管理系统是一项十分重要并且有价值的事情。对于传统的宠物管理控制模型来说,在线宠物管理系统具有许多不可比拟的优势,首先是快速更新宠物分类、宠物信息、热销排行榜、宠物寄养&#xff0…

【嵌入式烧录/刷写文件】-1.8-S19文件转换为Hex文件

案例背景(共5页精讲): 有如下一段Motorola S-record(S19/SREC/mot/SX)文件,将其转换为Hex文件。 S0110000486578766965772056312E30352EA6 S123910058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775B S123912078797A7B7C7D7E7F8081…

CodeWhisperer 初体验

今年算是 AI 正式破圈的一年,无数的工具,产品横空出世。无论在面向企业的大语言模型,还是帮助个人的 AI 工具,数不胜数。其中关于 AI 编程助手领域,近年来也涌现了很多不错的产品,例如 Copilot, Cursor, 还…

网络爬虫技术在搜索引擎中的应用

网络爬虫技术在搜索引擎中扮演着非常重要的角色,主要应用在以下几个方面: 网页抓取:搜索引擎需要从互联网上抓取大量的网页,以建立自己的索引库。网络爬虫技术可以帮助搜索引擎快速、高效地抓取网页。 网页解析:搜索引…

vue 自适应的方法

1、使用 filter来处理。 2、使用vue3.x中的 filter ()方法,但是要注意 filter ()方法的返回是一个字符串,在进行渲染时可能会有问题。 3、使用 react. js中的 require ()方法&#x…

实时数仓中数据实时输出的思考与实现

随着数据量不断增长以及提升企业竞争力的需求增长,实时数仓已经成为了许多业务和组织的重要数据架构之一。在实时数仓中,数据实时输入和数据实时分析是关键步骤,但同样重要的是如何将处理后的数据输出到各种目标上。本文将探讨实时数仓中数据…

亚马逊正常购物下单流程是怎么样的?

当您想要在亚马逊上购物时,您可以按照以下步骤进行: 1、登录亚马逊账户:在亚马逊的官方网站上,使用您的亚马逊账户进行登录。如果您还没有账户,可以在网站上注册一个新账户。 2、浏览商品:在亚马逊首页上&…

CASAIM受邀参加广东省科学院幼儿园举行的第二届STEAM科技节暨庆“六一”科普嘉年华活动

今年6月1日是第63个“六一”国际儿童节,恰“接棒”第7个全国科技工作者日。CASAIM受邀参加广东省科学院幼儿园举行的第二届STEAM科技节暨庆“六一”科普嘉年华活动,展示高精度的三维扫描和3D打印技术,为广大儿童送上精彩的科普大礼。 从小朋友…

视图及其缩放

相机控制 在本课中,您将学习如何通过使用 ViewCube 更改模型视图来检查您的设计。 学会环顾四周 在创建设计时,能够从各个方面看到您的设计会有所帮助。 让我们了解如何更改视图。 你能旋转你的视图看看谁在幕后吗?ViewCube(…

最新office365个人和家庭版下载及功能介绍

到了台新联想笔记本,想试试随机带的office365,才发现要有microsoft账户,要重新注册账号。 搞了一圈,很麻烦,发现微软登陆帐号时一直在转圈圈,而无法完成登录。 大概率还是因为服务器在海外的原因。 于是索性…

【企业化架构部署】Apache配置与应用

文章目录 一、构建虚拟web主机1.概述2.httpd服务支持的虚拟主机类型3.构建虚拟Web主机3.1基于域名的虚拟主机3.2基于IP地址的虚拟主机3.3基于端口的虚拟主机 4.Apache连接保持5.Apache访问控制 二、Apache日志管理rotatelogs分隔工具 三、总结1.Web虚拟主机部署步骤2.网页根目录…

【UE5 新手向】网络同步1 —— 开启 Actor 的位置网络同步

新建一个第三人称 C 项目 在播放设置中,将 Number of Players 改为2,并将 Net Mode 改为Play As Listen Server。 播放游戏,可以发现角色默认开启了同步。 停止播放,选中场景中的某个物体。 在 Details 面板选择新建蓝图。 选…

chatgpt赋能python:Python编程实现文件备份功能

Python编程实现文件备份功能 数据对于任何企业都是极其重要的。文件备份是数据备份的一种重要形式。在发生系统损坏、恶意攻击、误操作等情况时能够帮助我们恢复数据。本文将介绍如何使用Python编程实现文件备份功能。 备份的重要性 对于企业而言,数据备份就像是…