Skip to content
📌知识点小结
  • 网络分层是为了"各层只管自己的事、对上一层透明":应用层产生数据,传输层加端口(段),网络层加 IP(包),链路层加 MAC(帧),物理层变成比特信号发出去。
  • 数据封装 = 发送时从上到下逐层加头部(解封装 = 接收时从下到上逐层拆头部);每层的 PDU 有专门名字:数据/段 segment/包 packet/帧 frame/比特 bit。
  • OSI 七层是理论模型,实际互联网跑的是 TCP/IP 四层(或五层教学模型):应用层、传输层(TCP/UDP)、网络层(IP)、链路层(以太网/Wi-Fi)、物理层。
  • 一次访问网页:HTTP 数据 → TCP 头(源/目的端口、序号)→ IP 头(源/目的 IP、TTL)→ 以太网帧头(源/目的 MAC、类型)→ 物理信号;每一跳路由器只改链路层帧头,IP 层端到端不变。
  • Wireshark 按层着色展示,正好对应封装结构;理解分层后才能看懂抓包、定位"到底是哪一层出了问题"。
✅自测一下

3.17 网络分层与数据封装:一个数据包是怎么"打包"出来的 ​

【网络与抓包深度】系列 Part 1(免费)。 这一篇讲透网络为什么要分层、数据从应用程序到网线之间经历了怎样的"打包"过程,以及怎么用 Wireshark 一层层看懂一个真实的包。 Part 2 讲 IP/子网/路由/NAT(星球专享),Part 3 讲 TCP 三次握手与状态机,Part 4 讲 tcpdump/Wireshark 实战抓包。

一、为什么网络要"分层" ​

想象一个问题:你在浏览器点了一下,数据要从你的电脑,经过家里的路由器、运营商、无数骨干设备,到达千里外的服务器,再原样返回。这件事极其复杂——硬件怎么传信号、数据怎么找到对方、出错了怎么办、网页数据怎么组织……

如果让一个协议把所有事情全管了,任何一个环节变了(比如从网线换成 Wi-Fi、从 IPv4 换 IPv6),整个系统都得推倒重来。

工程师的解法是分层(layering):把整个通信过程切成若干层,每一层只解决一个明确的问题,并为上一层提供服务,同时完全不关心上下层的内部实现。

分层带来三个核心好处:

  1. 职责清晰、各司其职:物理信号、寻址、可靠性、应用数据各有归属,出了问题能按层定位。
  2. 层与层解耦、可独立替换:把网线换成光纤、以太网换成 Wi-Fi,只影响最底层,上面的 TCP、HTTP 毫无感知。
  3. 利于标准化和组合:每层有统一接口,不同厂商的设备只要遵守同一层协议就能互通。

一个生活化的类比:寄快递。你(应用层)只关心包裹里是什么、交给谁;快递柜/网点(某一层)负责本地揽收;干线运输(另一层)负责城市间转运;分拣中心按地址路由。每一层都不关心包裹里具体是什么,只在外面套上自己这层的"单据"。

二、OSI 七层与 TCP/IP 四层:两个模型别混淆 ​

你会在教材里看到两个模型,它们是"理论模型"和"事实标准"的关系。

OSI 七层模型(理论/教学) ​

层名称主要职责典型协议/设备
7应用层 Application面向应用的数据语义,人直接打交道HTTP、HTTPS、DNS、SSH、FTP
6表示层 Presentation数据格式、编码、加密压缩TLS/SSL、JPEG、JSON 编解码
5会话层 Session建立/管理/维持会话RPC、NetBIOS
4传输层 Transport端到端的端口、可靠/不可靠传输TCP、UDP
3网络层 Network跨网络的寻址与路由IP、ICMP;路由器
2数据链路层 Data Link同一链路上的帧传输、MAC 寻址以太网、Wi-Fi、ARP;交换机
1物理层 Physical比特流、电信号/光信号/无线电网线、光纤、集线器、网卡硬件

OSI 模型层次清晰、适合教学和讨论,但上三层(应用/表示/会话)在真实互联网里并没有严格分开——实际的 TCP/IP 协议簇把它们合并成了一个应用层。

TCP/IP 四层模型(互联网事实标准) ​

互联网真正运行的是 TCP/IP 模型,它更精简:

TCP/IP 四层对应 OSI核心协议PDU 名称
应用层 Application5/6/7 层HTTP、DNS、SSH、FTP数据 data / 报文 message
传输层 Transport4 层TCP、UDP段 segment(TCP)/ 数据报 datagram(UDP)
网际层 Internet3 层IP、ICMP、ARP(边界)包 packet
网络接口层 Link1/2 层以太网、Wi-Fi、驱动帧 frame / 比特 bit

为了教学方便,常把它画成五层模型(把网络接口拆成数据链路层 + 物理层)。本系列后续统一用"应用 → 传输 → 网络 → 链路 → 物理"这个五层视角,它和 Wireshark 的展示最吻合。

记忆要点:越往上越靠近人和程序、越关心数据含义;越往下越靠近硬件、越关心信号和局部传输。

