目录
文章目录
协议栈收包处理流程概览
- 加载网卡驱动,初始化。
- 数据包从外部网络进入网卡。
- 网卡(通过 DMA)将包拷贝到内核内存中的 ring buffer。
- 产生硬件中断,通知系统收到了一个包。
- 驱动调用 NAPI ,如果轮询(poll)还没有开始,就开始轮询。
- ksoftirqd 软中断调用 NAPI 的 poll 函数从 ring buffer 收包(poll 函数是网卡驱动在初始化阶段注册的;每个 cpu 上都运行着一个 ksoftirqd 进程,在系统启动期间就注册了)。
- ring buffer 里面对应的内存区域解除映射(unmapped)。
- 如果 packet steering 功能打开,或者网卡有多队列,网卡收到的数据包会被分发到多个 cpu。
- 数据包从队列进入协议层。
- 协议层处理数据包。
- 数据包从协议层进入相应 socket 的接收队列。
网络协议栈初始化流程
这需要从 Kernel 的启动流程说起。
1、内核启动
当 Kernel 完成自解压过程后就进入了 Kernel Start 流