您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

Linux 网络发包流程

时间:2023-08-17 14:27:30  来源:微信公众号  作者:咸鱼运维杂谈

之前咸鱼在《linux 网络收包流程》一文中介绍了 Linux 是如何实现网络接收数据包的

 

简单回顾一下:

  • 数据到达网卡之后,网卡通过 DMA 将数据放到内存分配好的一块 ring buffer 中,然后触发硬中断

  • CPU 收到硬中断之后简单的处理了一下(分配 skb_buffer),然后触发软中断

  • 软中断进程 ksoftirqd 执行一系列操作(例如把数据帧从 ring ruffer上取下来)然后将数据送到三层协议栈中

  • 在三层协议栈中数据被进一步处理发送到四层协议栈

  • 在四层协议栈中,数据会从内核拷贝到用户空间,供应用程序读取

  • 最后被处在应用层的应用程序去读取

 

当 Linux 要发送一个数据包的时候,这个包是怎么从应用程序再到 Linux 的内核最后由网卡发送出去的呢?

 

那么今天咸鱼将会为大家介绍 Linux 是如何实现网络发送数据包

 

 
发包流程

 

假设我们的网卡已经启动好(分配和初始化 RingBuffer) 且 server 和 client 已经建立好 socket

 

这里需要注意的是,网卡在启动过程中申请分配的 RingBuffer 是有两个:

  • igb_tx_buffer 数组:这个数组是内核使用的,用于存储要发送的数据包描述信息,通过 vzalloc申请的

  • e1000_adv_tx_desc 数组:这个数组是网卡硬件使用的,用于存储要发送的数据包,网卡硬件可以通过 DMA 直接访问这块内存,通过 dma_alloc_coherent分配

 

igb_tx_buffer 数组中的每个元素都有一个指针指向 e1000_adv_tx_desc

 

这样内核就可以把要发送的数据填充到 e1000_adv_tx_desc 数组上

 

然后网卡硬件会直接从 e1000_adv_tx_desc 数组中读取实际数据,并将数据发送到网络上

 

图片

 

 
拷贝到内核

 

  • socket 系统调用将数据拷贝到内核

应用程序首先通过 socket 提供的接口实现系统调用

 

我们在用户态使用的 send 函数和 sendto 函数其实都是 sendto 系统调用实现的

 

send/sendto函数 只是为了用户方便,封装出来的一个更易于调用的方式而已

 

图片

 

sendto 系统调用内部,首先 sockfd_lookup_light 函数会查找与给定文件描述符(fd)关联的 socket

 

