人人都会AI编程

7.1 Linux TCP/IP 协议栈实现:四层模型与内核对应层级

更新时间:2026-07-12

在计算机网络中,TCP/IP 协议族通常被划分为四个抽象层次:应用层、传输层、网络层和网络接口层(也称链路层)。每个层次负责不同的通信功能,而 Linux 内核的网络栈正是严格按照这一分层模型实现的。理解这些层级在内核中的具体位置,对于网络调优、故障排查甚至编写高性能网络程序都至关重要。


1. 四层模型速览

| 层级 | 典型协议 | 主要职责 |
| -------------- | ----------------------- | ---------------------------------- |
| 应用层 | HTTP、SSH、DNS、SMTP | 为应用程序提供具体的网络服务 |
| 传输层 | TCP、UDP、SCTP | 提供端到端的可靠或不可靠数据传输 |
| 网络层 | IP、ICMP、IGMP | 负责主机到主机的寻址与路由 |
| 网络接口层 | Ethernet、ARP、Wi-Fi | 负责在物理介质上传输比特流,以帧为单位 |

在 Linux 系统中,这四层分别映射到用户空间内核空间的不同组件,数据包从应用产生到线路发送会依次穿过这些层级。


2. 内核中的分层实现

Linux 内核的网络代码主要集中在 net/ 目录下,设备驱动则位于 drivers/net/。它的实现严格遵循分层思想,每一层都有对应的数据包处理函数和数据结构。

(1)网络接口层 —— 内核设备驱动

这一层直接操作物理网卡或虚拟网卡,负责处理链路层帧。内核使用 struct sk_buff 管理数据包,网卡驱动将接收到的帧转换为 sk_buff,然后剥离链路层头部(如以太网头),将数据向上传递给网络层;发送时则从上层接收 sk_buff,添加链路层头部并通过硬件发送。

对应内核源码路径:drivers/net/(各种网卡驱动)、net/core/dev.c(通用设备接口,netif_receive_skb() 等收包函数)。

(2)网络层 —— IPv4/IPv6 实现

网络层完成 IP 包的收发、路由查找和重组等核心工作。IPv4 的实现集中在 net/ipv4/ 目录,入口函数包括 ip_rcv()(收包)和 ip_queue_xmit()(发包)。这一层会检查 IP 头校验和、根据路由表决定下一跳,并调用邻居子系统(ARP)获取下一跳 MAC 地址,最后将包交给链路层。

关键文件:

  • net/ipv4/ip_input.c – IP 输入处理
  • net/ipv4/ip_output.c – IP 输出处理
  • net/ipv4/route.c – 路由表与路由缓存

(3)传输层 —— TCP/UDP 套接字

传输层直接面向应用程序,通过 socket 接口 与用户空间交互。TCP 和 UDP 在内核中有独立的协议处理函数,它们接收来自网络层的 IP 数据报,解析传输层头部,根据端口号将数据递交给对应的套接字。

以 TCP 为例,核心实现在 net/ipv4/tcp.cnet/ipv4/tcp_input.c(接收处理)、net/ipv4/tcp_output.c(发送控制)等文件中。TCP 拥塞控制算法则集中在 net/ipv4/tcp_cong.c 及相关算法模块(如 tcp_cubic.c)。

UDP 相对简单,位于 net/ipv4/udp.c,大部分工作只是多路复用和校验。

(4)应用层 —— 用户空间程序

严格来说,应用层不在内核中。应用程序通过 BSD 套接字 APIsocket()bind()listen()accept()send()recv() 等)发起网络通信,这些系统调用会陷入内核,由传输层或网络层的对应函数处理。Linux 还提供了 sendfile()splice() 等零拷贝系统调用以优化大文件传输。


3. 数据包在内核栈中的流动示例

以一次 TCP 发送为例,一个数据包经历的典型路径:

  1. 用户程序 调用 send() 系统调用。
  2. 内核 VFS 层 将调用路由到 socket 层 (net/socket.c)。
  3. 传输层 (TCP) 将待发送数据拷贝到发送缓冲区,生成 TCP 段,封装 TCP 头,调用网络层接口(ip_queue_xmit())。
  4. 网络层 (IP) 查找路由,构建 IP 头,可能进行分片,然后调用邻居子系统获取目的 MAC 地址,最后调用链路层发送函数(dev_queue_xmit())。
  5. 链路层(具体驱动)将 IP 包封装成以太网帧,通过 DMA 等技术发送到网线。

接收路径顺序相反,由中断或 NAPI 轮询触发,从网卡驱动开始逐层上送。


4. 实用工具与分层观测

这种分层实现使得我们可以用不同工具分别观测各层状况:

  • 网络接口层ethtool eth0(查看链路状态、速率)、ip -s link(收发统计)、tcpdump -i eth0(抓取帧)。
  • 网络层ip route(路由表)、ping / traceroute(ICMP 测试)、tcpdump -n -v 显示 IP 报头细节。
  • 传输层ss -tulpn(取代 netstat,查看 TCP/UDP 套接字状态)、nstatcat /proc/net/snmp(SNMP 统计)。
  • 应用层curl -vtelnetstrace -e network <command> 追踪系统调用。

5. 记住一点

Linux 的 TCP/IP 协议栈严格按照四层模型组织代码,每一层只负责自己的功能:链路层处理帧,网络层处理 IP 包和路由,传输层处理端口和连接,应用层提供业务逻辑。这种清晰的分离不仅让内核代码易于维护,也使得系统管理员可以逐层排查问题——链路没问题看 IP,IP 没问题看端口,端口没问题看应用,层层递进,有章可循。