1. 概述

在日常通信中,我们人类通过语言、表情、手势等方式传递信息。而在计算机网络中,通信的本质同样是信息的传递,只不过这些信息被封装成结构化的数据包(Packet)在网络中传输。

在网络通信中,数据包通常由 Header(头部)Payload(有效载荷)Overhead(开销) 三部分组成。理解这三者的关系,有助于我们更深入地掌握网络协议的运作机制,也能在实际开发中帮助我们优化网络性能、排查问题。

2. 网络通信的基本模型

计算机网络通信的核心是 端到端的数据传输。发送方将信息封装成数据包,接收方解析并处理这些数据包。为了保证数据能准确送达,每个数据包都需要携带一些控制信息,比如:

  • 源地址与目标地址
  • 数据长度
  • 校验信息
  • 协议版本等

这些控制信息由网络协议定义,通常以 Header 的形式嵌入数据包中。

3. 数据包的基本结构

一个标准的数据包通常由以下几个部分组成:

  • Header(头部):包含协议控制信息,用于指导数据包在网络中的传输。
  • Payload(有效载荷):真正的业务数据,即通信双方要交换的内容。
  • Trailer(尾部):某些协议中包含,用于校验或标记数据结束。

下面这张图展示了一个典型的 UDP over IPv4 数据包结构:

GeneralMsg

图中可以看到,UDP 头部位于 IPv4 头部之后,而 UDP 的 payload 才是我们真正要发送的数据内容。

4. Header(头部)

Header 是数据包的“导航系统”。它包含了网络通信所需的关键元数据,如地址、端口号、数据长度、校验和等。

不同的协议有不同的头部格式。例如:

协议 所属层级(OSI) 头部大小
Ethernet 数据链路层(L2) 14 字节
ARP 数据链路层(L2) 28 字节(常见)
IPv4 网络层(L3) 20~60 字节
IPv6 网络层(L3) 固定 40 字节
TCP 传输层(L4) 20~60 字节
UDP 传输层(L4) 固定 8 字节

在我们上面的示例中,一个 UDP over IPv4 的数据包会包含两个头部:IPv4 和 UDP。如下图所示:

Headers

5. Payload(有效载荷)

Payload 是数据包中真正携带的“业务数据”,也就是发送方希望接收方接收到的内容。

例如:

  • 发送一个 HTTP 请求时,payload 是请求体(body)的内容。
  • 发送一个 UDP 报文时,payload 是应用程序传入的数据。

需要注意的是,payload 的大小是可变的,有的协议支持固定长度 payload,有的则支持变长。变长 payload 需要额外字段来标识其长度,否则接收方无法正确解析。

此外,从协议栈的角度来看,上层协议的头部也是下层协议的 payload。例如:

  • IP 头部是 Ethernet payload 的一部分
  • UDP 头部是 IP payload 的一部分

如下图所示:

Payload

6. Overhead(开销)

Overhead 是指为了完成一次通信而额外消耗的资源,在网络通信中,它通常指的是数据包中所有头部和尾部所占用的空间。

例如,在 UDP over IPv4 的数据包中,overhead 就是 IPv4 头部(20 字节) + UDP 头部(8 字节) = 28 字节

如果 payload 是 100 字节,那么整个数据包大小就是 128 字节,其中 28 字节是 overhead,占比约 22%。这部分数据虽然不包含实际内容,但却是通信所必需的。

下图展示了 overhead 的具体组成:

Overhead 1

小贴士: 在高并发或低带宽场景下,过高的 overhead 会影响传输效率。因此,在设计协议或优化通信时,应尽量减少头部信息的冗余。

7. 总结

在本文中,我们探讨了网络通信中数据包的基本结构:

  • Header:控制信息,用于路由、寻址、校验等
  • Payload:真正要传输的数据内容
  • Overhead:Header 和 Trailer 所占的空间,是通信的“成本”

理解这三者的结构和关系,有助于我们在实际开发中更好地使用网络协议,优化性能,排查问题。

同时,数据包的分层结构体现了网络协议的模块化设计思想。每一层只关心自己的职责,上层协议的头部对下层来说只是 payload,这种设计让网络通信变得灵活且易于扩展。

建议: 在实际项目中,尤其是对性能敏感的系统(如游戏、IoT、实时音视频等),一定要关注 payload 与 overhead 的比例,避免“小 payload 大头部”的情况造成带宽浪费。


原始标题:Messages: Payload, Header, and Overhead