计算机网络学习站

kp-004 · 01-网络基础与体系结构

封装、解封装与复用/分用

入门 约 15 分钟 封装PDU首部复用分用
我的进度:

注:本文基于模型知识整理,建议结合权威教材与 RFC 原文核对细节。

一句话定义

封装是发送方把上层 PDU 整体作为数据、逐层加上本层首部(数据链路层还加尾部)的过程;解封装是接收方自下而上逐层剥头并向上交付;复用/分用则依靠各层首部中的标识字段,把共享信道上的流量正确送达对应的上层实体或进程。

为什么重要

任何一次网络通信都在经历这条流水线。它解释了「应用数据如何变成网卡上的比特」,也决定了排错抓手:抓包时看到的就是层层首部;防火墙、负载均衡按协议号或端口分流的依据,正是分用字段。不懂封装与分用链,就读不懂抓包结果,也无法精确控制报文大小与首部开销。

前置知识

建议先读 kp-003《分层体系结构:OSI 与 TCP/IP》,掌握对等实体、服务与 PDU 的概念。

核心概念

  • 封装(encapsulation):上层 PDU 整体作为本层的数据部分(payload),前面加上本层首部(header)构成本层 PDU;数据链路层通常还在尾部加帧检验序列(FCS,Frame Check Sequence)用于差错检测。
  • 解封装(decapsulation):接收方逐层校验并剥离首部与尾部,把数据部分向上交付。
  • PDU 命名链:应用层报文(message)→ 运输层 TCP 段(segment;UDP 的 PDU 称用户数据报)→ 网络层 IP 数据报(datagram)→ 数据链路层帧(frame)→ 物理层比特(bit)。
  • 复用(multiplexing):多个上层会话的报文经同一接口与链路发送;分用(demultiplexing):接收方按首部字段把报文交给正确的上层实体。
  • 三级分用字段:以太网帧首部的 EtherType、IPv4 首部的协议(Protocol)字段、运输层端口号(port)。
  • MTU(Maximum Transmission Unit,最大传输单元):链路层单帧载荷上限,以太网典型为 1500 字节。

图示

发送方向自上而下封装:

应用层   [ HTTP GET 报文 ]
             │ 封装
运输层   [ TCP 首部 │ HTTP GET 报文 ]                ← 段
             │ 封装
网络层   [ IP 首部 │ TCP 首部 │ HTTP GET 报文 ]      ← IP 数据报
             │ 封装
链路层   [ 帧首部(含 EtherType) │ IP 数据报 │ FCS ]  ← 帧
             │ 封装
物理层   [ 0101101001110100101 ](比特流)

接收方向自下而上解封装:箭头反向,逐层校验、剥头、向上交付。

原理与机制

分用链是本篇核心。接收网卡收到帧后,先用帧尾 FCS 校验完整性,再读帧首部的 EtherType:0x0800 表示载荷是 IPv4 数据报,交给网络层;0x0806 表示 ARP 报文,交给 ARP 模块。网络层核对目的 IP 后读 IPv4 首部的协议字段:6 表示载荷交给 TCP,17 表示交给 UDP。运输层再按首部中的目的端口号(与源 IP、源端口、协议一起构成套接字四元组)找到对应 socket,把数据交给正监听该端口的进程。三级字段层层递进:没有 EtherType 无法区分网络层协议,没有协议号无法区分 TCP 与 UDP,没有端口则内核无法把数据分给具体进程——分用链上任何一级字段错配,报文就会被丢弃或送错。

首部开销与 MTU 的关系:以 IPv4 + TCP + 以太网为例,TCP 首部 20 字节、IPv4 首部 20 字节、以太网帧头与帧尾合计 18 字节,固定开销共 58 字节;在 1500 字节 MTU 下,TCP 有效载荷至多 1460 字节(即典型 MSS,Maximum Segment Size),开销占比约 4%。应用一次要发送的数据若超过 MTU,IP 层可能分片(IPv4 允许,IPv6 依赖路径 MTU 发现),分片会放大丢包代价,因此高效的实现会让应用与运输层协同控制报文大小。路由器工作在网络层:每收到一帧就解封装到 IP 层查表转发,再重新封装为出接口链路的新帧——IP 数据报端到端保持不变,帧则逐跳更换。

