Skip to main content

4. Byte Order, Alignment, and Time Format (字节顺序、对齐和时间格式)

4.1 字节顺序 (Byte Order)

所有整数字段都以网络字节序 (network byte order) 传输, 即最高有效字节 (八位字节) 在前。这种字节顺序通常称为大端序 (big-endian)。传输顺序在 RFC 791 中有详细描述。除非另有说明, 数字常量以十进制 (基数 10) 表示。

示例:

  • 16 位值 0x1234 传输时先发送 0x12, 然后发送 0x34
  • 32 位值 0x12345678 传输时依次发送 0x12, 0x34, 0x56, 0x78

4.2 对齐 (Alignment)

所有头部数据都对齐到其自然长度, 即:

  • 16 位字段: 对齐到偶数偏移量
  • 32 位字段: 对齐到可被 4 整除的偏移量
  • 以此类推

被指定为填充 (padding) 的八位字节值为零。

这种对齐确保了在大多数处理器架构上的高效访问, 并简化了硬件和软件实现。

4.3 时间格式 (Time Format)

4.3.1 墙钟时间 (Wallclock Time)

墙钟时间 (绝对日期和时间) 使用网络时间协议 (Network Time Protocol, NTP) 的时间戳格式表示, 该格式是相对于 1900 年 1 月 1 日 0 时 UTC 的秒数。

完整分辨率 NTP 时间戳: 完整分辨率 NTP 时间戳是一个 64 位无符号定点数:

  • 前 32 位: 整数部分 (秒数)
  • 后 32 位: 小数部分 (秒的小数部分)

这种格式提供了大约 232 皮秒的理论分辨率。

紧凑表示: 在某些需要更紧凑表示的字段中, 仅使用中间 32 位:

  • 低 16 位: 整数部分的低 16 位
  • 高 16 位: 小数部分的高 16 位

整数部分的高 16 位必须独立确定。

4.3.2 NTP 时间戳的使用

不需要运行 NTP: 实现不需要运行网络时间协议才能使用 RTP。可以使用其他时间源, 或者根本不使用时间源 (参见 Section 6.4.1 中 NTP 时间戳字段的描述)。然而, 运行 NTP 可能对同步来自不同主机的流很有用。

时间戳差值: 对于 RTP 目的, 仅使用 NTP 时间戳对之间的差值。只要假设时间戳对彼此相距在 68 年之内, 使用模运算进行减法和比较就会使回绕无关紧要。

4.3.3 NTP 时间戳回绕

NTP 时间戳将在 2036 年的某个时间回绕到零。但是, 对于 RTP 目的, 只使用 NTP 时间戳对之间的差值。只要可以假设时间戳对彼此相距在 68 年之内, 使用模运算进行减法和比较就会使回绕无关紧要。

示例计算: 如果两个 NTP 时间戳 T1 和 T2, 它们之间的时间差可以计算为:

diff = T2 - T1 (使用 32 位或 64 位无符号算术)

即使发生回绕, 只要 T1 和 T2 相距不超过 2^31 秒 (约 68 年), 这个计算仍然是正确的。

4.4 实现注意事项

实现者应注意:

  1. 可移植性: 确保代码在不同字节序的系统上都能正确工作
  2. 性能: 利用硬件支持的对齐访问以获得最佳性能
  3. 时间精度: 根据应用需求选择适当的时间戳精度
  4. 时钟同步: 对于需要跨主机同步的应用, 考虑使用 NTP 或其他时钟同步机制