4.3. UDP 头部压缩 (UDP Header Compression)
本文档定义了一种使用 LOWPAN_NHC 的 UDP 头部压缩格式. UDP 压缩格式见 Figure 14. bit 0 到 bit 4 表示 NHC ID, '11110' 表示本节定义的特定 UDP 头部压缩编码.
4.3.1. 压缩 UDP 端口 (Compressing UDP Ports)
本规范允许将特定端口号范围 (0xf0b0 到 0xf0bf) 压缩到 4 bit. 这是继承自 [RFC4944] 的无状态压缩, 而不是新的有状态压缩.
可压缩到 4 bit 的端口范围不属于保留范围. 设计为通过 6LoWPAN 通信的网络栈实现应尽可能避免将这些端口用作动态端口.
考虑到这只代表 16 个连续端口, 可以预期许多不兼容的应用会为各自的端到端需求使用相同端口号值. 因此, 位于 (0xf0b0 到 0xf0bf) 范围内的端口号几乎不能提供关于远端应用的信息.
与 IANA 保留的端口相比, 0xf0bX 端口的重载增加了接收错误类型负载并误解内容的风险. 因此, 推荐将这些端口的使用与某种机制关联, 例如传输层安全 (Transport Layer Security, TLS) [RFC5246] 消息完整性检查 (Message Integrity Check, MIC), 以确保内容符合预期并经过检查.
4.3.2. 压缩 UDP 校验和 (Compressing UDP Checksum)
对于 IPv6 [RFC2460], 所有分组都强制要求执行 UDP 校验和操作. 因此, [RFC4944] 不允许压缩 UDP 校验和.
根据本规范, 如果获得上层授权, 源传输端点中的压缩器可以 (MAY) 省略 UDP Checksum. 除非收到此类授权, 压缩器禁止 (MUST NOT) 设置 C bit. 要求上层授权可确保预期传输对等方拥有足够手段来处理到达目的地之前发生的任何数据损坏. 除非满足以下情况之一, 上层禁止 (MUST NOT) 提供授权:
隧道化 (Tunneling): 在这种情况下, 6LoWPAN 通过在 UDP 上隧道传输现有现场协议, 被部署为无线伪现场总线. 如果被隧道化的协议数据单元 (Protocol Data Unit, PDU) 具有自己的寻址、安全和完整性检查 (例如 IPsec Encapsulating Security Payload 隧道模式 [RFC4303] 或 UDP 上的 IP 封装), 隧道机制可以 (MAY) 授权省略 UDP 校验和, 以节省封装开销.
消息完整性检查 (Message Integrity Check): 在这种情况下, UDP 负载中存在 IPsec Authentication Header [RFC4302] 或某种其他形式的完整性检查, 其覆盖的信息至少与 UDP 校验和相同 (伪头部、数据), 且强度至少相同.
为帮助确保展开 6LoWPAN 分组时能正确恢复 UDP Checksum, 每当传输携带已压缩 UDP 数据报且该数据报省略校验和的链路帧时, 都必须 (MUST) 使用额外完整性检查 (例如第 2 层 (Layer 2, L2) 消息完整性检查). 如果没有这种额外完整性检查, UDP 分组可能被递送到非预期目的地, 因为伪头部覆盖的数据损坏可能无法被检测到.
压缩器必须 (MUST) 在省略 UDP Checksum 之前验证它, 并且必须 (MUST) 在验证和省略校验和之前确保额外完整性检查已经就位. 如果 UDP Checksum 验证失败, 压缩器必须 (MUST) 丢弃该分组.
展开设置了 C bit 的 6LoWPAN 分组的解压缩器, 必须 (MUST) 代表源节点计算 UDP Checksum, 并按照现行标准 [RFC0768], [RFC2460] 的规定将该值放入恢复后的 UDP 头部. 解压缩器必须 (MUST) 明确判断压缩器已经设置了额外完整性检查并验证该完整性检查, 且应当 (SHOULD) 在恢复 UDP Checksum 之后这样做. 如果解压缩器无法明确判断存在完整性检查, 或验证失败, 解压缩器必须 (MUST) 丢弃该分组.
计算和验证 UDP Checksum 以及额外完整性检查的推荐顺序, 可确保数据从不以未受保护形式存储在内存中. 实践中, 层之间的功能分离可能会妨碍采用推荐顺序. 但是, 实现者在处理伪头部覆盖的未受保护数据时, 应特别注意并理解相关风险.
为允许中间节点压缩 UDP Checksum, 如果传入分组设置了 C bit, 且转发节点能够明确判断在 UDP Checksum 被省略期间存在覆盖与 UDP Checksum 相同数据的完整性检查, 则该转发节点可以 (MAY) 推断该传入分组获得了上层授权. 如果转发节点无法在 UDP Checksum 被省略期间明确判断存在完整性检查并验证该完整性检查, 则禁止 (MUST NOT) 推断授权.
4.3.3. UDP LOWPAN_NHC 格式 (UDP LOWPAN_NHC Format)
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 | 1 | 1 | 1 | 0 | C | P |
+---+---+---+---+---+---+---+---+
Figure 14: UDP 头部编码
C: 校验和 (Checksum):
0: Checksum 的全部 16 bit 以内联方式携带.1: Checksum 的全部 16 bit 被省略. Checksum 通过在 6LoWPAN 终止点重新计算来恢复.
P: 端口 (Ports):
00: Source Port 和 Destination Port 的全部 16 bit 都以内联方式携带.01: Source Port 的全部 16 bit 以内联方式携带. Destination Port 的前 8 bit 为 0xf0 并被省略. Destination Port 的剩余 8 bit 以内联方式携带.10: Source Port 的前 8 bit 为 0xf0 并被省略. Source Port 的剩余 8 bit 以内联方式携带. Destination Port 的全部 16 bit 以内联方式携带.11: Source Port 和 Destination Port 的前 12 bit 都为 0xf0b 并被省略. 每个端口的剩余 4 bit 以内联方式携带.
以内联方式携带的字段 (部分或全部) 按照其在 UDP 头部格式 [RFC0768] 中的相同顺序出现. UDP Length 字段必须 (MUST) 始终被省略, 并使用 6LoWPAN Fragmentation 头部或 IEEE 802.15.4 头部从较低层推断.