数据如何被逐层包装

我们先后认识了应用数据、端口号、IP 地址和 MAC 地址。它们并不是彼此割裂的四份信息,而是在网络协议栈中被逐层加工、逐层包裹,最终变成可以通过网线或无线信道发送出去的比特流。

可以把这个过程理解为“包装”:应用产生真正要传送的内容,传输层负责可靠交付,网络层负责跨网寻址,链路层负责本地设备之间真正发帧,物理层则负责把比特变成电信号、光信号或无线电波。

一次 HTTP 请求的封装过程

应用数据依次加上 TCP 头、IP 头、以太网头与尾部,原来的数据保留在里面

以浏览器向服务器发送一个 HTTP GET 请求为例,数据会经历下面的封装过程。

发送端:逐层加上头部和尾部

  1. 应用层产生原始数据 浏览器生成 HTTP 请求内容,例如:

    GET /index.html HTTP/1.1
    Host: www.example.com
    

    这部分才是应用真正要送给服务器的数据。

  2. 传输层封装为 TCP 报文段 TCP 在 HTTP 请求前加上 TCP 头部,填入源端口 51842、目的端口 80、序列号、确认号、窗口大小等信息,形成 TCP 报文段(TCP Segment)。

    TCP 头部的作用,是告诉接收端:

    • 这段数据属于哪个进程;
    • 属于哪条连接;
    • 数据从哪个序列号开始;
    • 是否需要重传;
    • 当前接收窗口还剩多少空间。
  3. 网络层封装为 IP 数据包 IP 层在 TCP 报文段前再加上 IP 头部,填入源 IP 地址 192.168.12.170、目的 IP 地址 192.168.20.10、TTL、协议号等信息,形成 IP 数据包(IP Packet)。

    IP 头部负责的是“跨网传输”,关心的是数据要从哪台主机出发,最终要送往哪台主机。

  4. 数据链路层封装为以太网帧 以太网层在 IP 数据包前加上以太网头部,填入源 MAC 地址、下一跳设备的目的 MAC 地址、类型字段 0x0800 等信息,同时在尾部加上用于校验完整性的 FCS,即帧校验序列,最终形成完整的 以太网帧(Ethernet Frame)。

    这里需要注意:以太网帧中的目的 MAC 地址,不一定是最终目标主机的 MAC 地址,而通常是下一跳设备的 MAC 地址。例如数据包要经过路由器转发时,这一帧的目的 MAC 往往是当前局域网内路由器的 MAC。

  5. 物理层转换为比特信号 网卡收到以太网帧后,会把它转换成物理信号,例如网线中的电脉冲、光纤中的光信号,或无线环境中的无线电波,然后逐位发送出去。

到这里,原本简单的一行 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 则更务实,把这三层统一看作应用层。
  • 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;
  • 浏览器开发者工具。

分层排障的意义在于:不要一遇到问题就凭经验乱猜,而是按照链路从低到高逐步确认。先确定能不能通信,再确定端口是否可达,最后再看应用数据是否正常。