队列丢数据linux,【队列Linux面试题】面试问题:linux数据… - 看准网

本文详细介绍了Linux系统下数据包从网卡接收直至送达应用程序的完整流程,包括驱动加载、DMA传输、硬中断、软中断处理、网络协议栈的层层解析等关键步骤。NAPI技术用于减少中断请求,提高系统效率。软中断(Softirq)则用于在中断处理之外执行任务,避免长时间占用中断处理器。
摘要由CSDN通过智能技术生成

最近发现了解linux内数据包的传输机制很有必要,首先总结一下接收过程。数据包从hostA向hostB发包,如下图所示:

015611ebcfda70ea13c6b3479dd0d2ee.png

一. linux中包的传输过程

(1).      驱动加载并初始化

(2).      数据包到达网卡(网卡中的缓冲区或队列)

(3).      包通过DMA拷贝到内核内存中的环形缓冲区中(环形缓冲区中的内存区域是驱动进行分配和映射的,分配后驱动会将内存地址和大小告诉网卡NIC;若没有分配好的内存,包可能会丢失;传输前要通过CRC检查包是否有效;若网卡支持硬件层多队列,此时每个队列会对应一个单独的内存区域,多个CPU可以处理这些数据;若支持packet steering,数据也会多个CPU)。现在大多数的网卡都会使用DMA来传输数据包

(4).      产生硬中断来让系统知道一个包已经在内存中了

(5).      驱动通过Ksoftirqd进程通过调用NAPI poll函数将包从环形缓冲区中取出(函数用于监控多个事件,在一个循环中)。Ksoftirqd进程运行在系统中的每个CPU中,它们在boot时就被注册了。NAPI poll函数在设备驱动初始化时被注册

(6).      将数据传输到网络层(IP层),数据格式为skb,便于继续进行处理;网络层检查包是否有效,然后检查以太网报头,删除以太网报头并将包发送到IP层

(7).      IP层通过检查IP头校验,检查包是否有效。判断是否需要IP route。删除IP头部,将包发送到TCP 层

(8).      TCP层会检查包是否有效。搜索与包连接的TCP控制块,搜索到连接后,它用该协议来处理包。如果它收到新的数据,则将数据拷贝或发送到receive socketbuffer

(9).      数据被协议层送到接收缓冲区,socket可以到达

数据包从底层传到上层的过程中,会逐渐拆包,如下图所示:

0b52f2ba84d7582805a996ff48d6b31a.png

二. RQ和Softirq

这里还要解释一下IRQ和Softirq

1. IRQ

当一个数据帧通过DMA被写到RAM,网卡怎样通知系统数据已经准备好被处理了呢?传统方法中,一个网卡会产生一个中断请求(IRQ),代表数据已经到达了。IRQ有三种类型:MSI-X,MSI以及合法IRQ。如果需要传输的数据量很大,将会导致有大量的IRQ产生。产生越多的IRQ,其他任务可分配到越少的CPU时间,因此会占据大量的CPU时间。

NAPI能够减少IRQ的数量,NAPI让设备驱动在驱动初始化时注册一个poll函数,这个函数能够被NAPI调用。网络设备驱动中NAPI的使用是这样的:

(1).      NAPI在初始的时候是off状态,驱动enable它。

(2).      一个数据包到达,网卡通过DMA将其传输到内存中

(3).      一个IRQ由网卡产生,IRQ handler由驱动产生

(4).      驱动会通过softirq(软中断请求)唤醒NAPI子系统。此时会在一个单独的执行线程中调用驱动注册poll函数收包。

(5).      驱动通过NAPI disable后面的IRQ,这通过NAPI子系统来处理包,无须设备中断。

(6).      一旦完成工作,NAPI子系统被disable,IRQ被重新enable

(7).     回到步骤2重新执行

2. Softirq

Linux内核中的Softirq系统是一个机制,能够执行中断handler上下文外的程序。Softirq在驱动中实现。Softirq很重要,硬件中断可能会在中断handler的一部分或全部的过程中被disable。中断disable时间越长,越可能错过一些重要事件。Softirq能够尽可能减少在irq handler里做的事情,使irq handler尽快返回。把大部分可以延迟做得事情放在softirq里做。从而尽快完成任务和enable中断。Softirq系统可以被想象为一系列内核线程(每个CPU一个softirq),能够运行不同softirq事件注册的handler函数。

参考文献:

[1] https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/#ip-protocol-layer

[2] http://www.cubrid.org/blog/dev-platform/understanding-tcp-ip-network-stack/

[3] http://www..com/sammyliu/p/5225623.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值