接着调用 sock_sendmsg 函数(sock_sendmsg ==> __sock_sendmsg ==> __sock_sendmsg_nosec

 

其中 sock->ops->sendmsg 函数实际执行的是 .NET_sendmsg 协议栈函数

图片

 

这时候内核会去找 socket 上对应的具体协议发送函数

 

以 TCP 为例,具体协议发送函数为 tcp_sendmsg

图片

 

tcp_sendmsg 会去申请一个内核态内存 skb(sk_buff) ,然后挂到发送队列上(发送队列是由 skb 组成的一个链表)

图片

 

接着把用户待发送的数据拷贝到 skb 中,拷贝之后会触发【发送】操作

 

这里说的发送是指在当前上下文中,待发送数据从 socket 层发送到传输层

 

需要注意的是,这时候不一定开始真正发送,因为还要进行一些条件判断(比如说发送队列中的数据已经超过了窗口大小的一半)

 

只有满足了条件才能够发送,如果没有满足条件这次系统调用就可能直接返回了

 

 
网络协议栈处理

 

  • 传输层处理

接着数据来到了传输层

 

传输层主要看 tcp_write_xmit 函数,这个函数处理了传输层的拥塞控制、滑动窗口相关的工作

 

该函数会根据发送窗口和最大段大小等因素计算出本次发送的数据大小,然后将数据封装成 TCP 段并发送出去

 

如果满足窗口要求,设置 TCP 头然后将数据传到更低的网络层进行处理

 

在传输层中,内核主要做了两件事:

  • 复制一份数据(skb)

为什么要复制一份出来呢?因为网卡发送完成之后,skb 会被释放掉,但 TCP 协议是支持丢失重传的

 

所以在收到对方的 ACK 之前必须要备份一个 skb 去为重传做准备

 

实际上一开始发送的是 skb 的拷贝版,收到了对方的 ACK 之后系统才会把真正的 skb 删除掉

 

  • 封装 TCP 头

系统会根据实际情况添加 TCP 头封装成 TCP 段

 

这里需要知道的是:每个 skb 内部包含了网络协议中的所有头部信息,例如 mac 头、IP 头、TCP/UDP 头等

 

在设置这些头部时,内核会通过调整指针的位置来填充相应的字段,而不是频繁申请和拷贝内存

图片

比如说在设置 TCP 头的时候,只是把指针指向 skb 的合适位置。后面再设置 IP 头的时候,再把指针挪一挪就行

 

这种方式利用了 skb 数据结构的链表特性可以避免内存分配和数据拷贝所带来的性能开销,从而提高数据传输的效率

 

  • 网络层处理

数据离开了传输层之后,就来到了网络层

 

网络层主要做下面的事情:

  • 路由项查找:

根据目标 IP 地址查找路由表,确定数据包的下一跳(ip_queue_xmit 函数)

 

  • IP 头设置:

根据路由表查找的结果,设置 IP 头中的源和目标 IP 地址、TTL(生存时间)、IP 协议等字段

 

  • netfilter 过滤:

netfilter 是 Linux 内核中的一个框架,用于实现数据包的过滤和修改

 

在网络层,netfilter 可以用于对数据包进行过滤、NAT(网络地址转换)等操作

 

  • skb 切分:

如果数据包的大小超过了 MTU(最大传输单元),需要将数据包进行切分成多个片段,以适应网络传输,每个片段会被封装成单独的 skb

 

  • 数据链路层处理

当数据来到了数据链路层之后,会有两个子系统协同工作,确保数据包在发送和接收过程中能够正确地对数据进行封装、解析和传输

 

  • 邻居子系统

管理和维护主机或路由器与其它设备之间的邻居关系

 

邻居子系统里会发送 arp 请求找邻居,然后把邻居信息存在邻居缓存表里,用于存储目标主机的 MAC 地址

 

当需要发送数据包到某个目标主机时,数据链路层会首先查询邻居缓存表,以获取目标主机的 MAC 地址,从而正确地封装数据包(封装 MAC 头)

 

  • 网络设备子系统

网络设备子系统负责处理与物理网络接口相关的操作,包括数据包的封装和发送,以及从物理接口接收数据包并进行解析

 

网络设备子系统不但处理数据包的格式转换,如在以太网中添加帧头和帧尾,以及从帧中提取数据

 

还负责处理硬件相关的操作,如发送和接收数据包的时钟同步、物理层错误检测等

 

  • 到达网卡发送队列

接着网络设备子系统会选择一个合适的网卡发送队列并把 skb 添加到队列中(绕过软中断处理程序)

 

然后,内核会调用网卡驱动的入口函数 dev_hard_start_xmit 来触发数据包的发送

 

在一些情况下,邻居子系统还会将 skb 数据包添加到软中断队列(softnet_data)上,并触发软中断(NET_TX_SOFTIRQ)

 

这个过程是为了将 skb 数据包交给软中断处理程序进行进一步处理和发送。软中断处理程序会负责实际的数据包发送

 

这就是为什么一般服务器上查看 /proc/softirqs,一般 NET_RX 都要比 NET_TX 大的多的原因之一

 

即对于收包来说,都是要经过 NET_RX 软中断;而对于发包来说,只有某些情况下才触发 NET_TX 软中断

 

 
数据发送

图片

 

驱动程序从发送队列中读取 skb 的描述信息,将其挂到 RingBuffer 上(前面提到的igb_tx_buffer 数组)

 

接着将 skb 的描述信息映射到网卡可访问的内存 DMA 区域中(前面提到的e1000_adv_tx_desc 数组)

 

网卡会直接从 e1000_adv_tx_desc 数组中根据描述信息读取实际数据并将数据发送到网络。这样就完成了数据包的发送过程

 

 
收尾工作

当数据发送完成后,网卡设备会触发一个中断(NET_RX_SOFTIRQ),这个中断通常称为“发送完成中断”或者“发送队列清理中断”

 

这个中断的主要作用是执行发送完成的清理工作,包括释放之前为数据包分配的内存,即释放 skb 内存和 RingBuffer 内存

 

最后,当收到这个 TCP 报文的 ACK 应答时,传输层就会释放原始的 skb(前面有讲到发送的其实是 skb 的拷贝版)

 

可以看到,当数据发送完成以后,通过硬中断的方式来通知驱动发送完毕,而这个中断类型是 NET_RX_SOFTIRQ

 

前面我们讲到过网卡收到一个网络包的时候,会触发 NET_RX_SOFTIRQ中断去告诉 CPU 有数据要处理

 

也就是说,无论是网卡接收一个网络包还是发送网络包结束之后,触发的都是  NET_RX_SOFTIRQ

 

 
总结

 

最后总结一下在 Linux 系统中发送网络数据包的流程:

图片

 

最后总结一下在 Linux 系统中发送网络数据包的流程:

  • 传输层处理:以 TCP 为例,在传输层中会复制一份数据(为了丢失重传),然后为数据封装 TCP 头

  • 网络层处理:选取路由(确认下一跳的 IP)、填充 IP 头、netfilter 过滤、对超过 MTU 大小的数据包进行分片等操作

  • 邻居子系统和网络设备子系统处理:在这里数据会被进一步处理和封装,然后被添加到网卡的发送队列中

  • 应用程序通过 socket 提供的接口进行系统调用,将数据从用户态拷贝到内核态的 socket 缓冲区中

  • 网络协议栈从 socket 缓冲区中拿取数据,并按照 TCP/IP 协议栈从上到下逐层处理

  • 驱动程序从发送队列中读取 skb 的描述信息然后挂在 RingBuffer 上,接着将 skb 的描述信息映射到网卡可访问的内存 DMA 区域中

  • 网卡将数据发送到网络

  • 当数据发送完成后触发硬中断,释放  skb 内存和 RingBuffer 内存



Tags:网络   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
谷歌推出适用于安卓设备的“查找我的设备”网络
IT之家 4 月 9 日消息,谷歌今日推出了适用于安卓设备的“查找我的设备”网络,其功能类似于苹果的“查找”网络,旨在帮助用户定位丢失、被盗的安卓产品。IT之家注意到,与苹果的“...【详细内容】
2024-04-09  Search: 网络  点击:(2)  评论:(0)  加入收藏
手机就可以修改WiFi密码,进行网络提速,还能防止别人蹭网
随着网络的普及和使用频率的增加,很多人可能遇到了一些网络管理上的问题,比如忘记了WiFi密码、网络速度缓慢、或者发现有不明设备在家中蹭网。相信朋友们也曾遇到过吧?但是,你知...【详细内容】
2024-04-03  Search: 网络  点击:(5)  评论:(0)  加入收藏
数据可视化在网络安全中的关键作用
在当今数字化时代,网络安全已成为各大企业乃至国家安全的重要组成部分。随着网络攻击的日益复杂和隐蔽,传统的网络安全防护措施已难以满足需求,急需新型的解决方案以增强网络防...【详细内容】
2024-03-29  Search: 网络  点击:(19)  评论:(0)  加入收藏
中国职业网络主播人数达1508万名
中新社成都3月27日电(记者 岳依桐)中国网络视听节目服务协会27日在成都发布《中国网络视听发展研究报告(2024)》(简称《报告》)。《报告》显示,随着中国网络视听用户规模持续...【详细内容】
2024-03-28  Search: 网络  点击:(13)  评论:(0)  加入收藏
AI时代的网络安全:探索AI生成的网络攻击
译者 | 晶颜审校 | 重楼长期以来,网络攻击一直是劳动密集型的,需要经过精心策划并投入大量的人工研究。然而,随着人工智能技术的出现,威胁行为者已经成功利用它们的能力,以非凡的...【详细内容】
2024-03-27  Search: 网络  点击:(14)  评论:(0)  加入收藏
网络工程师天天都在说的PING,到底是什么东东?
网络工程师天天都在说的PING,到底是什么东东?ICMP(Internet Control Message Protocol)是一个网络层协议,用于在IP网络中的设备之间传输控制消息。这些消息用于提供有关网络通信...【详细内容】
2024-03-27  Search: 网络  点击:(17)  评论:(0)  加入收藏
网络安全--域名过滤功能详解
路由器的域名过滤功能是一种网络安全机制,允许管理员控制局域网内的设备对互联网上特定域名(即网站)的访问。这一功能主要用于家长控制、企业网络管理或者其它需要限制网络使用...【详细内容】
2024-03-26  Search: 网络  点击:(5)  评论:(0)  加入收藏
如何使用免费网络安全工具Canary Tokens查明黑客何时访问了您的文件?
译者 | 布加迪审校 | 重楼担心您的个人文件被黑客窃取吗?Canary Tokens是一款免费且易于使用的工具,可以快速部署。如果黑客打开您的文件,它就会通知您。什么是Canary Tokens?Ca...【详细内容】
2024-03-26  Search: 网络  点击:(13)  评论:(0)  加入收藏
国家安全部:95后“技术宅”遇间谍网络勾连,共享国家级项目数据后次日举报获奖
国家安全部微信公众号3月25日发文介绍一起网勾案件,全文如下:2023年,某高新技术企业的青年设计师阿强,拨打国家安全机关12339举报受理电话称,某科技论坛上一名昵称“暗影Dark”的...【详细内容】
2024-03-25  Search: 网络  点击:(18)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22  Search: 网络  点击:(10)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(11)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(31)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(35)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(37)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(69)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(59)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(40)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(144)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(48)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(76)  评论:(0)  加入收藏
站内最新
站内热门
站内头条