您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux百科

入门Linux系统收发网络数据包的秘密!

时间:2023-06-02 12:35:01  来源:  作者:码农猿星球

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

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

网络协议栈

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

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

由于 OSI 模型太复杂,提出的只是存在于概念和理论上的一种模型,分层太多,增加了网络工作的复杂性,所以没有大范围应用。

我们比拟常见是TCP/IP 网络模型,Linux 系统正是依照这套网络模型来完成网络协议栈的。

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

1、应用层 对应于OSI参考模型的高层,为用户提供所需求的各种效劳,例如:FTP、Te.NETDNS、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。

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

来源: 码农猿星球



Tags:Linux系   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  Search: Linux系  点击:(10)  评论:(0)  加入收藏
嵌入式Linux系统开发——系统移植概述
一、什么是嵌入式系统 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统。 嵌入...【详细内容】
2024-01-11  Search: Linux系  点击:(81)  评论:(0)  加入收藏
Linux系统开机启动过程详解
摘要:操作系统的启动过程差别不大,Window和Linux的启动都需要【通电】-【自检】-【登录】几个步骤。对Linux系统而言,更详细的启动流程为:通电-->BIOS-->主引导记录(MBR)-->grub引...【详细内容】
2023-12-28  Search: Linux系  点击:(68)  评论:(0)  加入收藏
如何检查Linux系统的开放端口,保障网络安全
概述开放的网络端口是网络最简单的入口点。有时,可能会在从 Internet 外部可见的端口上运行不需要的服务。如果这些服务容易受到攻击,您的网络将持续受到攻击的威胁,因为每天都...【详细内容】
2023-12-18  Search: Linux系  点击:(75)  评论:(0)  加入收藏
在Linux系统中实现容器化的大规模数据分析平台:Hadoop和Spark
在Linux系统中实现容器化的大规模数据分析平台,我们可以利用Hadoop和Spark这两个强大的开源工具。Hadoop是一个分布式计算框架,适用于处理大规模数据集。它提供了分布式文件系...【详细内容】
2023-12-15  Search: Linux系  点击:(155)  评论:(0)  加入收藏
Linux系统设置每隔1小时运行指定命令
在Linux系统中,通常情况下使用crontab命令来设置定时任务,本文以每隔1个小时运行一条指令为例子,和大家一起讨论crontab的用法。具体的操作步骤: 打开终端。 输入命令 crontab -...【详细内容】
2023-12-14  Search: Linux系  点击:(161)  评论:(0)  加入收藏
Linux系统下CPU性能问题分析案例
关于CPU使用率相关重要指标,我们经常在使用top、dstat、vmstat等工具看到,这里解读一下: user(通常缩写为us),代表用户态CPU时间。 nice(通常缩写为ni),代表低优先级用户态CPU时间,nic...【详细内容】
2023-12-06  Search: Linux系  点击:(171)  评论:(0)  加入收藏
Linux系统中软链接和硬链接
硬链接是指在文件系统中创建一个新的文件名,该文件名指向同一个inode(即文件的实际数据块)。硬链接与原始文件具有相同的inode号,它们共享相同的数据块。当删除原始文件时,硬链接...【详细内容】
2023-11-15  Search: Linux系  点击:(223)  评论:(0)  加入收藏
使用SELinux进行Linux系统安全加固
SELinux(Security-Enhanced Linux)是一种在Linux系统中实现强制访问控制(MAC)的安全机制,它能够对系统资源进行细粒度的访问控制,提高系统的安全性和防范能力。在进行Linux系统安...【详细内容】
2023-10-31  Search: Linux系  点击:(338)  评论:(0)  加入收藏
在Linux系统中实现容器化运维监控平台:Prometheus和Grafana
Prometheus和Grafana是在Linux系统中广泛使用的容器化自动化运维监控平台。Prometheus是一款开源的监控和警报工具,而Grafana则是一个数据可视化工具。它们结合起来可以提供...【详细内容】
2023-10-11  Search: Linux系  点击:(324)  评论:(0)  加入收藏
▌简易百科推荐
微软 Win11 Linux 子系统(WSL)发布 2.2.2 版本
IT之家 4 月 8 日消息,微软近日更新 Windows Subsystem for Linux(WSL),最新 2.2.2 版本中带来了诸多改进,重点更新了 nft 规则,可以让 IPv6 流量通过 Linux 容器。图源: dev.to,AI...【详细内容】
2024-04-08    IT之家  Tags:Linux   点击:(6)  评论:(0)  加入收藏
从原理到实践:深入探索Linux安全机制
Linux 是一种开源的类Unix操作系统内核,由Linus Torvalds在1991年首次发布,其后又衍生出许多不同的发行版(如Ubuntu、Debian、CentOS等)。前言本文将从用户和权限管理、文件系统...【详细内容】
2024-03-27  凡夫编程  微信公众号  Tags:Linux安全   点击:(16)  评论:(0)  加入收藏
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  编程技术汇  微信公众号  Tags:Linux   点击:(10)  评论:(0)  加入收藏
Linux 6.9-rc1 内核发布:AMD P-State 首选核心、BH 工作队列
IT之家 3 月 25 日消息,Linus Torvalds 宣布,Linux 6.9 内核的首个 RC(候选发布)版 Linux 6.9-rc1 发布。▲ Linux 6.9-rc1Linus 表示,Linux 内核 6.9 看起来是一个“相当正常”...【详细内容】
2024-03-25    IT之家  Tags:Linux   点击:(11)  评论:(0)  加入收藏
轻松实现Centos系统的软件包安装管理:yum指令实战详解
yum 是一种用于在 CentOS、Red Hat Enterprise Linux (RHEL) 等基于 RPM 的 Linux 发行版上安装、更新和管理软件包的命令行工具。它可以自动解决软件包依赖关系,自动下载并...【详细内容】
2024-02-27  凡夫贬夫  微信公众号  Tags:Centos   点击:(54)  评论:(0)  加入收藏
Win + Ubuntu 缝合怪:第三方开发者推出“Wubuntu”Linux 发行版
IT之家 2 月 26 日消息,一位第三方开发者推出了一款名为“Wubuntu”的缝合怪 Linux 发行版,系统本身基于 Ubuntu,但界面为微软 Windows 11 风格,甚至存在微软 Windows 徽标。据...【详细内容】
2024-02-27    IT之家  Tags:Ubuntu   点击:(49)  评论:(0)  加入收藏
Linux中磁盘和文件系统工作原理解析
在Linux系统中,一切皆文件的概念意味着所有的资源,包括普通文件、目录以及设备文件等,都以文件的形式存在。这种统一的文件系统管理方式使得Linux系统具有高度的灵活性和可扩展...【详细内容】
2024-02-20  王建立    Tags:Linux   点击:(51)  评论:(0)  加入收藏
Linux子系统概览
inux操作系统是一个模块化的系统,由多个子系统组成。这些子系统协同工作,使Linux能够执行各种任务。了解Linux的子系统有助于更好地理解整个操作系统的运作机制。以下是Linux...【详细内容】
2024-02-01    简易百科  Tags:Linux   点击:(76)  评论:(0)  加入收藏
Linux内核:系统之魂与交互之源
内核,作为任何基于Linux的操作系统的心脏,扮演着至关重要的角色。它不仅是计算机系统软件与硬件之间的桥梁,更是确保系统稳定、高效运行的关键。内核提供了一系列核心功能,为上...【详细内容】
2024-02-01  松鼠宝贝    Tags:Linux内核   点击:(68)  评论:(0)  加入收藏
如何确保Linux进程稳定与持久
在Linux系统中,进程的稳定性与持久性对于维持系统的持续运行至关重要。然而,由于各种原因,进程可能会面临崩溃或系统重启的情况。为了确保关键进程能够持续运行,我们必须采取一...【详细内容】
2024-01-19  松鼠宝贝    Tags:Linux进程   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条