跳转至

收报分析


基本流程

  • 报文到达网卡
  • 网卡硬件或网卡驱动根据MAC过滤报文
  • 网卡通过DMA将报文存入RAM中,内核sk_buff形式
  • 网卡将报文描述符存入环形接收队列,
    • rx-usecs 指定网卡在收到第一个数据包后,等待多少微秒(usecs,微秒)再触发一次中断。如果在这段时间内有更多包到达,会一起处理,减少中断次数,提高性能。
    • rx-frames 指定网卡在收到多少个数据包后,无论时间是否到达 rx-usecs,都立即触发中断。
  • 网卡发起硬件中断,通知内核有报文

    通过 /proc/interrupts查看硬件中断

  • CPU运行中断处理程序,即驱动代码

    CPU处理网卡硬件中断时,首先会调用网卡驱动注册的中断处理函数(Interrupt Handler)。在Linux内核中,这通常是驱动通过request_irq()注册的回调函数,称为ISR(Interrupt Service Routine)。 简要流程如下: 硬件中断发生 内核中断子系统调度 调用网卡驱动的中断处理函数(如 e1000_intr(), igb_intr(), napi_poll() 等,具体函数名依网卡驱动而定) 中断处理函数负责读取网卡状态、收包、唤醒NAPI poll等操作

  • 驱动触发收报软中断

    ksoftirqd/cpu-number 收报 /proc/softirqs

  • NAPI 从接收队列读取报文 netdev_budget_usecs netdev_budget dev_weight

  • linux申请sk_buff 填充原始数据,接口,移除eth
  • 送完内核协议栈 netif_receive_skb