首页 > 其他分享 >网络接收全流程

网络接收全流程

时间:2024-05-01 12:12:09浏览次数:16  
标签:处理 流程 网络 网卡 内核 进程 接收 数据 CPU

网卡简介

网卡是一块通信硬件。属于数据链路层。用户可以通过电缆或无线相互连接。每一个网卡都有一个独一无二的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)查询

标签:处理,流程,网络,网卡,内核,进程,接收,数据,CPU
From: https://www.cnblogs.com/laobei-uu/p/18169197

相关文章

  • 【网络知识系列】-- 换个角度理解计算机网络
    换个角度理解计算机网络,搭建计网知识框架所谓换个角度,就是从三层物理设备(物理层、数据链路层、网络层)开始,串联起整个网络的工作原理可能有些小伙伴看见物理设备天生就犯困,反手就准备关闭文章,且慢!本文只是简单的介绍这几个设备的功能,并不会涉及复杂的底层硬件原理,不一定严谨,并且......
  • BSP视频教程第30期:UDS ISO14229统一诊断服务CAN总线专题,常用诊断执行流程精讲,干货分享
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 【前言】1、继前面分享了CANopen和J1939的专题后,这次继续为大家分享UDS专题视频第1期。2、统一诊断服务(UnifiedDiagnosticServices,简称UDS)是车用电子的通信协议,是电子控制器ECU中设备诊断用的网......
  • Linux基础之网络管理
    目录网络配置服务管理防火墙配置文件下载wget和curl网络连接信息netstat和ssLinux网络管理涉及一系列任务,包括配置网络接口、设置IP地址、管理网络服务和防火墙等。网络配置网卡命名根据网络接口定义设备:ethX传统的以太网接口命名方式,其中X通常是数字,如eth0等wlan......
  • 在Windows环境下,有一些开源的网络监控软件可供选择,其中一些包括:
     网络监控软件通常根据其功能可以进行以下分类:设备发现与拓扑图:自动发现网络设备和拓扑结构。绘制网络拓扑图,显示设备之间的关系和连接。性能监控与分析:实时监控网络设备和服务器的性能指标,如带宽利用率、CPU使用率、内存使用率等。收集和存储历史性能数据,以便......
  • R语言结合新冠疫情COVID-19对股票价格预测:ARIMA,KNN和神经网络时间序列分析
    原文链接:http://tecdat.cn/?p=24057原文出处:拓端数据部落公众号1.概要本文的目标是使用各种预测模型预测Google的未来股价,然后分析各种模型。Google股票数据集是使用R中的Quantmod软件包从YahooFinance获得的。2.简介预测算法是一种试图根据过去和现在的数据预测未来值的过......
  • 【网络知识系列】Windows路由表详解
    对于路由器的路由表,大家很熟悉,但是Windows的路由表,了解的人不多。一、Windows路由表条目解释1.1查看网卡信息使用ipconfig/all命令查看网卡信息。1.2查看路由表信息使用routeprint命令查看路由表信息。【活动路由】:ActiveRoutes【网络目标/目标网段】:Networkde......
  • 31_网络
    网络网络基础​ 怎么解决通信设备间的通信问题?解决这个问题,各设备就必须要使用同一套通信协议,才能互相理解对方“说的话”,目前在互联网中这个一直被我们使用的协议叫TCP/IP协议簇,简称TCP/IP。其中TCP是TransmissionControlProtocol的简称,它是一种面向连接的、可靠的、基于字节......
  • Unity性能分析(一)流程与工具的使用
    性能分析工作流对于游戏开发是“必备”的,从基本的三方面开始:在修改之前分析:建立基准线在开发过程中分析:确保修改不会影响性能在修改后分析:证明修改产生了预期效果分析工具是开发者的实用工具之一,可以帮助开发者定位代码中的内存问题和性能瓶颈,也能帮助了解Unity引擎底层的运......
  • 网络复习题
    HTTP缓存HTTP缓存是一种存储和重用HTTP响应的机制,以减少服务器的延迟和网络负载。HTTP缓存可以存在于多个位置,包括客户端(如浏览器缓存)、代理服务器(如公司或ISP的缓存服务器)以及原始服务器的附近(如反向代理缓存,例如Varnish或CDN节点)。缓存的实现通常遵循以下步骤:缓存存储:当......
  • 预习一 计算机网络发展史
    计算机网络的发展史可以大致划分为以下几个阶段:起源:1946年,世界上第一台计算机ENIAC在美国诞生。随后的二十多年里,计算机技术一直在寻找与通信技术相结合的发展。20世纪50年代初,美国建立了一个半自动地面防控系统,即SAGE(赛其)系统,这可以看作是网络的雏形。ARPANET阶段:1969年,美国国......