数据在网络中传输,就像寄快递:发件人将物品层层包装(封装),每层贴上标签(协议头);收件人收到后层层拆解,最终取出物品(数据)。下图展示了数据从发送端到接收端经过的完整路径:
一、封包过程(发送端)
假设用户在浏览器访问 http://www.example.com,浏览器生成一个 HTTP GET 请求作为应用层数据。
应用层
数据:HTTP 请求报文,例如:
GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n
处理:应用层协议(HTTP)将数据交给传输层,不添加额外头部(某些应用协议会加头,如 SMTP)。
PDU 名称:报文(Message)
传输层(以 TCP 为例)
功能:建立端到端连接,提供可靠传输。
封装:在应用层数据前添加 TCP 头部(20~60 字节)。
关键字段:
· 源端口(随机,如 54321) · 目的端口(80,HTTP 默认) · 序列号(Seq=1) · 确认号(Ack=0,初始) · 控制标志(SYN=1 或 PSH=1 等) · 校验和
结果:形成 TCP 段(Segment)。
PDU 名称:段(Segment)
网络层(IP)
功能:路由和寻址,将数据从源主机发送到目的主机。
封装:在 TCP 段前添加 IP 头部(20~60 字节)。
关键字段:
· 版本(IPv4) · 头部长度 · 服务类型 · 总长度 · 标识、标志、片偏移(用于分片) · 生存时间(TTL,默认 64) · 协议(6 表示 TCP) · 源 IP 地址(192.168.1.100) · 目的 IP 地址(93.184.216.34) · 头部校验和
结果:形成 IP 数据报(Datagram)。
PDU 名称:数据报 / 包(Packet)
注意:若数据报长度超过链路 MTU(如 1500 字节),IP 层会进行分片,每个分片独立传输。
数据链路层(以以太网为例)
功能:在相邻网络节点之间可靠传输帧。
封装:在 IP 数据报前后分别添加 以太网头部 和 尾部(FCS)。
以太网头部(14 字节):
· 目的 MAC 地址(下一跳路由器的 MAC,通过 ARP 获得) · 源 MAC 地址(本机网卡 MAC) · 类型(0x0800 表示 IPv4) · 尾部(4 字节):帧校验序列(FCS,CRC 校验)
结果:形成 以太网帧(Frame)。
PDU 名称:帧(Frame)
物理层
功能:将帧转换为比特流,并通过物理介质传输。
处理:
· 以太网帧被编码为电信号(双绞线)、光信号(光纤)或无线电波(WiFi)。 · 添加前导码(7 字节)和帧首定界符(1 字节)以便接收端同步。
PDU 名称:比特(Bit)
二、拆包过程(接收端)
数据到达目的主机后,从物理层向上逐层解封装。
物理层
接收比特流,恢复成以太网帧,交给数据链路层。
数据链路层
检查帧头的目的 MAC 地址是否与本机 MAC 匹配(或广播/组播)。
使用 FCS 进行差错检测,若出错则丢弃请求重传。
剥离以太网头部和尾部,取出 IP 数据报,根据类型字段(0x0800)交给网络层。
网络层
检查 IP 头部的目的 IP 地址是否与本机 IP 匹配(或组播地址)。
校验 IP 头部,丢弃损坏的数据报。
检查 TTL,若为 0 则丢弃。
若收到分片,则重组完整 IP 数据报。
根据协议字段(6 → TCP)剥离 IP 头部,将 TCP 段交给传输层。
传输层(TCP)
根据 TCP 头部的源/目的端口,将段交给对应的应用进程(如 80 端口 → HTTP 服务)。
校验和验证,丢弃损坏段。
TCP 协议栈处理:确认收到、排序、去重、流量控制等。
剥离 TCP 头部,取出 HTTP 报文,交给应用层。
应用层
HTTP 协议解析请求或响应,最终呈现给用户(如网页内容)。
三、封包拆包过程中的关键概念
协议数据单元(PDU)
| 层级 | PDU 名称 | 示例 |
|---|---|---|
| 应用层 | 报文 | HTTP 请求 |
| 传输层 | 段(TCP)/ 数据报(UDP) | TCP Segment |
| 网络层 | 数据报 / 包 | IP Datagram |
| 链路层 | 帧 | Ethernet Frame |
| 物理层 | 比特 | 0/1 序列 |
头部信息(以典型以太网+IPv4+TCP+HTTP 为例)
以太网头:14 字节(MAC 地址、类型)
IP 头:20 字节(无选项)
TCP 头:20 字节(无选项)
HTTP 头:可变(几十到几百字节)
总封装开销:至少 54 字节(不计应用层头)
分片与重组
当 IP 数据报长度超过链路 MTU 时,网络层会将数据报分成多个较小的片(片偏移字段标识位置),每个片独立传输,到达目的主机后再由 IP 层重组。
地址解析
网络层需要目的 IP 地址,但数据链路层需要目的 MAC 地址。发送端通过 ARP(地址解析协议) 获取下一跳设备的 MAC 地址,并缓存。
封装嵌套示例
| 封装内容 | 层级 |
|---|---|
| 以太网头TCP头[FCS] | 完整帧 |
| IP头[HTTP数据] | IP 数据报 |
| TCP头 | TCP 段 |
| [HTTP数据] | HTTP 报文 |
四、实际场景举例:访问网页
浏览器(应用层)生成 HTTP GET 请求。
传输层(TCP)将请求分割为合适大小的段,加上 TCP 头(源端口随机,目的端口 80)。
网络层(IP)封装 IP 头(源 IP 为客户端 IP,目的 IP 为服务器 IP)。
数据链路层(以太网)封装以太网头(源 MAC 为本机,目的 MAC 为默认网关 MAC,通过 ARP 获取)。
物理层将帧转为电信号发送。
数据经过路由器:每跳路由器在数据链路层拆包、查路由表、重新封装新的链路层头(源和目的 MAC 改变)再转发。
最终到达服务器,物理层接收,逐层解封装,服务器获取 HTTP 请求并响应。
响应数据再以同样方式封装返回客户端。
五、常见问题
为什么需要多层封装?
每层关注不同功能(寻址、可靠传输、差错控制),解耦设计便于标准化和替换(例如将以太网换成 Wi-Fi,上层不受影响)。
封装是否增加额外开销?
是,但换来的是通用性和灵活性,且现代网络带宽足够支撑。
UDP 封装有何不同?
UDP 头部更简单(8 字节),没有可靠性机制,但过程类似。
封包拆包是网络通信的基础,理解这个过程能帮助分析网络故障、优化性能以及理解安全攻击(如分片攻击、ARP 欺骗等)。