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 实现注意事项
实现者应注意:
- 可移植性: 确保代码在不同字节序的系统上都能正确工作
- 性能: 利用硬件支持的对齐访问以获得最佳性能
- 时间精度: 根据应用需求选择适当的时间戳精度
- 时钟同步: 对于需要跨主机同步的应用, 考虑使用 NTP 或其他时钟同步机制