深入网络底层,了解Linux系统收发网络数据包的过程、原理、流程,附图文说明

深入网络底层,了解Linux系统收发网络数据包的过程、原理、流程,附图文说明。

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参考模型的数据链路层。

在这里插入图片描述
接收网络数据包:

在这里插入图片描述
网络数据包到达网卡后,按照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.mzph.cn/news/80947.shtml

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

相关文章

android studio platform使用体验分享(as无法跳转c/c++等native源码的福音,强烈推荐)

hi,粉丝朋友们: 大家好!这些天粉丝朋友们分享了一下Android Studio for Platform 这个最新的google开发的阅读aosp源码的工具,特别适合做原生系统开发。具体官方介绍如下地址: 参考链接:https://developer.…

react的状态管理简单钩子方法

1.recoil useProvider文件: import { atom, useRecoilState } from recoil;const initState atom({key: initState,default: {state: [],}, })// 将业务逻辑拆分到一个单独文件中,方便进行状态管理 export interface StateProps {id: number;text: string;isFini…

异地远程访问本地SQL Server数据库【无公网IP内网穿透】

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 现在我们身边的只能设备越来越多&#xff…

文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题

三、用go语言,给出 RANDOMIZED-SELECT的一个基于循环的版本。 文心一言: 在循环中实现 RANDOMIZED-SELECT 的一个版本可以如下所示。这个版本使用 Go 语言编写,利用随机化来选择一个元素,并在循环中不断地调整选择的元素&#x…

【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)

阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…

HTTP协议(超级详细)

HTTP协议介绍 基本介绍: HTTP:超文本传输协议,是从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议,是基于TCP/IP通信协议来传送数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现&#xff0…

vue组件库开发,webpack打包,发布npm

做一个像elment-ui一样的vue组件库 那多好啊!这是我前几年就想做的 但webpack真的太难用,也许是我功力不够 今天看到一个视频,早上6-13点,终于实现了,呜呜 感谢视频的分享-来龙去脉-大家可以看这个视频:htt…

【C语言】【数据存储】用%u打印char类型?用char存128?

1.题目一&#xff1a; #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }%u 是打印无符号整型 解题逻辑&#xff1a; 1. 原反补互换&#xff0c;截断 -128 原码&#xff1a;10000000…10000000 补码&#xff1a;11111111…10000000…

uniapp项目实践总结(十六)自定义下拉刷新组件

导语&#xff1a;在日常的开发过程中&#xff0c;我们经常遇到下拉刷新的场景&#xff0c;很方便的刷新游览的内容&#xff0c;在此我也实现了一个下拉刷新的自定义组件。 目录 准备工作原理分析组件实现实战演练内置刷新案例展示 准备工作 在components新建一个q-pull文件夹…

LVS负载均衡群集(NAT模式、IP隧道模式、DR模式)

目录 一、集群 1.1 含义即特点 1.2 群集的类型 1.3 LVS 的三种工作模式&#xff1a; 1.4 LVS 调度算法 1.5 负载均衡群集的结构 1.6 ipvsadm 工具 二、NAT模式 LVS-NAT模式配置步骤&#xff1a; 实例&#xff1a; 配置NFS服务器192.168.20.100 配置web1服务器192.168…

C++11线程库简介

前言 在c11之前涉及多线程的问题都是和平台相关的&#xff0c;比如windows和linux都有一套自己的接口&#xff0c;这使得代码的可移植性变差。C11中最重要的特性就是对线程进行了支持&#xff0c;使得C在编程时不再依赖第三方库&#xff0c;而且原子操作中还引入了原子类的概念…

Java计算机毕业设计 基于SpringBoot+Vue的毕业生信息招聘平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

网络请求【小程序】

一、get 二、post 1.获取相应数据 Page({/*** 页面的初始数据*/data: { inptValue:, isArr:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {},onSubmit(){// console.log(this.data.inptValue)//2.后台请求数据wx.request({url: https://tea.qingnian8.com/demoArt/…

CentOS7安装MySQL

文章目录 前言一、MySQL5.71.1 安装wget1.2 下载&安装MySQL的rpm源1.3 修改MySQL安装版本1.4 下载并启动MySQL1.5 开启MySQL远程连接用户 二、MySQL8.0注意事项 前言 CentOS7的安装&#xff0c;采用的是yum的方式安装。 yum方式安装&#xff0c;就类似在Windows下不停的下…

flink时间处理语义

背景 在flink中有两种不同的时间处理语义&#xff0c;一种是基于算子处理时间的时间&#xff0c;也就是以flink的算子所在的机器的本地时间为准&#xff0c;一种是事件发生的实际时间&#xff0c;它只与事件发生时的时间有关&#xff0c;而与flink算子的所在的本地机器的本地时…

机器学习——决策树/随机森林

0、前言&#xff1a; 决策树可以做分类也可以做回归&#xff0c;决策树容易过拟合决策树算法的基本原理是依据信息学熵的概念设计的&#xff08;Logistic回归和贝叶斯是基于概率论&#xff09;&#xff0c;熵最早起源于物理学&#xff0c;在信息学当中表示不确定性的度量&…

WorkPlus | 好用、专业、安全的局域网即时通讯及协同办公平台

自国家于2022年发布的《关于加强数字政府建设的指导意见》以来&#xff0c;我国数字政府建设已经迈入了一个全新的里程碑&#xff0c;迎来了全面改革和深化升级的全新阶段。 WorkPlus作为自主可控、可信安全、专属定制的数字化平台&#xff0c;扮演着政务机关、政府单位以及各…

JDK19特性

文章目录 JAVA19概述1. 记录模式(预览版本)2.Linux/RISC-V 移植3.外部函数和内存 API &#xff08;预览版&#xff09;4.虚拟线程(预览版)5.Vector API &#xff08;第四次孵化&#xff09;6.Switch 模式匹配&#xff08;第三预览版&#xff09;7.结构化并发&#xff08;孵化阶…

【算法专题突破】滑动窗口 - 串联所有单词的子串(15)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;30. 串联所有单词的子串 - 力扣&#xff08;LeetCode&#xff09; 这道题其实也很好理解&#xff0c;看一下示例就基本知道是什么意思了&#xff0c; 主要就是找 s 里面…

基于springboot+vue的药店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…