首页 > 其他分享 >网卡收发数据包的过程

网卡收发数据包的过程

时间:2023-11-16 16:12:53浏览次数:42  
标签:中断 网卡 收发 buffer 内核 缓冲区 数据包

一、接收数据包的流程

接收数据包是一个复杂的过程,涉及很多底层的技术细节,但大致需要以下几个步骤:

  1. 网卡收到数据包。
  2. 将数据包从网卡硬件缓存转移到服务器内存中。
  3. 通知内核处理。
  4. 经过TCP/IP协议逐层处理。
  5. 应用程序通过read()socket buffer读取数据。

将网卡收到的数据包转移到主机内存(NIC与驱动交互)

      NIC在接收到数据包之后,首先需要将数据同步到内核中,这中间的桥梁是rx ring buffer。它是由NIC和驱动程序共享的一片区域,事实上,rx ring buffer存储的并不是实际的packet数据,而是一个描述符,这个描述符指向了它真正的存储地址,具体流程如下:

  1. 驱动在内存中分配一片缓冲区用来接收数据包,叫做sk_buffer
  2. 将上述缓冲区的地址和大小(即接收描述符),加入到rx ring buffer。描述符中的缓冲区地址是DMA使用的物理地址;
  3. 驱动通知网卡有一个新的描述符;
  4. 网卡从rx ring buffer中取出描述符,从而获知缓冲区的地址和大小;
  5. 网卡收到新的数据包;
  6. 网卡将新数据包通过DMA直接写到sk_buffer中。

 

           当驱动处理速度跟不上网卡收包速度时,驱动来不及分配缓冲区,NIC接收到的数据包无法及时写到sk_buffer,就会产生堆积,当NIC内部缓冲区写满后,就会丢弃部分数据,引起丢包。这部分丢包为rx_fifo_errors,在/proc/net/dev中体现为fifo字段增长,在ifconfig中体现为overruns指标增长。

通知系统内核处理(驱动与Linux内核交互)

  这个时候,数据包已经被转移到了sk_buffer中。前文提到,这是驱动程序在内存中分配的一片缓冲区,并且是通过DMA写入的,这种方式不依赖CPU直接将数据写到了内存中,意味着对内核来说,其实并不知道已经有新数据到了内存中。那么如何让内核知道有新数据进来了呢?答案就是中断,通过中断告诉内核有新数据进来了,并需要进行后续处理。

提到中断,就涉及到硬中断和软中断,首先需要简单了解一下它们的区别:

  • 硬中断: 由硬件自己生成,具有随机性,硬中断被CPU接收后,触发执行中断处理程序。中断处理程序只会处理关键性的、短时间内可以处理完的工作,剩余耗时较长工作,会放到中断之后,由软中断来完成。硬中断也被称为上半部分。
  • 软中断: 由硬中断对应的中断处理程序生成,往往是预先在代码里实现好的,不具有随机性。(除此之外,也有应用程序触发的软中断,与本文讨论的网卡收包无关。)也被称为下半部分。

        当NIC把数据包通过DMA复制到内核缓冲区sk_buffer后,NIC立即发起一个硬件中断。CPU接收后,首先进入上半部分,网卡中断对应的中断处理程序是网卡驱动程序的一部分,之后由它发起软中断,进入下半部分,开始消费sk_buffer中的数据,交给内核协议栈处理。

 

     通过中断,能够快速及时地响应网卡数据请求,但如果数据量大,那么会产生大量中断请求,CPU大部分时间都忙于处理中断,效率很低。为了解决这个问题,现在的内核及驱动都采用一种叫NAPI(new API)的方式进行数据处理,其原理可以简单理解为 中断+轮询,在数据量大时,一次中断后通过轮询接收一定数量包再返回,避免产生多次中断。

标签:中断,网卡,收发,buffer,内核,缓冲区,数据包
From: https://www.cnblogs.com/yuanqiangfei/p/17836524.html