三、数据封装:发送时逐层"套信封" ​

分层模型最关键的运作机制是封装(encapsulation)。

发送数据时,数据从应用层自上而下,每经过一层,该层就在数据前面(有时后面也加)** 加上自己这一层的头部信息(header)** ,就像套信封:大信封里装小信封,每层信封上写着这层关心的信息。

一次访问网页的完整封装过程 ​

假设你在浏览器访问 http://example.com/index.html,应用层产生一个 HTTP 请求报文。下面逐层看它怎么被打包:

逐层说明每一层到底加了什么、为什么需要:

① 应用层(数据 data) 浏览器生成 HTTP 请求报文,内容是符合 HTTP 语法的文本(请求行、头部、可能的正文)。这一层只关心"我要什么资源",还不涉及怎么送到。

② 传输层(段 segment / 数据报 datagram) 以 TCP 为例,加上 TCP 头部,关键字段:

TCP 头字段作用
源端口 / 目的端口标识是哪个进程发出的、要交给服务器哪个进程(HTTP 默认 80,HTTPS 443)
序号 Sequence Number给字节编号,保证接收方能按序重组、发现丢失
确认号 ACK告诉对方"我收到哪了",实现可靠传输
标志位 SYN/ACK/FIN/RST建立连接、确认、关闭、重置(握手挥手靠它)
窗口 Window流量控制,告诉对方自己还能收多少

加完 TCP 头,数据成为一个 TCP 段(segment)。如果是 UDP,则加一个极简的头(只有源/目的端口、长度、校验和),成为 UDP 数据报。

③ 网络层(包 packet) 加上 IP 头部,关键字段:

IP 头字段作用
源 IP 地址 / 目的 IP 地址端到端标识"谁发给谁",是跨网络寻址的核心
版本IPv4 还是 IPv6
TTL 生存时间每经过一个路由器减 1,减到 0 丢弃,防止包无限环路(traceroute 原理)
协议号 Protocol上层是 TCP(6) 还是 UDP(17)、ICMP(1),解封装时据此分发
首部校验和校验 IP 头是否损坏

加完 IP 头成为 IP 包(packet,也叫 datagram)。这一层负责让数据能跨越多个网络、被路由器正确转发到目的网络。

④ 数据链路层(帧 frame) 在当前这一段物理链路(如你家到路由器的以太网/Wi-Fi)上,加上帧头和帧尾:

帧字段作用
目的 MAC 地址这一跳要交给谁(通常先给默认网关的 MAC)
源 MAC 地址这一跳是谁发出的(你的网卡 MAC)
类型 EtherType上层是 IPv4(0x0800)、IPv6(0x86DD) 还是 ARP(0x0806)
帧尾 FCS帧校验序列,检查这一帧在传输中有没有出错

加完成为 以太网帧(frame)。注意 MAC 地址只在当前这一段链路有意义。

⑤ 物理层(比特 bit) 帧的二进制内容被网卡转换成电信号(网线)、光信号(光纤)或无线电波(Wi-Fi),以 0/1 比特流形式发送出去。

接收方:解封装(de-encapsulation) ​

接收过程完全反过来,数据自下而上,每一层拆掉自己这层的头部、检查后把里面的"载荷"上交:

最终 HTTP 请求被交给服务器上监听 80 端口的 Web 服务进程(如 Nginx),它处理后再以同样的封装过程把响应发回来。

一个关键细节:传输途中各层怎么变 ​

数据包从你到服务器往往要经过好几跳路由器。理解分层后要记住一个重要事实:

层经过路由器时是否改变
应用层数据不变(端到端)
TCP 头(端口、序号)一般不变(端到端)
IP 头(源/目的 IP)一般不变(端到端;NAT 场景才改,见 Part 2)
链路层帧头(源/目的 MAC)每一跳都重新封装、会变

原因:路由器工作在网络层,它收到帧后解封装到 IP 层,查路由表决定下一跳,然后用下一段链路的帧头重新封装。所以 MAC 地址是"逐跳(hop-by-hop)"的,每段链路用的是相邻两个接口的 MAC;而 IP 地址是"端到端(end-to-end)"的,从源到目的始终不变(除非经过 NAT)。

四、PDU:每层的数据单位都有名字 ​

封装过程中,每一层处理的数据单位有统一术语,叫 PDU(Protocol Data Unit,协议数据单位)。抓包和文档里经常出现,务必对应清楚:

层PDU 名称英文
应用层数据 / 报文data / message
传输层段(TCP)/ 数据报(UDP)segment / datagram
网络层包 / 数据报packet / datagram
链路层帧frame
物理层比特bit

日常口语里"数据包/数据包"是泛指;严谨交流时,说"一个 TCP 段""一个以太网帧"能精确表达你指的是哪一层。

五、用 Wireshark 看真实的封装 ​

理论讲完,打开 Wireshark 抓一次包,你会发现它的"包详情"面板就是按封装层次从上到下排列的,每层都能展开:

