3.2 Linux 系统收包流程 本节,我们了解数据包进入网卡(eth0)后,Linux 内核中各个模块是如何相互协作的,对 Linux 系统下网络包的接收过程有个全局性的认识。 总结 Linux 系统收包流程,笔者绘制出图 3-1。 图 3-1 Linux 系统收包流程 当外部网络发送数据包到服务器时,首先由网卡 eth0 接收该数据包。 网卡通过 DMA(Direct Memory Access,直接内存访问)技术,将数据包直接拷贝到内核中的 RingBuffer(环形缓冲区)等待 CPU 处理。RingBuffer 是一种首尾相接的环形数据结构,它的主要作用是作为缓冲区,缓解网卡接收数据的速度快于 CPU 处理数据的速度问题。
本节,我们了解数据包进入网卡(eth0)后,Linux 内核中各个模块是如何相互协作的,对 Linux 系统下网络包的接收过程有个全局性的认识。
总结 Linux 系统收包流程,笔者绘制出图 3-1。
:::center
图 3-1 Linux 系统收包流程
:::
分析 Linux 系统处理网络数据包的过程,我们可以注意到潜在问题:数据包的处理流程过于冗长。整个处理流程涉及到多个网络层协议栈,如数据链路层、网络层、传输层和应用层。这些网络层之间传递数据需要封包/解包,以及频繁的操作系统上下文切换。
对于多数常规应用,Linux 内核的局限性通常无需特别关注。但对于处理大规模并发连接的网络密集型系统,Linux 内核造成的瓶颈就变得不可忽视。除了想办法优化内核网络,业界提出了“绕过内核”的技术思路,如图 3-1 所示的 XDP 和 DPDK 技术,笔者将在 3.4 节中详细介绍它们的原理与区别。
接下来,我们将继续深入 Linux 内核网络模块,研究 Linux 内核是如何过滤、修改和转发数据的。