Redian新闻
>
终于有人把 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。
至此,一个网络包的发送流程就结束了。

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604215

Linux技术交流群:3861509

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
F1、H-1B、OPT、CPT……这些留美学生身份,你都弄清楚了吗?8 个比 Linux 系统本身还要古老的 Linux 概念“中电科加班事件”,警方查清楚了全文下载 |《网络数据安全风险评估实施指引》公开征求意见终于有人把所有医药细分行业及重点公司彻底讲清楚了!国泰航空又爆歧视?网友告知听不懂 空姐仍全程讲粤语F1、H-1B、OPT、CPT……这些留美身份,你都弄清楚了吗?道人笔记(四)敬长辈谨遵孝悌义,怜家贫常受百家恩附下载!信安标委《网络数据安全风险评估实施指引》发布!什么是涌现?北师大教授讲清楚了ChatGPT的工作原理,这篇文章说清楚了!IPSec和SSL国密数据包分析退休换房,这几个问题你搞清楚了吗?终于有人把室温超导说明白了!如何在 Rocky Linux 9 / AlmaLinux 9 上安装 KVM | Linux 中国这要记录一下终于有人把数据中台讲明白了 | 极客时间景区埋20cm三角钉,致多车被扎?官方查清楚了恐怖的白蚁!想给房客涨房租了……如何在 Linux 系统中使用 Ventoy 创建多重引导的 U 盘 | Linux 中国国务院2023年度立法工作计划:人工智能法、网络数据安全管理条例来了!Open House首场直播|USC新生必看,终于有人把租房这件事说透了港中文李教授:基于AI的网络数据包攻击风险预测|收获一作论文与导师推荐信!沙漠景区竟埋着20厘米三角钉?官方查清楚了道人笔记(二) 通灵异能见鬼神事,巧玄机梦中得“谋”篇道人笔记(三) 生来有奇得蛇族庇护,少年心善爱苍生万物@所有考生、家长,大部分省份高考志愿填报时间已确定,这10个问题你搞清楚了吗?创新领跑:锐捷Wi-Fi 7、WIS网络数字孪生、星空无线3.0开启效率革命终于有人把律所公司制和合伙人制说清楚了技术机制抽象与人类处理知识的过程(认知过程)之间CFA备考中的痛苦、崩溃是常态...坚持的过程也是不断自我重建的过程!以GPU为中心的数据包处理,如何克服DPDK限制?Agustín Hernández:中美洲建筑背景下的未来主义巨构GPT现状终于有人讲清楚了!OpenAI大牛最新演讲爆火,还得是马斯克钦点的天才TUXEDO Stellaris 16(Gen5)是目前所能找到的终极 Linux 笔记本电脑 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。