8. 结束 ICE 处理 (Concluding ICE Processing)
本节描述 agent 如何完成 ICE.
8.1. Full Implementation 的过程 (Procedures for Full Implementations)
结束 ICE 涉及 controlling agent 对 pair 进行 nomination, 以及更新状态机.
8.1.1. 提名 Pair (Nominating Pairs)
Controlling agent 使用两种技术之一来 nomination 将由 ICE 选择的 pair: regular nomination 或 aggressive nomination. 如果其 peer 是 lite implementation, agent 必须使用 regular nomination algorithm. 如果其 peer 使用了该 agent 不理解的 ICE options, 即 peer 的 ice-options 属性中存在这些选项, agent 必须使用 regular nomination algorithm. 如果其 peer 是 full implementation, 且没有使用任何 ICE options, 或使用的 ICE options 均为该 agent 所理解, 则 agent 可以使用 aggressive 或 regular nomination algorithm. 然而, regular algorithm 是 推荐, 因为它提供更好的稳定性.
8.1.1.1. 常规提名 (Regular Nomination)
使用 regular nomination 时, agent 允许一定数量的 checks 完成, 这些 checks 都省略 USE-CANDIDATE 属性. 一旦媒体流某个 component 的一个或多个 checks 成功完成, 就会生成 valid pairs 并加入 valid list. Agent 让 checks 继续进行, 直到满足某个停止准则, 然后基于评估准则在 valid pairs 中进行选择. 停止 checks 的准则以及评估 valid pairs 的准则完全属于本地优化事项.
当 controlling agent 选择 valid pair 时, 它会重复产生该 valid pair 的 check, 即将生成该 check 的 pair 入队到 triggered check queue, 但这一次带有 USE-CANDIDATE 属性. 该 check 应当成功, 因为前一个已经成功, 从而使该 pair, 且仅该 pair, 的 nominated flag 被置位. 因此, 对每个 component, valid list 中只会有一个 nominated pair; 当 check list 的状态转为 Completed 时, ICE 将准确选择该 pair 来为该 component 发送和接收媒体.
Regular nomination 提供最大的灵活性, 因为 agent 可以控制 checks 的停止和选择准则. 唯一要求是 agent 必须最终选择且只选择一个 candidate pair, 并为该 pair 生成一个带有 USE-CANDIDATE 属性的 check. Regular nomination 还提高 ICE 对实现差异的韧性, 见第 14 节. Regular nomination 也更稳定, 允许两个 agent 收敛到用于媒体的单一 pair, 不会出现 aggressive algorithm 中可能发生的瞬时选择. Regular nomination 的缺点是它一定会增加时延, 因为它要求再执行一次额外 check.
8.1.1.2. 激进提名 (Aggressive Nomination)
使用 aggressive nomination 时, controlling agent 在其发送的每个 check 中都包含 USE-CANDIDATE 属性. 一旦某个 component 的第一个 check 成功, 它将被加入 valid list, 并且其 nominated flag 被置位. 当所有 component 在 valid list 中都有 nominated pair 时, 媒体就可以使用最高优先级的 nominated pair 开始流动. 然而, 由于 agent 在所有 checks 中都包含了 USE-CANDIDATE 属性, 另一个 check 仍可能随后完成, 使另一个 valid pair 的 nominated flag 被置位. ICE 总是从 valid list 中选择最高优先级的 nominated candidate pair 作为用于媒体的 pair. 因此, 随着 ICE checks 完成, selected pair 实际上可能短暂变化, 形成一系列瞬时选择, 直到最终稳定.
8.1.2. 更新状态 (Updating States)
对于 controlling 和 controlled agents, ICE 处理状态取决于 valid list 中 nominated candidate pairs 的存在情况, 以及 check list 的状态. 注意, 在任意时刻, 以下情况中可能有多个同时适用:
-
如果某个媒体流的 valid list 中没有 nominated pairs, 且 check list 的状态为 Running, ICE processing 继续.
-
如果某个媒体流的 valid list 中至少有一个 nominated pair, 且 check list 的状态为 Running:
-
Agent 必须移除该媒体流中与 nominated pairs 属于同一 component 的 check list 和 triggered check queue 中所有 Waiting 和 Frozen pairs.
-
如果 check list 中某个 In-Progress pair 与某个 nominated pair 属于同一 component, 且其 pair priority 低于该 component 最低优先级 nominated pair 的 priority, agent 应该停止重传该 pair 的 check.
-
-
一旦至少一个媒体流的每个 component 在 valid list 中都有至少一个 nominated pair, 且 check list 的状态为 Running:
-
Agent 必须将该媒体流的 check list 处理状态改为 Completed.
-
Agent 必须继续响应它仍可能收到的该媒体流的任何 checks, 并且如果第 7.2 节的处理要求执行 triggered checks, 则 必须执行.
-
Agent 必须继续重传该 check list 中任何 In-Progress checks.
-
Agent 可以按第 11.1 节所述开始为该媒体流传输媒体.
-
-
一旦每个 check list 的状态都是 Completed:
-
Agent 将整体 ICE processing 状态设置为 Completed.
-
如果 agent 是 controlling, 它会检查每个媒体流每个 component 中优先级最高的 nominated candidate pair. 如果其中任何 candidate pair 不同于最近一次 offer/answer 交换中的 default candidate pair, controlling agent 必须按第 9 节所述生成 updated offer. 如果 controlling agent 使用 aggressive nomination algorithm, 随着为媒体选择的 pairs 变化, 这可能导致生成多个 updated offers. Agent 可以短暂延迟发送 offer, 以允许 selected pairs 稳定下来; 推荐的延迟为一秒.
-
-
如果 check list 的状态为 Failed, ICE 未能完成该媒体流. 正确行为取决于其他媒体流的 check list 状态:
-
如果所有 check lists 都是 Failed, 整体 ICE processing 被视为处于 Failed 状态, agent 应该认为会话失败, 不应该重启 ICE, controlling agent 应该终止整个会话.
-
如果其他媒体流的 check lists 中至少有一个是 Completed, controlling agent 应该在其 updated offer 中从会话移除失败的媒体流.
-
如果其他媒体流的 check lists 中没有任何一个是 Completed, 但至少有一个是 Running, agent 应该允许 ICE 继续.
-
8.2. Lite Implementation 的过程 (Procedures for Lite Implementations)
Lite implementation 结束 ICE 相对直接. 需要考虑两种情况:
Implementation 是 lite, 且其 peer 是 full.
Implementation 是 lite, 且其 peer 是 lite.
ICE 结束的效果是, agent 可以按第 8.3 节所述释放 ICE 未使用的任何已分配 host candidates.
8.2.1. Peer 是 Full
在这种情况下, agent 将从其 peer 收到 connectivity checks. 当 agent 已经为某个媒体流的每个 component 收到包含 USE-CANDIDATE 属性的 connectivity check 时, 该媒体流的 ICE processing 状态从 Running 转为 Completed. 当所有媒体流的 ICE processing 状态都是 Completed 时, 整体 ICE processing 状态为 Completed.
Lite implementation 自身永远不会判定某个媒体流的 ICE processing 失败; 而是由 full peer 作出该判定, 然后在后续 offer 中移除或重启失败的媒体流.
8.2.2. Peer 是 Lite
Offer/answer 交换完成后, 两个 agent 都检查自己的 candidates 以及 peer 的 candidates. 对每个媒体流, 每个 agent 将自己的 candidates 与该媒体流中 peer 的 candidates 进行配对. 当两个 candidates 属于同一 component, 使用相同传输协议, 即本规范中的 UDP, 且来自相同 IP 地址族 (IPv4 或 IPv6) 时, 它们被配对.
-
如果每个 component 只有一个 pair, 该 pair 被加入 Valid list. 如果某个媒体流的所有 component 都有一个 pair, 该媒体流的 ICE processing 状态被设置为 Completed. 如果所有媒体流都是 Completed, 整体 ICE processing 状态被设置为 Completed. 对仅支持 IPv4 的 implementation, 这始终成立.
-
如果每个 component 有多个 pair:
-
Agent 必须基于本地策略选择一个 pair. 由于这种情况只会在 IPv6 中出现, 因此推荐 agent 遵循 RFC 3484 [RFC3484] 的过程选择单一 pair.
-
Agent 将每个 component 的 selected pair 加入 valid list. 如第 11.1 节所述, 这将允许媒体开始流动. 然而, 两个 agent 可能, 事实上也很可能, 选择不同的 pairs.
-
为了协调这一点, controlling agent 必须按第 9.1.3 节所述发送 updated offer, 其中将包含 remote-candidates 属性.
-
Agent 在发送 offer 时 不得更新 ICE processing 状态. 如果这个后续 offer 完成, controlling agent 必须将所有媒体流的 ICE processing 状态改为 Completed, 并将整体 ICE processing 状态改为 Completed. Controlled agent 的状态基于第 9.2.3 节中的逻辑设置.
-
8.3. 释放 Candidate (Freeing Candidates)
8.3.1. Full Implementation 过程
第 8 节中的过程要求 agent 即使在某个媒体流处理完成后, 仍继续监听 STUN requests, 并继续为该媒体流生成 triggered checks. 本节规则描述 agent 何时可以安全地停止在未被 ICE 选择的 candidate 上发送或接收 checks, 然后释放该 candidate.
当 ICE 与 SIP 一起使用, 且某个 offer 被 fork 到多个接收者时, ICE 会与每个 answerer 并行且独立地进行, 它们都使用相同的 local candidates. 一旦使用这些 candidates 的所有 peer 的所有媒体流 ICE processing 都达到 Completed 状态, agent 应该再等待三秒, 然后 可以停止在该 candidate 上响应 checks 或生成 triggered checks. 此时它 可以释放该 candidate. Server reflexive candidates 的释放从不显式进行; 它通过缺少 keepalive 自然发生. 三秒延迟用于处理 aggressive nomination 的情况, 在该情况下 selected pairs 可能在 ICE 完成后迅速变化.
8.3.2. Lite Implementation 过程
一旦使用相关 candidates 的所有 peer 的所有媒体流 ICE processing 都达到 Completed 状态, lite implementation 可以立即释放未被 ICE 选择的 candidates.