linux数据包接收过程

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

linux数据包接收过程_第1张图片

一. 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可以到达


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

linux数据包接收过程_第2张图片

二. 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.cnblogs.com/sammyliu/p/5225623.html





你可能感兴趣的:(网络)