3.2.1.1. 发送方行为 (替代 RFC 8724 第 8.4.3.1 节)
3.2.1.1. 发送方行为
在开始对新的 SCHC Packet 进行分片时:
-
fragment 发送方 MUST 为此 SCHC Packet 选择一个 RuleID 和 DTag value 对. 如果某个 Rule 的 M 和 WINDOW_SIZE 值使得该 SCHC Packet 无法被分片为 (2^M) * WINDOW_SIZE 个或更少 tile, 则该 Rule MUST NOT 被选择.
-
fragment 发送方 MUST 为该 RuleID 和 DTag value 对将 Attempts counter 初始化为 0.
Regular SCHC Fragment 消息在其 payload 中携带一个或多个 tile. 如果一个 Regular SCHC Fragment 携带多个 tile:
-
所选 tile MUST 在原始 SCHC Packet 中连续, 并且
-
它们 MUST 在 SCHC Fragment Payload 中彼此相邻放置, 顺序与它们在 SCHC Packet 中从起始到末尾出现的顺序一致.
不是最后一个的 tile MUST 按第 8.3.1.1 节中的规定在 Regular SCHC Fragment 中发送. FCN 字段 MUST 包含在该 SCHC Fragment 中发送的第一个 tile 的 tile index.
在 Regular SCHC Fragment 消息中, 发送方 MUST 用该 SCHC Fragment 中发送的第一个 tile 的 window number 填充 W 字段.
Profile MUST 定义 SCHC Packet 的最后一个 tile 如何发送:
-
在 Regular SCHC Fragment 中发送, 可单独发送或作为 multi-tiles Payload 的一部分发送,
-
在 All-1 SCHC Fragment 中单独发送, 或
-
使用上述两种方法中的任一种.
在 All-1 SCHC Fragment 消息中, 发送方 MUST 用 SCHC Packet 最后一个 tile 的 window number 填充 W 字段.
fragment 发送方 MUST 发送 SCHC Fragment, 使这些 SCHC Fragment 合在一起包含被分片 SCHC Packet 的所有 tile.
fragment 发送方 MUST 至少发送一个 All-1 SCHC Fragment.
在执行上述两项时, 发送方 MUST 确认接收方不会同时通过 Regular SCHC Fragment 和 All-1 SCHC Fragment 接收最后一个 tile.
fragment 发送方在发送以下消息之后 MUST 监听 SCHC Compound ACK 消息:
-
All-1 SCHC Fragment, 或
-
SCHC ACK REQ.
Profile MAY 指定 fragment 发送方 MUST 监听 SCHC Compound ACK 消息的其他时间. 例如, 可以是在发送完整一个 window 的 tile 之后.
每当 fragment 发送方发送 All-1 SCHC Fragment 或 SCHC ACK REQ 时:
-
它 MUST 递增 Attempts counter, 并且
-
它 MUST 重置 Retransmission Timer.
当 Retransmission Timer 到期时:
-
如果 Attempts counter 严格小于 MAX_ACK_REQUESTS, fragment 发送方 MUST 发送 All-1 SCHC Fragment, 或发送 W 字段对应最后一个 window 的 SCHC ACK REQ,
-
否则, fragment 发送方 MUST 发送 SCHC Sender-Abort, 并且它 MAY 以错误条件退出.
为简洁起见, 本节其余部分讨论的所有消息接收, 即使未明确说明, 都应理解为 "匹配正在处理的 RuleID 和 DTag 对".
收到 SCHC Compound ACK 时:
-
如果 SCHC Compound ACK 中的某个 W 字段对应 SCHC Packet 的最后一个 window:
-
如果 C bit 被置位, 发送方 MAY 成功退出.
-
否则:
-
如果 Profile 要求最后一个 tile 在 All-1 SCHC Fragment 中发送:
-
如果 SCHC Compound ACK 表明接收方没有缺失 tile, 发送方:
-
MUST 发送 SCHC Sender-Abort, 并且
-
MAY 以错误条件退出.
-
-
否则:
-
fragment 发送方 MUST 发送 SCHC Fragment 消息, 其中包含 SCHC Compound ACK 中报告为缺失的所有 window 的所有 tile.
-
如果这些 SCHC Fragment 消息中的最后一个不是 All-1 SCHC Fragment, 则 fragment 发送方 MAY 额外发送一个 W 字段对应最后一个 window 的 SCHC ACK REQ, 或重复发送 All-1 SCHC Fragment, 以请求接收方确认所有 tile 都已被正确接收.
-
在执行上述两项时, 发送方 MUST 确认接收方不会同时通过 Regular SCHC Fragment 和 All-1 SCHC Fragment 接收最后一个 tile.
-
-
-
否则:
-
如果 SCHC Compound ACK 表明接收方没有缺失 tile, 发送方 MUST 发送 All-1 SCHC Fragment
-
否则:
-
fragment 发送方 MUST 发送 SCHC Fragment 消息, 其中包含 SCHC Compound ACK 中报告为缺失的所有 tile.
-
fragment 发送方随后 MUST 发送 All-1 SCHC Fragment, 或发送 W 字段对应最后一个 window 的 SCHC ACK REQ.
-
-
-
-
-
否则, fragment 发送方:
-
MUST 发送 SCHC Fragment 消息, 其中包含 SCHC Compound ACK 中报告为缺失的 tile.
-
随后, 它 MAY 发送 W 字段对应最后一个 window 的 SCHC ACK REQ.
-
关于实现符合本规范的发送方行为的有限状态机 (Finite State Machine) 的若干可能示例之一, 见 RFC 8724 的图 43.