我们先后认识了应用数据、端口号、IP 地址和 MAC 地址。它们并不是彼此割裂的四份信息,而是在网络协议栈中被逐层加工、逐层包裹,最终变成可以通过网线或无线信道发送出去的比特流。
可以把这个过程理解为“包装”:应用产生真正要传送的内容,传输层负责可靠交付,网络层负责跨网寻址,链路层负责本地设备之间真正发帧,物理层则负责把比特变成电信号、光信号或无线电波。
一次 HTTP 请求的封装过程
以浏览器向服务器发送一个 HTTP GET 请求为例,数据会经历下面的封装过程。
发送端:逐层加上头部和尾部
-
应用层产生原始数据 浏览器生成 HTTP 请求内容,例如:
GET /index.html HTTP/1.1 Host: www.example.com这部分才是应用真正要送给服务器的数据。
-
传输层封装为 TCP 报文段 TCP 在 HTTP 请求前加上 TCP 头部,填入源端口
51842、目的端口80、序列号、确认号、窗口大小等信息,形成 TCP 报文段(TCP Segment)。TCP 头部的作用,是告诉接收端:
- 这段数据属于哪个进程;
- 属于哪条连接;
- 数据从哪个序列号开始;
- 是否需要重传;
- 当前接收窗口还剩多少空间。
-
网络层封装为 IP 数据包 IP 层在 TCP 报文段前再加上 IP 头部,填入源 IP 地址
192.168.12.170、目的 IP 地址192.168.20.10、TTL、协议号等信息,形成 IP 数据包(IP Packet)。IP 头部负责的是“跨网传输”,关心的是数据要从哪台主机出发,最终要送往哪台主机。
-
数据链路层封装为以太网帧 以太网层在 IP 数据包前加上以太网头部,填入源 MAC 地址、下一跳设备的目的 MAC 地址、类型字段
0x0800等信息,同时在尾部加上用于校验完整性的 FCS,即帧校验序列,最终形成完整的 以太网帧(Ethernet Frame)。这里需要注意:以太网帧中的目的 MAC 地址,不一定是最终目标主机的 MAC 地址,而通常是下一跳设备的 MAC 地址。例如数据包要经过路由器转发时,这一帧的目的 MAC 往往是当前局域网内路由器的 MAC。
-
物理层转换为比特信号 网卡收到以太网帧后,会把它转换成物理信号,例如网线中的电脉冲、光纤中的光信号,或无线环境中的无线电波,然后逐位发送出去。
到这里,原本简单的一行 HTTP 请求,已经被层层包装成一个可以在真实网络中传输的以太网帧。
接收端:逐层解封装
当目的主机收到这个以太网帧时,会执行相反的过程,也就是 解封装(Decapsulation)。
可以这样理解:
- 网卡先检查目的 MAC 地址是否与自己匹配,并通过 FCS 校验帧是否完整。
- 如果校验失败或目的 MAC 不匹配,这个帧通常会被直接丢弃。
- 校验通过后,网卡剥离以太网头部和尾部,把剩下的内容交给内核中的 IP 层。
- IP 层检查目的 IP 地址、TTL、头部校验和等信息,确认无误后剥离 IP 头部,把 TCP 报文段交给 TCP 层。
- TCP 层检查端口号、序列号、连接状态和窗口信息,确认这段数据属于哪条连接后,再剥离 TCP 头部。
- 最后,完整的 HTTP 请求内容才会被交给对应的应用进程,例如 Web 服务器。
所以,网络传输的核心规律可以概括为一句话:
发送时逐层加头,接收时逐层去头。
每一层只处理自己负责的部分,也只认自己那层添加的信息。
MTU、MSS 与 TCP 分段
数据被逐层包装,并不意味着想传多大就能一次性传多大。真实物理链路对单次传输的数据量是有上限的。
MTU:一帧最多能承载多大的 IP 数据包
MTU(Maximum Transmission Unit,最大传输单元) 指的是数据链路层一次能够承载的最大 IP 数据包长度。
在标准以太网中,常见 MTU 是:
1500 字节
这个 1500 字节指的是 IP 数据包的最大长度,包括 IP 头部和 IP 载荷,但不包括:
- 14 字节以太网头部;
- 4 字节 FCS 帧校验序列。
换句话说,MTU 限制的是链路层愿意帮忙运送多大的 IP 包,而不是整帧的物理长度。
MSS:TCP 真正可使用的载荷上限
如果上层要发送的数据太大,TCP 不会把它原封不动地交给 IP 层,而是会先在传输层进行切分。这样做可以让生成的 IP 数据包尽量不超过链路层的 MTU,从而减少 IP 分片。
MSS(Maximum Segment Size,最大报文段长度) 指的是 TCP 报文段中真正可以携带的应用数据最大长度。
在标准 IPv4 + TCP 场景下:
- IPv4 头部通常为 20 字节;
- TCP 头部通常为 20 字节;
- 标准以太网 MTU 通常为 1500 字节。
因此,单个 TCP 报文段最大可携带的应用数据长度为:
$$ 1500 - 20 - 20 = 1460 \text{ 字节} $$
也就是说,TCP 通常最多只放 1460 字节的 HTTP、TLS 或文件内容进一个 TCP 报文段。
大文件是如何被传输的?
如果应用程序要发送一个 10 MB 的文件,TCP 会自动把它切成许多个小报文段,每个报文段通常携带不超过 MSS 的数据。
每个 TCP 报文段都带有序列号。接收端根据序列号重新排列这些报文段,再按照顺序组装成原始字节流。
这对应用来说通常是透明的。浏览器或服务器进程不需要关心:
- 数据被切成了多少段;
- 每一段走了哪条路径;
- 哪些段重传了;
- 哪些段乱序到达。
TCP 会尽量保证交给上层的数据完整、有序。
这里还可以补充一个容易混淆的区别:
| 机制 | 发生位置 | 目的 |
|---|---|---|
| TCP 分段 | 传输层 | 把大的字节流切成适合传输的 TCP 报文段 |
| IP 分片 | 网络层 | 把过大的 IP 数据包拆成多个 IP 分片,以适应更小链路 MTU |
网络工程中通常更希望 TCP 在发送前就把数据控制好,尽量避免频繁 IP 分片,因为 IP 分片会带来额外的复杂性和丢包风险。
OSI 七层模型与 TCP/IP 四层模型
为了描述复杂网络,人们发明了参考模型。其中最重要的是 OSI 七层模型,但真实互联网中更常用的是 TCP/IP 四层模型。
OSI 七层模型更像教科书模型,它把网络能力拆得非常清晰;TCP/IP 四层模型则更贴近现实工程,更强调可落地。
| OSI 层号 | OSI 模型名称 | 核心职责与代表协议/硬件 | TCP/IP 模型归属 |
|---|---|---|---|
| Layer 7 | 应用层(Application) | 为应用程序提供网络服务接口,例如 HTTP、DNS、SSH、FTP | 应用层 |
| Layer 6 | 表示层(Presentation) | 负责数据格式转换、编码、压缩、加密表示等,例如 TLS、JSON、XML | 并入 TCP/IP 应用层 |
| Layer 5 | 会话层(Session) | 负责建立、管理和终止应用之间的会话 | 并入 TCP/IP 应用层 |
| Layer 4 | 传输层(Transport) | 负责端到端通信、端口寻址、可靠传输、流量控制,例如 TCP、UDP | 传输层 |
| Layer 3 | 网络层(Network) | 负责逻辑寻址、路由选择和跨网转发,例如 IP、ICMP、路由器 | 网际层(网络层) |
| Layer 2 | 数据链路层(Data Link) | 负责本地链路寻址、帧封装、介质访问控制、错误校验,例如以太网、MAC、交换机 | 网络接口层(链路层) |
| Layer 1 | 物理层(Physical) | 负责比特流的物理信号传输,例如网线、光纤、无线信号、中继器 | 与 Layer 2 共同对应网络接口层 |
可以这样理解:
- OSI 把应用相关能力拆成三层:应用层、表示层、会话层。
- TCP/IP 则更务实,把这三层统一看作应用层。
- OSI 把网络接口相关能力拆成数据链路层和物理层。
- TCP/IP 通常把这两层合称为网络接口层。
实际协议栈中,很多边界并没有这么整齐。例如 TLS 既有应用层协议特征,也有会话与加密特征;NAT 主要发生在网络层和传输层之间;交换机既有二层转发,也可能参与路由。
但对于学习网络来说,分层思维仍然非常重要。它可以帮助我们快速判断:
- 这是一个应用数据问题?
- 还是端口和连接问题?
- 还是 IP 路由问题?
- 还是 MAC、VLAN 或物理链路问题?
用分层模型辅助排障
网络故障排查中,分层模型最实用的地方是帮我们缩小问题范围。
物理层问题
常见表现:
- 网线插好了但没有链路;
- 网卡指示灯不亮;
- 光信号弱;
- 无线干扰严重;
- 接口协商失败。
典型命令或设备:
- 网线、光纤、光模块;
- 网卡状态;
- 接口速率和双工协商。
数据链路层问题
常见表现:
- 同一局域网内无法通信;
- ARP 解析失败;
- VLAN 配置错误;
- 交换机端口丢弃帧;
- MAC 地址表异常;
- 帧校验失败。
典型协议或工具:
- MAC 地址;
- ARP;
- 以太网帧;
- 交换机;
ethtool、arping等。
网络层问题
常见表现:
- 跨网段无法通信;
- 路由表错误;
- 默认网关不可达;
- TTL 耗尽;
- IP 地址或子网掩码配置错误;
- 防火墙阻断 IP 包。
典型协议或工具:
- IP 地址;
- 路由;
- ICMP;
ping;traceroute;- 路由表。
传输层问题
常见表现:
- IP 可达,但端口不通;
- TCP 连接拒绝;
- 握手失败;
- 大量重传;
- 窗口耗尽;
- 连接超时。
典型协议或工具:
- TCP;
- UDP;
- 端口号;
ss、netstat;tcpdump;telnet或nc测试端口连通性。
应用层问题
常见表现:
- DNS 解析失败;
- HTTP 返回 404、403、500;
- TLS 证书错误;
- 请求格式异常;
- JSON 解析失败;
- 认证或授权失败。
典型协议或工具:
- HTTP;
- HTTPS;
- DNS;
- TLS;
- SSH;
curl;- 浏览器开发者工具。
分层排障的意义在于:不要一遇到问题就凭经验乱猜,而是按照链路从低到高逐步确认。先确定能不能通信,再确定端口是否可达,最后再看应用数据是否正常。

