Linux是如何收发网络包的?

网络数据包的收发流程是 "应用层→传输层→网络层→数据链路层→物理层" 自上而下封装(发送)和自下而上解封装(接收)的全栈协同过程,涉及操作系统内核、网络硬件、协议栈的深度交互。以下从「发送流程」「接收流程」「核心细节(内核 / 硬件交互)」三方面,结合 TCP/IP 协议栈和实际场景(如浏览器发送 HTTP 请求)详细拆解:

核心结论

  • 发送流程:应用数据 → 协议栈逐层封装(加头部 / 尾部) → 网卡硬件发送到网络;
  • 接收流程:网卡接收数据 → 协议栈逐层解封装(拆头部 / 尾部) → 内核将数据交付给应用;
  • 核心是「封装 / 解封装」和「协议协作」:每一层都为数据添加本层的控制信息(如 IP 头、TCP 头),确保数据在网络中正确传输和交付。

一、数据包发送流程(客户端视角,以 HTTPS 请求为例)

发送流程是「应用数据从用户态向下传递,经协议栈逐层封装,最终由网卡发送到物理网络」的过程,共 6 个关键步骤:

步骤 1:应用层生成数据(用户态)

  • 应用程序(如浏览器)生成应用层数据(如 HTTP 请求报文),并调用网络编程接口(socket 接口,如 write()/send()),将数据从用户态缓冲区拷贝到内核态缓冲区(如 TCP 发送缓冲区)。
  • 示例:浏览器发送 GET / HTTP/1.1 请求,数据长度为 200 字节。

步骤 2:传输层封装(内核态,TCP 协议)

内核中的 TCP 协议栈对应用数据进行封装,核心是添加「TCP 头部」(20~60 字节):

  • TCP 头部关键字段:
    • 源端口(如 54321,客户端随机端口);
    • 目的端口(如 443,HTTPS 默认端口);
    • 序列号(Seq):确保数据有序传输;
    • 确认号(Ack):用于可靠传输的确认机制;
    • 标志位(SYN/FIN/ACK/PSH):控制连接状态(如 PSH 表示 "推送数据",让接收方立即处理);
    • 窗口大小:流量控制的核心参数。
  • 封装后的数据称为「TCP 段(TCP Segment)」:TCP 头 + 应用数据。

步骤 3:网络层封装(内核态,IP 协议)

IP 协议栈对 TCP 段进行封装,添加「IP 头部」(20~60 字节):

  • IP 头部关键字段:
    • 源 IP 地址(如 192.168.1.100,客户端私有 IP);
    • 目的 IP 地址(如 180.101.49.11,百度服务器 IP,来自 DNS 解析);
    • 协议号(如 6,表示上层是 TCP 协议;17 表示 UDP);
    • TTL(生存时间,如 64,防止数据包无限循环);
    • 校验和:验证 IP 头的完整性。
  • 封装后的数据称为「IP 数据报(IP Datagram)」:IP 头 + TCP 段。

步骤 4:数据链路层封装(内核态 + 网卡驱动,以太网协议)

数据链路层(如以太网)对 IP 数据报进行封装,添加「以太网帧头」(14 字节)和「帧尾」(4 字节):

  • 以太网帧头关键字段:
    • 源 MAC 地址(如 00:1A:2B:3C:4D:5E,客户端网卡物理地址);
    • 目的 MAC 地址(如 00:AA:BB:CC:DD:EE,网关 MAC 地址,如路由器 MAC);
    • 类型字段(如 0x0800,表示上层是 IP 协议)。
  • 帧尾:FCS(帧校验序列),用于验证帧的完整性(网卡硬件会自动计算)。
  • 封装后的数据称为「以太网帧(Ethernet Frame)」:以太网帧头 + IP 数据报 + 帧尾。

步骤 5:物理层转换(网卡硬件)

  • 数据链路层的以太网帧是「二进制数据」,物理层(网卡)将其转换为「电信号 / 光信号」(如以太网用电压变化表示 0/1);
  • 网卡通过物理介质(网线、WiFi 无线电波)将信号发送到网络(如先发送到路由器)。

步骤 6:网络转发(路由器 / 交换机)

  • 数据包从客户端网卡发出后,经局域网交换机转发到网关(路由器);
  • 路由器解析 IP 头中的目的 IP 地址,通过路由表决定转发路径(如从家庭路由器转发到 ISP 骨干网,再经多级路由转发到服务器所在机房);
  • 转发过程中,路由器会修改 IP 头的 TTL(减 1)和校验和,重新计算后转发;以太网帧头的源 / 目的 MAC 地址会随每一跳路由更新(如路由器将帧的目的 MAC 改为下一跳路由的 MAC)。

