在计算机网络中,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.c、net/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 套接字 API(socket()、bind()、listen()、accept()、send()、recv() 等)发起网络通信,这些系统调用会陷入内核,由传输层或网络层的对应函数处理。Linux 还提供了 sendfile()、splice() 等零拷贝系统调用以优化大文件传输。
3. 数据包在内核栈中的流动示例
以一次 TCP 发送为例,一个数据包经历的典型路径:
- 用户程序 调用
send()系统调用。 - 内核 VFS 层 将调用路由到 socket 层 (
net/socket.c)。 - 传输层 (TCP) 将待发送数据拷贝到发送缓冲区,生成 TCP 段,封装 TCP 头,调用网络层接口(
ip_queue_xmit())。 - 网络层 (IP) 查找路由,构建 IP 头,可能进行分片,然后调用邻居子系统获取目的 MAC 地址,最后调用链路层发送函数(
dev_queue_xmit())。 - 链路层(具体驱动)将 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 套接字状态)、nstat或cat /proc/net/snmp(SNMP 统计)。 - 应用层:
curl -v、telnet、strace -e network <command>追踪系统调用。
5. 记住一点
Linux 的 TCP/IP 协议栈严格按照四层模型组织代码,每一层只负责自己的功能:链路层处理帧,网络层处理 IP 包和路由,传输层处理端口和连接,应用层提供业务逻辑。这种清晰的分离不仅让内核代码易于维护,也使得系统管理员可以逐层排查问题——链路没问题看 IP,IP 没问题看端口,端口没问题看应用,层层递进,有章可循。