网络接收全流程

news/2024/10/15 14:17:11

网卡简介

网卡是一块通信硬件。属于数据链路层。用户可以通过电缆或无线相互连接。每一个网卡都有一个独一无二的MAC地址(48位),它被写在卡上的一块ROM中。IEEE负责为网卡销售商分配唯一的MAC地址。

可以在终端运行sudo lshw -C network来查看网卡型号
可以在/lib/modules/$(uname -r)/kernel/drivers/net路径下找到网卡驱动

网卡以前是作为扩展卡插到计算机总线上的,但是由于其价格低廉而且以太网标准普遍存在,大部分新的计算机都在主板上集成了网络接口。除非需要多接口,否则不再需要一块独立的网卡。甚至更新的主板可能含有内置的双网络(以太网)接口。

网卡的四种传输技术(和其他IO设备差不多)

  • 轮询,即微处理器在程序控制下检查外设的状态
  • 过程化I/O,即微处理器通过将地址送到系统地址总线上来通知制定的周边设备
  • 中断驱动I/O,即当外设准备好传送数据时通知微处理器
  • DMA,需要网卡上拥有一个独立的处理器


网卡接收数据

简单的内核源码分析
在电脑启动,加载内核时,网卡驱动程序就会申请一块共享内存作为缓冲区,称为Ring Buffer

  • 由驱动程序使用内核的fifo数据结构创建的环形缓冲区,其空间通过内核分配,因此位于内核的数据段中
  • Ring Buffer 不直接存储 Packet。初始状态下,Ring Buffer 队列每个槽中存放的 Packet Descriptor 指向 sk_buff ,状态均为 ready

当网卡接收到数据时,网卡做了两件事

  • 通过DMA将数据保存到 sk_buff 中
  • 通过硬中断通知内核,可以来处理数据了

CPU收到中断后,也做了两件事

  • 系统切换为内核态,处理 Interrupt Handler,从RingBuffer 拿出一个 Packet, 并处理协议栈,填充 Socket 并交给用户进程
  • CPU 切换为用户态,用户进程处理数据内容

一个简单的示意图

更为详细的说明,可以参考这位大佬的文章



性能瓶颈

一、用户进程阻塞

网卡接收到数据的延迟,取决于传输时延+传播时延,一般都是毫秒级别的,但应用程序处理数据的速度是纳秒级别的。
也就是说,CPU在内核态可能要花上500ms等待并移交数据,在用户态可能只要0.5ms就能处理完这些数据,在499.5ms这段时间内,用户进程无事可做,只能进入阻塞态。

二、频繁处理中断

如果频繁的收到数据包,NIC 可能频繁发出中断请求,这时CPU必须切换到内核态。在极端情况下,如果内核处理前一个协议栈,填充 Socket 还没结束,就要去处理下一个中断,会导致用户进程的饥饿。(即便是多核CPU也会面临这种情况)



处理瓶颈

一、解决频繁中断

解决思路:
最开始,内核每处理好一个数据,就向上层应用提交,CPU就要从内核切换到用户,如果处理10个数据,就要上下文切换20次。
但如果内核一次性处理完这10个数据,再一并提交,只需2次切换,节省开销。

在 NIC 上,解决频繁 IRQ 的技术叫做 New API(NAPI)

  • napi_schedule(),专门快速响应 IRQ,只记录必要信息,并在合适的时机发出软中断 softirq
  • netrxaction(),在另一个进程中执行,专门响应 napi_schedule 发出的软中断,批量的处理 RingBuffer 中的数据

二、解决用户进程频繁切换

这一条优化一般用于服务器端,需要连接多个信道,如果每个连接都由一个进程/线程管理,那么切换进程/线程的开销就会比较大。并且进程/线程可能会被阻塞,对其唤醒也需要开销。

解决思路:

  • 只设置一个进程/线程统一管理全部连接
  • 改为非阻塞

即创建一个监视进程/线程,内部采用IO多路复用管理所有连接
(1)select
每次 socket 状态变化,监视进程必须遍历一遍 socket 数组O(n),才知道哪些 socket 就绪了。
(2)epoll
底层采用红黑树 + 双向链表,可以实现O(1)查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/26485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

《痞子衡嵌入式半月刊》 第 99 期

痞子衡嵌入式半月刊: 第 99 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

Codeforces Round 942 Div.2 题解

ds 这么聪明的。蹭个热度,挽救一下 cnblogs 蒸蒸日上的阅读量。Q: 你是手速狗吗? A: 我觉得我是。2A 因为选的 \(w\) 一定可以让它合法,一次操作可以看作 \(a\) 数组向右平移一位。枚举操作次数后暴力判断即可。 #include <bits/stdc++.h>void work() {int n;std::cin…

linux下调试串口设备

USB转串口常用CH34x芯片,该芯片有linux下的驱动。 在默认情况下,大部分linux发行版都包含了CH34x的驱动,唯一缺点就是版本比较久。 可以先插上开发板, 一般是挂载到/dev/ttyCH341USB0文件下,如果该文件不存在,有两种可能,一种是驱动版本太久,可以下载官方的驱动文件,然…

BSP视频教程第30期:UDS ISO14229统一诊断服务CAN总线专题,常用诊断执行流程精讲,干货分享,图文并茂(2024-04-30)

视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 【前言】 1、继前面分享了CANopen和J1939的专题后,这次继续为大家分享UDS专题视频第1期。 2、统一诊断服务(Unified Diagnostic Services,简称UDS)是车用电子的通信协议,是电子控制器EC…

Reverse Card (Hard Version)

事情是这样的,我验了这一场 CF。显然我玩原神玩多了有一个很奇怪的、不能过的算法,哦,当然,在我本机可以过。为了展现自己的智慧糖,我写一下。 出题人是先发给我了一个限制都是 \(n\) 的,因此只有这个。\(n,m\) 改改就是了。 要求 \(1\le a\le n,1\le b\le n\) 满足\(a+b…

IDEA在运行maven打war的时候报错:Cannot access defaults field of Properties

问题描述:解决方案 在pom.xml文件中引入:<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.1</version></plugin></plugins>…

重链剖分题目选讲

染色 给定一棵 \(n\) 个节点的无根树,共有 \(m\) 个操作,操作分为两种:将节点 \(a\) 到节点 \(b\) 的路径上的所有点(包括 \(a\) 和 \(b\))都染成颜色 \(c\)。 询问节点 \(a\) 到节点 \(b\) 的路径上的颜色段数量。颜色段的定义是极长的连续相同颜色被认为是一段。例如 1…

轻松使用Aspire rabbitmq framework

轻松使用aspire rabbitmq 创作初衷 aspire 是微软基金会推出的新一代云原生编排框架,具体请看 https://learn.microsoft.com/en-us/dotnet/aspire/get-started/aspire-overview 我从preview1 - preview6(目前最新 2024/5/1) 一直都有使用,在第一版的时候我就用它放入了我的…