text
Frame 1: 74 bytes on wire (592 bits) ...          ← 物理/帧层面(这一帧多大)
Ethernet II, Src: xx:xx, Dst: yy:yy              ← 链路层帧头(MAC、类型)
Internet Protocol Version 4, Src: 192.168.1.10   ← 网络层 IP 头(源/目的IP、TTL)
    Src: 192.168.1.10, Dst: 93.184.216.34
    TTL: 64, Protocol: TCP (6)
Transmission Control Protocol, Src Port: 53000   ← 传输层 TCP 头(端口、序号、标志)
    Src Port: 53000, Dst Port: 80
    Flags: SYN
Hypertext Transfer Protocol                      ← 应用层 HTTP(载荷)
    GET /index.html HTTP/1.1

对照方式:

  • 最外层 Frame 告诉你这一帧在线上实际占多少字节;
  • Ethernet II 就是链路层加的帧头,能看到源/目的 MAC 和 EtherType;
  • IPv4 是网络层加的 IP 头,能看到源/目的 IP、TTL、协议号(6=TCP);
  • TCP 是传输层加的头,能看到端口、序号、标志位;
  • 最里面的 HTTP 才是应用层真正要传的数据。

从外到内 = 从物理层到应用层 = 解封装的逆序展示。看懂这个对应关系,你就真正理解了封装。

Wireshark 还会用不同颜色标记不同协议(绿色 HTTP、浅紫 TCP、蓝灰 DNS 等),并提供 "Follow TCP Stream"(把属于同一次连接的包重组还原成完整对话),这些在 Part 4 抓包实战里详细练。

六、分层排障:到底是哪一层的问题 ​

分层模型最实用的价值之一是系统化排障。遇到"上不了网/访问不了服务",按层从下往上排查,能快速锁定范围:

层排查动作这层故障的典型现象
物理层看网卡灯、ip link 是否 UP、网线/无线网线断、网卡 disabled、没信号
链路层ARP 能否解析、arp -n、交换机/VLAN网关 MAC 学不到、端口隔离
网络层ping 网关IP、ping 8.8.8.8、看路由IP 不通、路由缺失、子网配错
传输层telnet IP 端口 / nc -vz、TCP 能否握手端口没开、防火墙 DROP、安全组
应用层ping 得通但 curl 报错、DNS 解析、服务状态HTTP 4xx/5xx、DNS 失败、服务挂了

一条经典排查路径:

bash
ping 网关IP          # 通 → 物理/链路/本地网络层正常
ping 8.8.8.8         # 通 → 能出外网、路由正常;不通 → 网络层/出口问题
nslookup example.com # 通 → DNS 正常;ping IP 通但域名不通 → DNS(应用层)问题
curl -v example.com  # 看 TCP 握手与 HTTP 响应;连不上 → 传输层端口/防火墙

"能 ping 通但网页打不开" 几乎可以立刻缩小到:DNS 解析(应用层)、目标端口/防火墙(传输层)、或 HTTP 服务本身(应用层),而不用怀疑网线。这种"按层二分定位"的思路,在渗透测试排查连通性、反弹 Shell 为什么连不回来时同样适用。

七、动手实验 ​

bash
# 1. 查看本机网卡与链路层状态(MAC 地址、是否 UP)
ip link            # Windows 用 ipconfig /all
ip addr            # 看各接口 IP(网络层)

# 2. 查看路由表(默认网关是下一跳)
ip route           # Windows 用 route print

# 3. 看 ARP 表:链路层 MAC 与 IP 的对应
ip neigh           # Windows 用 arp -a

# 4. 分层排障演练
ping -c 4 <网关IP>          # 网络层:到网关通不通
ping -c 4 8.8.8.8           # 网络层:能不能出外网
# 抓包看封装(需要 tcpdump,Part 4 详解;这里先看个大概)
sudo tcpdump -i any -nn -c 5 'tcp port 80'   # -nn 不解析名字,直接看 IP/端口

有图形界面时,强烈建议打开 Wireshark,开始抓包,然后浏览器访问一个 http(非 https)网站,点开一个包,对照第五节的层次结构逐层展开看一遍——这一遍胜过读十遍理论。

八、本篇小结 ​

  • 分层让每层职责单一、相互解耦、可独立替换;OSI 七层是理论模型,互联网实际跑 TCP/IP(四/五层)。
  • 封装 = 发送时自上而下逐层加头:应用数据 → TCP 段(加端口/序号)→ IP 包(加 IP/TTL)→ 以太网帧(加 MAC/FCS)→ 比特;解封装 = 接收时自下而上逐层拆头。
  • PDU 名称:数据 → 段 → 包 → 帧 → 比特。
  • IP 是端到端的(一般不变),MAC 是逐跳的(每跳重新封装);NAT 才会改 IP(Part 2 讲)。
  • Wireshark 详情面板按层展示封装结构;排障时从物理层到应用层逐层定位。

下一篇我们深入网络层:IP 地址怎么分类、子网掩码到底在掩什么、怎么手工划分子网、路由器靠什么决定转发方向,以及 NAT 为什么能让一堆内网设备共用一个公网 IP——这些是理解内网拓扑和后续内网渗透的直接基础(星球专享)。