最近发现了解linux内数据包的传输机制很有必要,首先总结一下接收过程。数据包从hostA向hostB发包,如下图所示:
一. linux中包的传输过程
(1). 驱动加载并初始化
(2). 数据包到达网卡(网卡中的缓冲区或队列)
(3). 包通过DMA拷贝到内核内存中的环形缓冲区中(环形缓冲区中的内存区域是驱动进行分配和映射的,分配后驱动会将内存地址和大小告诉网卡NIC;若没有分配好的内存,包可能会丢失;传输前要通过CRC检查包是否有效;若网卡支持硬件层多队列,此时每个队列会对应一个单独的内存区域,多个CPU可以处理这些数据;若支持packet steering,数据也会多个CPU)。现在大多数的网卡都会使用DMA来传输数据包
(4). 产生硬中断来让系统知道一个包已经在内存中了
(5). 驱动通过Ksoftirqd进程通过调用NAPI p