相关文章

  • STM32 HAL 使用串口IDLE中断+DMA实现收发
    STM32HAL使用串口IDLE中断+DMA实现收发cubeMX配置mx配置如下(省去系统时钟,烧录口,工程属性配置)注意:这里关闭ForceDMAchannelsInterrupts然后按下面配置即可(TX和RX的DMA都是normal模式)代码部分uart_com.h:#ifndef__UART_COM_H__#define__UART_COM_H__#include"......
  • 收发红包
    问题没有人没抢过红包吧……这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。输入格式:输入第一行给出一个正整数N(≤10​4),即参与发红包和抢红包的总人数,则这些人从1到N编号。随后N行,第i行给出编号为i的人发红包的记录,格式如下:KN1P1......
  • 查询window开启的服务及命令跟踪服务器计算机 TCP/IP 数据包
    一、要求在DOS窗口中使用一条命令查询服务器计算机查询该计算机开启了哪些服务实现过程:1)WIN+R调出命令提示框;2)输入DOS命令:netstart二、在服务器计算机上通过命令跟踪服务器计算机TCP/IP数据包从该计算机到赛场云服务器所通过的路径。实现过程:1)WIN+R调出命令提示框;2)输......
  • DP4301-M无线模块一款SUB-1G无线收发模块无线抄表智能家居手持设备
    DP4301-M无线模块是一款低成本高效率工作于1GHz以内的收发模块,支持中国智能电无线集抄标准470MHz~510MHz,兼容433MHzISM/SRD频段均可使用。此模块且前已经超大量应用于国标智能无线抄表及物联网自组网等双向数据传输系统方案,模块具备的低功耗、高接收灵敏度、高发射功率诸多优......
  • LINUX 图形界面无网卡,命令行DOWN
    本文只针对部分情况,网卡未加入托管导致本人遇到的问题虚拟机开启ifconfig没有ens33网卡,无法上网,同时图形化模式没有有线连接选项手动启动网卡提示:Connection'ens33'isnotavailableondeviceens33becausedeviceisstrictlyunmanaged1有一种临时方案:dhclien......
  • 服务器发送了一个意外的数据包。 received: 3, expected: 20
     [root@node02local]#vim/etc/ssh/sshd_config#最后一行添加[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1[root@node02local]#systemctlreloadsshd ......
  • 将笔记本电脑的无线网卡变成AP
    全部使用命令行操作:1、查看是否支持:netshwlanshowdrivers如果有:支持的承载网络 :是2、设备无线AP:netshwlansethostednetworkmode=allowssid=testkey=123456783、启动AP:netshwlanstarthostednetwork4、关闭AP:netshwlanstophostednetwork ......
  • Esxi 6.7下面的网卡驱动问题
    前话:我们在运维VMware ESXI主机时,经常会遇到紫屏,网络中断,存储访问慢等种疑难杂症。大多时间都是感觉无从下手,只能截图,重启,收集日记,上报厂家CASE。厂家大多的答复是固件,驱动的兼容问题。今天就分享一下如何使用ESXICLI 命令查询三个重灾区:网卡,HBA,RIAD卡信息。esxcli networknic......
  • SUB-1G芯片---PAN3031低功耗远距离无线收发芯片
    PAN3031是一款采用ChirpIoTTM调制解调技术的低功耗远距离无线收发芯片,支持半双工无线通信,工作频段为370~590MHz和740~1180MHz,该芯片具有高抗干扰性、高灵敏度、低功耗和超远传输距离等特性。最高具有-129dBm的灵敏度,22dBm的最大输出功率,产生业界领先的链路预算,使其成为......
  • CC1101 一款低功耗sub- 1ghz收发器芯片 适用于无线遥控智能家居
    产品描述CC1101是一个低成本的sub-1ghz收发器,专为极低功耗的无线应用而设计。该电路主要用于工业、科学和医学)和SRD(ShortRangeDevice)频带,在315,433,868和915兆赫,但可以轻松可编程用于其他操作频率在300-348MHz、387-464MHz,以及779-928MHz频段。射频收发器集成了一......