二、数据包接收流程(服务器视角,以 HTTPS 响应为例)

接收流程是「网卡接收物理信号,经协议栈逐层解封装,最终将应用数据交付给服务器应用」的过程,与发送流程反向,共 6 个关键步骤:

步骤 1:物理层接收(网卡硬件)

  • 服务器网卡接收来自网络的电信号 / 光信号,转换为二进制数据(以太网帧);
  • 网卡硬件验证帧尾的 FCS(帧校验序列),若校验失败(数据被篡改或出错),直接丢弃该帧;若校验成功,将帧传递给数据链路层。

步骤 2:数据链路层解封装(内核态 + 网卡驱动)

  • 数据链路层解析以太网帧头:
    • 检查目的 MAC 地址是否为当前网卡的 MAC 地址(或广播地址),若不匹配,丢弃帧;
    • 提取帧头中的「类型字段」(如 0x0800),确定上层是 IP 协议;
  • 剥离以太网帧头和帧尾,将内部的 IP 数据报传递给网络层。

步骤 3:网络层解封装(内核态,IP 协议)

  • IP 协议解析 IP 头:
    • 验证 IP 头的校验和,若校验失败,丢弃数据报;
    • 检查 TTL(若 TTL 为 0,丢弃并返回 ICMP 超时消息);
    • 提取目的 IP 地址,若不是本机 IP(如服务器有多个网卡),丢弃数据报;
    • 提取「协议号」(如 6),确定上层是 TCP 协议;
  • 剥离 IP 头,将内部的 TCP 段传递给传输层。

步骤 4:传输层解封装(内核态,TCP 协议)

  • TCP 协议解析 TCP 头:
    • 验证 TCP 头的校验和,若校验失败,丢弃 TCP 段;
    • 检查源端口和目的端口(如目的端口 443),找到对应的 TCP 连接(内核通过「四元组(源 IP: 源端口:目的 IP: 目的端口)」唯一标识一个连接);
    • 确认序列号和确认号,确保数据有序且未丢失(若序列号缺失,发送 ACK 要求重传);
    • 若标志位为 PSH,通知应用层立即读取数据;
  • 剥离 TCP 头,将内部的应用数据(如 HTTP 请求)拷贝到内核的 TCP 接收缓冲区,然后通过 socket 接口通知应用程序 "有数据可读"。

步骤 5:应用层处理(用户态)

  • 服务器应用程序(如 Nginx)调用 read()/recv() 接口,从内核的 TCP 接收缓冲区读取应用数据;
  • 应用程序解析数据(如 Nginx 解析 HTTP 请求,调用后端服务处理),生成响应数据(如 HTTP 响应报文)。

步骤 6:响应数据发送(反向流程)

服务器生成的响应数据(如 HTML 内容),会重复「发送流程」的步骤(应用层→传输层→网络层→数据链路层→物理层),最终通过网络回传给客户端。

三、核心细节:内核与硬件的关键交互(面试高频)

1. 发送流程中的内核 / 硬件协作

  • 缓冲区管理 :应用数据先写入内核的「TCP 发送缓冲区」,TCP 协议根据流量控制(窗口大小)和拥塞控制策略,决定何时将数据发送到网络(并非调用 send() 后立即发送);
  • 网卡驱动:数据链路层封装完成后,内核通过「网卡驱动程序」将以太网帧写入网卡的「发送缓冲区(Tx Buffer)」;
  • DMA 传输:网卡支持 DMA(直接内存访问),无需 CPU 参与,可直接从内核缓冲区读取数据并发送,提升 CPU 利用率;
  • 发送完成中断:网卡发送数据后,通过「硬件中断」通知内核 "发送完成",内核释放相关缓冲区资源。

2. 接收流程中的内核 / 硬件协作

  • 网卡接收缓冲区(Rx Buffer):网卡接收数据后,先存入自身的 Rx Buffer,再通过 DMA 传输到内核的「网络接收缓冲区」;
  • 接收中断:网卡将数据写入内核缓冲区后,触发「硬件中断」,通知内核 "有数据到达";
  • 软中断(ksoftirqd) :为避免频繁硬件中断占用 CPU,内核会将部分处理逻辑(如协议栈解封装)交给「软中断」处理(后台线程 ksoftirqd 执行),提升系统吞吐量;
  • 连接跟踪 :内核通过「四元组」维护 TCP 连接状态(如 ESTABLISHED),确保数据交付到正确的应用程序。

