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

Linux 网络收包流程

时间:2023-07-24 14:29:58  来源:  作者:咸鱼运维杂谈

哈喽大家好,我是咸鱼

 

我们在跟别人网上聊天的时候,有没有想过你发送的信息是怎么传到对方的电脑上的

 

又或者我们在上网冲浪的时候,有没有想过 html 页面是怎么显示在我们的电脑屏幕上的

 

无论是我们跟别人聊天还是上网冲浪,其实都依靠于计算机网络这项技术

 

计算机网络是指将多台计算机通过通信设备和传输介质连接在一起,使得它们之间能够相互通信、资源共享和协同工作

 

而计算机之间是通过数据包来实现信息传输和信息交换的,数据包是计算机网络中传输数据的基本单位

 

今天咸鱼将以 linux 为例来给大家介绍一下 Linux 是如何实现网络接收数据包的

 

 
网络协议栈&网络子系统

 

在正文开始之前,我们先来了解一下 Linux 中的网络协议模型和网络子系统

 

  • 网络协议模型(网络协议栈)

在 Linux 中,Linux 网络协议栈分成了五层

图片

 

 

其中:

  • 应用层提供 socket 接口来供用户进程访问内核空间的网络协议栈

  • 传输层、网络层协议由 Linux 内核网络协议栈实现

  • 链路层协议靠网卡驱动来实现

  • 物理层协议由硬件网卡实现

 

 

