一包数据怎样穿过 Linux 内核:从网卡中断
Linux 内核处理一包数据,就像过一道长长的收费站。
收包:网卡直接把数据塞进内存。先触发中断喊一声,再批量处理。流量大时靠轮询,免得 CPU 累死。
拆包:内核用 skb 记录这包数据。它不光存内容,还记着路由和协议信息。各层处理时只改指针,不复制整包。
拦包放行:路由决定这包是发给本机还是转走。Netfilter 像沿途的关卡,能查能拦能改地址。Conntrack 负责记住连接状态。
交给应用:UDP 找到对应进程就完事。TCP 还得按状态机来。中间哪层没空或者被拦,包都会丢。
发包:应用一发数据,内核先补齐 MAC 地址。接着交给 qdisc 排队限速。最后驱动把包扔给网卡发出去。
多核与容器:现代网卡会把包分给多个 CPU。容器网络看着复杂,底层也是这套流程。抓包位置不同,看到的内容也不同。
遇到网络不通,别瞎重启服务。顺着这条路径一层层排查,才能揪出到底在哪丢了包。
原文一包数据怎样穿过 Linux 内核:从网卡中断、NAPI 到路由、Netfilter 与 qdisc