3. 关键协议的核心作用

协议层 核心作用 关键硬件 / 组件
应用层 定义数据格式和交互逻辑(如 HTTP 请求结构) 应用程序(浏览器 / 服务器)
传输层 可靠传输(TCP)、端口寻址、流量控制 内核 TCP/UDP 协议栈
网络层 IP 寻址、路由转发 内核 IP 协议栈、路由器
数据链路层 MAC 寻址、帧校验 网卡、交换机
物理层 信号转换、物理介质传输 网卡、网线 / WiFi 模块

四、特殊场景补充

1. UDP 数据包收发差异

  • UDP 无连接、不可靠,传输层封装时仅添加 UDP 头(8 字节,包含源端口、目的端口、长度、校验和),无序列号、确认号、窗口大小等字段;
  • 发送流程:应用数据 → UDP 头 → IP 头 → 以太网帧 → 物理信号;
  • 接收流程:物理信号 → 以太网帧 → IP 头 → UDP 头 → 应用数据(无重传、排序机制,接收方直接交付应用)。

2. HTTPS 加密数据的收发

  • HTTPS 数据在应用层和传输层之间多了「SSL/TLS 层」:应用数据先经 TLS 加密(用会话密钥),再交给 TCP 层封装;
  • 接收时,TCP 层解封装后的数据是加密的 TLS 记录,需 TLS 层解密后,再交给应用层解析(如 HTTP 响应)。

3. 跨网段传输的 MAC 地址变化

  • 数据包跨网段转发时,IP 头的源 / 目的 IP 地址始终不变(端到端寻址);
  • 以太网帧头的源 / 目的 MAC 地址会随每一跳路由更新(链路层寻址),如客户端→路由器→骨干网路由器→服务器机房交换机→服务器,每一跳的 MAC 地址都不同。

五、核心流程总结(可视化)

发送流程(客户端→服务器)

复制代码
应用数据(HTTP 请求) → TCP 头 → TCP 段 → IP 头 → IP 数据报 → 以太网帧头/尾 → 以太网帧 → 电信号/光信号 → 网络转发 → 服务器

接收流程(服务器→客户端)

复制代码
电信号/光信号 → 以太网帧 → 剥离帧头/尾 → IP 数据报 → 剥离 IP 头 → TCP 段 → 剥离 TCP 头 → 应用数据(HTTP 请求) → 服务器应用

面试高频考点

  1. 数据包封装的顺序:应用层→传输层→网络层→数据链路层(自上而下,每一层添加头部);
  2. TCP 四元组的作用:源 IP、源端口、目的 IP、目的端口,用于内核唯一标识一个 TCP 连接,确保数据交付到正确的应用;
  3. MAC 地址与 IP 地址的区别:MAC 是链路层地址(本地网络寻址),IP 是网络层地址(端到端寻址);跨网段传输时,IP 不变,MAC 随路由更新;
  4. DMA 的作用:减少 CPU 参与数据传输的开销,提升网络吞吐量;
  5. 软中断的作用:处理协议栈解封装等耗时操作,避免硬件中断占用过多 CPU。
相关推荐
报错小能手33 分钟前
计算机网络自顶向下方法50——链路层 虚拟局域网 链路虚拟化:网络作为链路层(多协议标签交换)
网络·计算机网络·智能路由器
༺ཉི།星陈大海།ཉྀ༻CISSP34 分钟前
隐蔽端口穿透攻击的技术分析与防御实践 —基于一次HW行动的实战案例
网络·智能路由器
0wioiw01 小时前
跨网络互联技术(Nginx反向代理)
服务器·网络·nginx
报错小能手1 小时前
计算机网络自顶向下方法55——无线网移动网 移动性管理
网络·计算机网络
带鱼吃猫2 小时前
Linux系统:策略模式实现自定义日志功能
linux·c++
minji...2 小时前
Linux 进程概念 (三) (进程状态,僵尸进程,孤儿进程,进程优先级)
linux·运维·服务器
是小胡嘛7 小时前
C++之Any类的模拟实现
linux·开发语言·c++
口袋物联8 小时前
设计模式之工厂模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·设计模式·简单工厂模式
qq_479875439 小时前
X-Macros(1)
linux·服务器·windows