图片

 

 

  • 网络子系统(网络架构

网络子系统是 Linux 内核中的一部分,由多个模块和驱动程序组成,它负责管理和控制系统的网络功能以实现网络通信

 

通过 Linux 网络子系统(网络架构)来实现上述网络协议模型

图片

 

其中

  • System call interface:为应用程序获取内核的网络系统提供了接口,例如 socket

  • Protocol agnostic interface:为和各种传输层协议的网络交互提供的一层公共接口

  • .NETwork protocals:对各种传输层协议的实现,如 TCP、UDP、IP 等

  • Device agnostic interface:为各种底层网络设备抽象出的公共接口,与各种网络设备驱动连接在一起

  • Device drivers:与各种网络设备交互的驱动

 

 
收包流程

 

当 Linux 接收一个数据包的时候,这个包是怎么经过 Linux 的内核从而被应用程序拿到的呢?

图片

 

 

  • 到达网卡(NIC,Network Interface Card)

首先数据包到达网卡之后,网卡会校验接收到的数据包中的目的 mac 地址是不是自己的 MAC 地址,如果不是的话通常就会丢弃掉

 

这种只接受发送给自己的数据包(其余的扔掉)的工作模式称为非混杂模式(Non-Promiscuous Mode)

 

混杂模式(Promiscuous Mode)则是网卡会接收通过网络传输的所有数据包,而不仅仅是发送给它自己的数据包

 

非混杂模式是网卡默认的工作模式,可以尽可能的保护网络安全和减少网络负载

 

网卡在校验完 MAC 地址之后还会校验数据帧(Data Frame)中校验字段 FCS 来一次确保接收到的数据包是正确的

 

  • 网卡硬件缓冲区 ——> 系统内存(ring buffer)

当网卡接收到数据包时,它将数据包的内容存储在硬件缓冲区中,然后通过 DMA 将接收到的数据从硬件缓冲区传输到系统内存中的指定位置,这个位置通常是一个环形缓冲区( ring buffer)

 

DMA(直接内存访问,Direct Memory Access) DMA是一种数据传输技术,允许外设(如网卡、硬盘控制器、显卡等)直接访问计算机内存,而无需经过 CPU 通过 DMA 可以大大提高数据传输的效率,减轻 CPU 的负担

 

  • 触发硬中断

当网卡将数据包 DMA 到用于接收的环形缓冲区(rx_ring)之后,就会触发一个硬中断来告诉 CPU 数据包收到了

 

什么时候会触发一个硬中断,可以通过下面的参数来进行配置:

  • rx-usecs:当过这么长时间过后,一个中断就会被产生

  • rx-frames:当累计接收到这么多个数据帧后,一个中断就会被产生

 

上面的参数配置可以通过下面的命令来查看

​​​​
# 以 centos 7 为例ethtool -c <网卡名称>

 

当 ring buffer 满了之后,新来的数据包将给丢弃

 

ifconfig 查看网卡的时候,可以里面有个 overruns,表示因为环形队列满而被丢弃的包

 

CPU 收到硬中断之后就会停止手中的活,保存上下文,然后去调用网卡驱动注册的硬中断处理函数

 

为数据包分配 skb_buff ,并将接收到的数据拷贝到 skb_buff 缓冲区中

 

当一个数据包经过了网卡引起中断之后,每一个包都会在内存中分配一块区域,称为 sk_buff (套接字缓存,socket buffer )

 

sk_buff  是 Linux 网络的一个核心数据结构

 

  • 触发软中断

网卡的硬中断处理函数处理完之后驱动先 disable 硬中断,然后 enable 软中断

 

ps:待 ring buffer 中的所有数据包被处理完成后,enable 网卡的硬中断,这样下次网卡再收到数据的时候就会通知 CPU

 

内核负责软中断进程 ksoftirqd 发现有软中断请求到来,进行下面的一些操作

# 查看软中断进程
[root@localhost ~]# ps -ef | grep ksoftirqd

 

调用 net_rx_action 函数

 

它会通过 poll 函数去 rx_ring 中拿数据帧,获取的时候顺便把 rx_ring 上的数据给删除

static void net_rx_action(struct softirq_action *h)
{
   struct softnet_data *sd = &__get_cpu_var(softnet_data);
   unsigned long time_limit = jiffies + 2;
   int budget = netdev_budget;
   void *have;

   local_irq_disable();

   while (!list_empty(&sd->poll_list)) {
      ......
       n = list_first_entry(&sd->poll_list, struct napi_struct, poll_list);

       work = 0;
       if (test_bit(NAPI_STATE_SCHED, &n->state)) {
           work = n->poll(n, weight);
           trace_napi_poll(n);
      }

       budget -= work;
  }
}

 

除此之外,poll 函数会把 ring buffer 中的数据包转换成内核网络模块能够识别的 skb 格式(即 socket kernel buffer

 

socket kernel buffer (skb) 是 Linux 内核网络栈处理网络包(packets)所使用的 buffer,它的类型是 sk_buffer

 

3、最后进入 netif _receive_skb 处理流程,它是数据链路层接收数据帧的最后一关

 

根据注册在全局数组 ptype_allptype_base 里的网络层数据帧类型去调用第三层协议的接收函数处理

 

例如对于 ip 包来讲,就会进入到 ip_rcv;如果是 arp 包的话,会进入到 arp_rcv

 

  • 到达网络层(以 IP 协议为例)

IP 层的入口函数在 ip_rcv 函数,调用 ip_rcv 函数进入三层协议栈

 

首先会对数据包进行各种检查(检查 IP Header),然后调用  netfilter  中的钩子函数:NF_INET_PRE_ROUTING

 

netfilter:是 Linux 内核中进行数据包过滤,连接跟踪(Connect Track),网络地址转换(NAT)等功能的主要实现框架

 

该框架在网络协议栈处理数据包的关键流程中定义了一系列钩子点(Hook 点),并在这些钩子点中注册一系列函数对数据包进行处理

 

这些注册在钩子点的函数即为设置在网络协议栈内的数据包通行策略,也就意味着,这些函数可以决定内核是接受还是丢弃某个数据包

 

NF_INET_PRE_ROUTING 会根据预设的规则对数据包进行判断并根据判断结果做相关的处理(修改或者丢弃数据包)

 

处理完成后,数据包交由 ip_rcv_finish 处理,该函数根据路由判决结果,决定数据包是交由本机上层应用处理,还是需要进行转发

 

如果是交由本机处理,则会交由 ip_local_deliver 本地上交流程;如果需要转发,则交由 ip_forward 函数走转发流程

 

  • 到达传输层(以 TCP 为例)

传输层 TCP 处理入口在  tcp_v4_rcv 函数,首先检查数据包的 TCP 头部等信息,确保数据包的完整性和正确性

 

然后去查找该数据包对应的已经打开的 socket ,如果找不到匹配的 socket,表示该数据包不属于任何一个已建立的连接,因此该数据包会被丢弃

 

如果找到了匹配的 socket,TCP 会进一步检查该 socket 和连接的状态,如果状态正常,TCP 会将数据包从内核传输到用户空间,放入 socket 的接收缓冲区(socket receive buffer)

 

  • 应用层获取数据

当数据包到达操作系统内核的传输层时,应用程序可以从套接字的接收缓冲区(socket receive buffer)中读取数据包

 

一般有两种方式读取数据,一种是 recvfrom 函数阻塞在那里等着数据来,这种情况下当 socket 收到通知后,recvfrom 就会被唤醒,然后读取接收队列的数据

 

另一种是通过 epoll 或者 select 监听相应的 socket,当收到通知后,再调用 recvfrom 函数去读取接收队列的数据

 

 
总结

 

 

网络模块可以说是 Linux 内核中最复杂的模块了

 

看起来一个简简单单的收包过程就涉及到许多内核组件之间的交互,如网卡驱动、协议栈,内核ksoftirqd 线程等

 

咸鱼原本打算把收包和发包的流程都写上的,但是光是写收包流程就就要了我半条命了 QAQ

 

等下次有机会把发包的流程也写一下

 

总结一下 Linux 网络收包流程:

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

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

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

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

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

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



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)  加入收藏
站内最新
站内热门
站内头条