16. 设置 Ta 和 RTO (Setting Ta and RTO)
在 ICE 的 gathering phase (第 4.1.1 节) 期间以及 ICE 执行 connectivity checks (第 7 节) 时, agent 会发送 STUN 和 TURN transactions. 这些 transactions 以每 Ta 毫秒一次的速率进行 pacing, 并使用特定的 RTO. 本节描述如何计算 Ta 和 RTO 的值. 该计算取决于 ICE 是与 real-time media stream (例如 RTP) 一起使用, 还是与其他内容一起使用. 当 ICE 用于已知最大带宽的流时, 可以按第 16.1 节中的计算来对 ICE 交换进行 rate-control. 对于所有其他流, 必须按第 16.2 节中的计算执行.
16.1. RTP 媒体流
RTO 和 Ta 的值会在 ICE 处理生命周期中变化. 一组值适用于 gathering phase, 另一组值适用于 connectivity checks.
Ta 的值 应该可配置, 并且 应该具有如下默认值:
对于每个媒体流 i:
Ta_i = (stun_packet_size / rtp_packet_size) * rtp_ptime
1
Ta = MAX (20ms, ------------------- )
k
----
\ 1
> ------
/ Ta_i
----
i=1
其中 k 是媒体流数量. 在 gathering phase 期间, Ta 基于 agent 在其 offer 或 answer 中指示的媒体流数量计算, RTP packet size 和 RTP ptime 是每个媒体流最优先编解码器的对应值. 一旦完成 offer 和 answer 交换, agent 会重新计算 Ta, 用于 pacing connectivity checks. 在这种情况下, Ta 的值基于会话中实际会使用的媒体流数量, RTP packet size 和 RTP ptime 是 agent 将用来发送的最优先编解码器的对应值.
此外, [RFC5389] 中定义的 STUN transactions 重传定时器 RTO 应该可配置, 并且在 gathering phase 期间 应该具有如下默认值:
RTO = MAX (100ms, Ta * (number of pairs))
其中 number of pairs 指的是包含 STUN 或 TURN servers 的 candidate pairs 数量.
对于 connectivity checks, RTO 应该可配置, 并且 应该具有如下默认值:
RTO = MAX (100ms, Ta*N * (Num-Waiting + Num-In-Progress))
其中 Num-Waiting 是 check list 中处于 Waiting 状态的 checks 数量, Num-In-Progress 是处于 In-Progress 状态的 checks 数量. 注意, 随着 Waiting 和 In-Progress 状态下 checks 数量变化, 每个 transaction 的 RTO 都会不同.
这些公式的目标是使 STUN transactions 以与媒体相同的速率进行 pacing. 这确保 ICE 也能在支持媒体所需的相同网络条件下正常工作. 更多讨论和动机见附录 B.1. 由于这种 pacing, 获取所有 server reflexive 和 relayed candidates 需要一定时间. 实现应意识到完成此过程所需的时间, 如果应用需要时间预算, 则限制所收集 candidates 的数量.
这些公式产生的行为是: agent 会在执行重传之前, 先为每一个 connectivity check 发送其第一个分组. 这可以从 RTO 的公式中看出 (RTO 表示重传间隔). 这些公式随 N, 即要执行的 checks 数量, 进行缩放. 因此, ICE 保持了很好的恒定速率, 但对分组丢失更敏感. 任何 connectivity check 的第一个分组丢失, 都可能导致该 pair 需要很长时间才能被验证; 相反, 一个较低优先级的 check (但其分组没有丢失) 更可能先完成. 这会导致 ICE 以次优方式运行, 选择低优先级 pairs 而不是高优先级 pairs. 实现者应意识到这一后果, 但仍应使用这里描述的定时器值.
16.2. 非 RTP 会话
在 ICE 用于建立某种非实时会话, 且该会话没有已知可在部署 ICE 的网络上工作的固定速率时, Ta 和 RTO 回退到更保守的值. Ta 应该可配置, 应该默认值为 500 ms, 并且 不得配置为小于 500 ms.
此外, STUN transactions 的重传定时器 RTO 应该可配置, 并且在 gathering phase 期间 应该具有如下默认值:
RTO = MAX (500ms, Ta * (number of pairs))
其中 number of pairs 指的是包含 STUN 或 TURN servers 的 candidate pairs 数量.
对于 connectivity checks, RTO 应该可配置, 并且 应该具有如下默认值:
RTO = MAX (500ms, Ta*N * (Num-Waiting + Num-In-Progress))