实例分析

浏览器发起一次 HTTP GET(连接已建立)的完整封装与对端解封装流程:

  1. 浏览器生成 GET 请求报文,经 socket 写入内核 TCP;
  2. TCP 加首部(源端口为临时端口、目的端口 80,含序号与确认号等),形成段;
  3. IP 加首部(源 IP、目的 IP、协议字段 = 6、TTL 等),形成 IP 数据报;
  4. 主机经 ARP 解析默认网关的 MAC 地址,封装成以太网帧(EtherType = 0x0800,帧尾 FCS),交给网卡发往网关;
  5. 每台中间路由器解封装到网络层:校验、TTL 减 1、查转发表,再重新封装为出接口新帧(帧头 MAC 逐跳更换,IP 头的目的地址不变);
  6. 服务器网卡收帧并校验 FCS → 按 EtherType 交给 IP → 按协议号 6 交给 TCP → 按目的端口 80 分用至 Web 进程的 socket;
  7. Web 进程从 socket 读出 GET 报文并处理,随后生成 HTTP 响应,沿同一条链自上而下封装返回客户端。

常见误区

  • 认为「IP 层天然认识 TCP」:分用依赖 IPv4 首部协议字段(6/17),字段缺失或错配则无法向上交付。
  • 以为 MAC 地址端到端不变:MAC 只在一条链路内有效,每经过一台路由器都更换;端到端保持的是 IP 地址。
  • 把端口号当作设备的物理插口:端口是运输层用于标识进程的逻辑编号(0~65535)。
  • 忽略尾部:封装不只有首部,数据链路层的 FCS 尾部同样是封装的一部分。
  • 低估首部开销:小报文场景(如 DNS 查询)下 58 字节固定开销可占报文的大头,显著拉低有效载荷比例。

自测题

  1. 写出从应用到物理各层的 PDU 名称。<br>答案要点: 应用层报文 → 运输层 TCP 段(UDP 为用户数据报)→ 网络层 IP 数据报 → 数据链路层帧 → 物理层比特。
  2. 描述从帧到进程的两级分用字段及其典型取值。<br>答案要点: 以太网帧 EtherType = 0x0800 表示载荷为 IPv4;IPv4 首部协议字段 = 6 交付 TCP(17 为 UDP);再由目的端口号定位监听该端口的应用进程。
  3. 为什么路由器转发时会更换帧,而 IP 数据报保持不变?<br>答案要点: 路由器工作在网络层,解封装到 IP 查表后重新封装出帧;帧(含 MAC 地址)只在单条链路有效,逐跳更换,IP 地址负责端到端寻址保持不变。
  4. MTU 为 1500 时一次 TCP 最多携带多少应用数据?依据是什么?<br>答案要点: 典型 1460 字节(MSS)= 1500 − 20(IP 首部)− 20(TCP 首部);若链路层封装还需 VLAN 标签等额外字段,有效载荷会更小。
  5. 复用与分用分别发生在什么位置与时刻?

答案要点: 复用发生在发送方——多个会话的报文汇聚到同一网络接口与链路发送;分用发生在接收方——按 EtherType、协议号、端口组成的三级分用链把报文逐级交给正确的上层实体直至进程。

延伸阅读

  • 谢希仁《计算机网络》(第 8 版),第 1 章体系结构与第 3 章数据链路层。
  • RFC 9293《Transmission Control Protocol (TCP)》:TCP 首部与端口语义的现行规范。
  • RFC 791《Internet Protocol》:IPv4 首部协议字段与数据报格式的原始定义。