


2026 年 9 月 28 日,webrtc-rs/webrtc 发布 v0.21.0。
这是一次覆盖范围较广的版本更新:从预 1.0 阶段的 API 可扩展性准备,到异步 WebRTC 仓库集成;从 RTC 核心的确定性时间能力,到数据通道慢消费者场景下的消息保留;从 PeerConnection 驱动热循环修复,到 Android 后台网络恢复、ICE 重启地址重绑;再到拦截器、RTCP 转发、RTP 首包、SCTP 流标识分配和零窗口死锁等问题处理,v0.21.0 包含了 65 次提交、89 个文件变更,并有 5 位贡献者参与。
本次版本的演进过程经历了 alpha、beta 与候选版本多个阶段,最终形成 v0.21.0 正式发布版本。
版本信息
- 版本:v0.21.0
- 发布日期:2026 年 9 月 28 日
- 提交数量:65
- 变更文件:89
- 贡献者数量:5
- 版本演进:alpha.1、alpha.2、beta.1、beta.2、rc.1、rc.2,最终发布 v0.21.0
本次更新核心内容速览
v0.21.0 的更新内容可归纳为以下几个方向:
- 在 API 冻结前完成可扩展性改造。
- 集成异步 WebRTC 仓库。
- 从 RTCPeerConnection 的公开 API 中移除 crypto_provider。
- 在 RTC 核心中引入确定性时间能力。
- 修复数据通道消费者较慢时入站消息被静默丢弃的问题。
- 修复 PeerConnection driver 在过期超时不推进时可能出现的热循环问题。
- 更新 SettingEngineBuilder。
- 引入 Transport Objects。
- 应用 SettingEngine 中 TURN allocation Refresh 上限。
- 修复 Android 后台约 10 秒后 ICE restart 停滞的问题。
- 修复网络切换后 ICE restart 重绑复用旧解析地址,并在 EADDRNOTAVAIL 时终止 driver 的问题。
- 使用 Attribute::DeliverToApplication 处理 RTCP forwarder。
- 补充 interceptor 示例。
- 修复 RTP 流首个数据包穿越整个 interceptor 链路的问题。
- 修复 SCTP 在 DTLS 角色确定前过早分配 stream-id 的问题。
- 修复 SCTP 在特定情形下的永久零窗口死锁。
- 修复 TURN relayer 消耗 STUN Binding 响应的问题。
- 更新内联文档、README、Cargo 文档以及 RTC 指针版本。
预 1.0 阶段:为 API 冻结前的可扩展性做准备
本次更新包含预 1.0 阶段的 G2 工作,即在 API 冻结前提升 API 的可扩展性。
这一项工作对应 838,并通过 849 合入。更新记录明确指出,此项变更的目标是在 API 正式冻结之前完成可扩展性准备。与此同时,仓库在 8 月 2 日增加了 CHANGELOG.md,用于记录版本演进与变更信息。
同一天还完成了让 v0.20.x 分支运行 GitHub Actions 的调整。随后在 8 月 3 日,v0.21.x 分支也完成 GitHub Actions 运行支持。
这些分支与自动化流程相关的变更,出现在 v0.21.0 的早期开发阶段,并与后续功能开发、测试和版本发布流程共同构成了本次版本的演进基础。
异步 WebRTC 仓库集成
v0.21.0 完成了 P8 工作:集成 async webrtc 仓库。
该项内容在 8 月 4 日完成,并合入 v0.21.x 分支。提交记录中还包括对内联文档和 README.md 的改进。
异步集成是本次版本的重要组成部分。更新记录中明确列出了异步 WebRTC 仓库集成,同时在后续 Transport Objects 相关工作中也包含 T4、T5 异步层内容,以及 T6、T7 测试和文档内容。由此可见,异步相关能力、测试和文档在本次版本周期内均得到了持续推进。
移除 RTCPeerConnection 公开 API 中的 crypto_provider
8 月 5 日,v0.21.0 完成了一项公开 API 调整:从 RTCPeerConnection 中移除公开的 crypto_provider API。
该变更对应 855。更新项直接指出,crypto_provider 不再作为 RTCPeerConnection 的 public API 存在。
对于处于预 1.0 阶段的项目而言,公开 API 的整理与调整具有明确意义:在 API 最终稳定前,项目持续处理接口边界与可扩展性问题。本次版本中,API 可扩展性准备与 crypto_provider 的公开接口移除,均属于这一阶段的关键调整。
RTC 核心引入确定性时间
v0.21.0 包含预 1.0 阶段的 G4 工作:在 RTC core 中实现确定性时间。
这一部分对应 859,在 8 月 7 日完成。提交内容包括:
- C6-01:新增 Runtime::now(),并让 driver 通过该能力获取时间。
- C6-02:新增端到端 MockRuntime 虚拟时钟测试。
- C6-3:将 MockNetwork 重命名为 MockUDPNetwork。
其中,Runtime::now() 的加入以及 driver 对该能力的使用,是本次 RTC 核心确定性时间改造的重要内容。与此同时,端到端 MockRuntime 虚拟时钟测试也被加入,用于覆盖虚拟时钟场景。
8 月 8 日还完成了内部 *_EVENT_CHANNEL_CAPACITY 命名调整。虽然这是内部命名层面的变化,但同样处在 RTC 核心确定性时间工作完成后的版本推进过程中。
修复数据通道慢消费者导致的入站消息静默丢失
数据通道可靠性是本次更新中的重要方向之一。
更新记录指出,当 consumer 处理速度较慢时,入站 data-channel 消息会被静默丢弃。对应修复工作为 858,并通过 861 合入。
该问题在 8 月 9 日经过多个步骤处理:
- E0:建立事实基础。
- E0-02:审计并分类所有发送位置。
- E1:为已接受的残余情况增加可观测性。
- E2-02:webrtc 层由丢弃调整为保留。
从更新记录可以看到,这项修复并不只是单独修改一个发送点,而是先建立问题基线,再审计和分类发送位置,之后增加对残余情况的可观测性,并最终在 webrtc 层采取"retain instead of drop",即保留而不是丢弃的处理方式。
这一系列步骤完整覆盖了数据通道入站消息在慢消费者条件下被静默丢弃的问题。
修复 PeerConnection driver 的非推进过期超时热循环
v0.21.0 修复了 PeerConnection driver 在过期 timeout 不推进时可能出现 hot-loop 的问题。
该问题对应 862,并通过 864 合入。更新项描述为:当过期 timeout 不前进时,PeerConnection driver 可能进入热循环。
该修复在 8 月 10 日完成并合入 v0.21.x 分支。随后同一天,版本号更新至 v0.21.0-alpha.1,并完成 Cargo 文档修复以及 RTC 指针更新。
从版本节奏来看,driver 热循环问题的修复完成后,项目进入第一个 alpha 阶段,开始对 v0.21.0 的阶段性成果进行版本化发布。
SettingEngineBuilder 更新与 TURN allocation Refresh 上限
v0.21.0 对 SettingEngineBuilder 进行了更新,对应 866。
该更新在 8 月 11 日完成并合入。随后同一天,项目完成了 Transport Objects 相关内容,包括:
- T4、T5:异步层。
- T6、T7:测试与文档。
在 SettingEngine 方向,本次版本还应用了 TURN allocation Refresh cap,也就是 SettingEngine 的 TURN allocation Refresh 上限。该项更新对应 870,于 8 月 12 日完成。
因此,v0.21.0 中与 SettingEngine 相关的内容至少覆盖两个部分:
- SettingEngineBuilder 更新。
- TURN allocation Refresh 上限应用。
这两项更新分别从构建配置与 TURN allocation 刷新限制两个方向推进。
Transport Objects:预 1.0 阶段的重要工作
v0.21.0 包含预 1.0 阶段的 C1 工作:Transport Objects。
该工作对应 841,并通过 867 合入。提交记录显示,Transport Objects 包含异步层、测试和文档等内容:
- T4、T5:异步层。
- T6、T7:测试和文档。
完成 Transport Objects 合入后,仓库还更新了 RTC 指针和 README.md。
从更新记录所列内容来看,Transport Objects 与异步层、测试、文档一起构成本次版本的重要模块化工作,并在 v0.21.0 的预发布阶段完成集成。
修复 Android 后台后的 ICE restart 停滞
移动端网络恢复是本次版本重点修复的场景之一。
更新记录指出:在 Android 上,ICE restart 在后台约 10 秒后可能停滞;通过重新绑定 UDP socket 可以恢复。
该问题对应 868,并通过 872 合入,在 8 月 13 日完成。问题描述明确包含以下信息:
- 平台:Android。
- 场景:ICE restart。
- 条件:应用后台约 10 秒后。
- 现象:重启过程停滞。
- 处理:重新绑定 UDP sockets,以恢复重启过程。
这一修复紧接在 TURN allocation Refresh cap 更新之后完成,属于 v0.21.0 中面向网络变化与 ICE 恢复能力的重要改进。
修复网络切换后的 ICE restart 旧地址复用问题
在 Android 后台 ICE restart 修复之后,v0.21.0 又继续处理了网络切换场景下的地址问题。
更新记录指出:网络 handover 后,ICE restart 的重绑会复用旧的已解析地址,并且在 EADDRNOTAVAIL 时终止 driver。
该问题对应 874,并通过 877 合入,在 8 月 16 日完成。
该问题描述包含两个连续现象:
- 网络切换后,ICE restart 重绑使用了过期的已解析地址。
- 当出现 EADDRNOTAVAIL 时,driver 被终止。
因此,v0.21.0 对 ICE restart 的网络恢复处理并非仅覆盖 Android 后台停滞,也覆盖了网络切换后的旧解析地址复用以及 EADDRNOTAVAIL 条件下 driver 终止的问题。
8 月 17 日,版本号更新至 v0.21.0-alpha.2,并再次更新 RTC 指针。
interceptor 重构与 Attribute::DeliverToApplication
在进入 beta 阶段后,v0.21.0 持续推进 interceptor 相关更新。
8 月 19 日,仓库完成了 interceptor 与 AttributedPacket 相关的重构。同时,版本号更新至 v0.21.0-beta.1,并合入对应版本变更。
随后在 8 月 23 日,RTCP forwarder 改为使用 Attribute::DeliverToApplication。该变更对应 880,并在同一天完成合入。
此次 interceptor 与 RTCP forwarder 相关更新包括:
- 使用 AttributedPacket 重构 interceptor。
- RTCP forwarder 使用 Attribute::DeliverToApplication。
- 后续补充 interceptor 示例。
- 修复 RTP 流第一个数据包在 interceptor 链路中的问题。
其中,Attribute::DeliverToApplication 被明确用于 RTCP forwarder,是本次拦截器处理路径调整的重要内容。
8 月 23 日还完成了 v0.21.0-beta.2 版本号更新与合入。
新增 interceptor 示例
8 月 29 日,v0.21.0 增加了 interceptor examples,并完成合入。
interceptor 示例的补充,配合前面 AttributedPacket 重构、Attribute::DeliverToApplication 的使用以及后续 RTP 首包问题修复,使 interceptor 方向在本次版本中同时覆盖了实现、属性传递、示例和问题修复。
更新记录中还明确列出了内联文档更新。文档、README、Cargo 文档与 interceptor 示例共同构成 v0.21.0 文档和示例层面的持续完善。
修复 RTP 流首个数据包穿越整个 interceptor 链路的问题
v0.21.0 修复了 RTP 流第一个数据包的 interceptor 遍历问题。
更新项描述为:修复一个流的第一个 RTP packet 穿越整个 interceptor 的问题。该修复在 8 月 29 日完成。
这一问题与前述 interceptor 重构和示例新增处在同一阶段。对于 RTP 数据流而言,首个数据包在 interceptor 链路中的行为得到修复,是本次版本 RTP 与 interceptor 相关更新中的重要一项。
修复 SCTP stream-id 分配时机问题
v0.21.0 修复了一项 SCTP 与 DTLS 角色相关的问题。
更新项指出:根据 RFC,在 DTLS role 尚未确定之前,延迟 SCTP stream-id 的分配。
该修复对应 886。其核心内容是,SCTP stream-id 的分配不应在 DTLS 角色解析之前过早发生,而应延迟到 DTLS role 已确定之后。
该项更新被明确标注为 RFC 相关修复,涉及 SCTP stream-id 分配时机与 DTLS role 解析顺序。
修复 SCTP 永久零窗口死锁
除 stream-id 分配时机外,v0.21.0 还更新 RTC 指针,以修复 SCTP 的永久 zero-window deadlock 问题。
更新项描述为:更新 RTC 指针,以修复 SCTP 在特定情况下的永久零窗口死锁。
这项工作对应 887。更新内容明确聚焦于 SCTP 的 zero-window deadlock,即永久零窗口死锁问题。
结合前述 SCTP stream-id 延迟分配,本次版本在 SCTP 方向至少包含两项明确修复:
- 在 DTLS role 确定前延迟 SCTP stream-id 分配。
- 修复 SCTP 的永久零窗口死锁。
候选版本阶段:文档更新与 TURN relayer 修复
在 beta 阶段完成后,v0.21.0 继续进入候选版本阶段。
版本演进记录包括:
- 更新至 v0.21.0-rc.1。
- 更新内联文档。
- 修复 v0.20 的 sans-IO 问题:TURN relayer 消耗 STUN Binding 响应。
- 更新至 v0.21.0-rc.2。
其中,TURN relayer 相关修复对应 891,描述为:修复 v0.20 中 sans-IO 场景下 TURN relayer 消耗 STUN Binding responses 的问题。
这一项修复明确涉及三个关键词:
- v0.20。
- sans-IO。
- TURN relayer 与 STUN Binding 响应。
在 rc.1 与 rc.2 两个候选版本之间,项目完成内联文档更新,并处理 TURN relayer 对 STUN Binding 响应的消耗问题,随后继续推进至 rc.2。
完整版本演进回顾
v0.21.0 的开发过程可按时间梳理如下:
- 8 月 2 日:新增 CHANGELOG.md;完成 API 可扩展性准备;让 v0.20.x 分支运行 GitHub Actions。
- 8 月 3 日:让 v0.21.x 分支运行 GitHub Actions。
- 8 月 4 日:完成异步 WebRTC 仓库集成;合入 v0.21.x;改进内联文档与 README.md。
- 8 月 5 日:从 RTCPeerConnection 公开 API 中移除 crypto_provider。
- 8 月 7 日:完成 RTC 核心确定性时间工作;新增 Runtime::now();driver 使用该能力;新增 MockRuntime 虚拟时钟端到端测试。
- 8 月 8 日:MockNetwork 更名为 MockUDPNetwork;调整内部事件通道容量命名。
- 8 月 9 日:处理数据通道慢消费者下入站消息静默丢弃问题;建立事实基础;审计发送位置;增加可观测性;由丢弃改为保留。
- 8 月 10 日:修复 PeerConnection driver 非推进过期超时引发的热循环;发布 alpha.1;修复 Cargo 文档;更新 RTC 指针。
- 8 月 11 日:更新 SettingEngineBuilder;完成 Transport Objects 的异步层、测试和文档;更新 RTC 指针与 README.md。
- 8 月 12 日:应用 SettingEngine TURN allocation Refresh 上限。
- 8 月 13 日:修复 Android 后台约 10 秒后 ICE restart 停滞,通过重绑 UDP sockets 恢复。
- 8 月 16 日:修复网络切换后 ICE restart 重绑复用旧解析地址,以及 EADDRNOTAVAIL 时终止 driver 的问题。
- 8 月 17 日:发布 alpha.2;更新 RTC 指针。
- 8 月 19 日:使用 AttributedPacket 重构 interceptor;发布 beta.1。
- 8 月 23 日:RTCP forwarder 使用 Attribute::DeliverToApplication;发布 beta.2。
- 8 月 29 日:新增 interceptor 示例;修复 RTP 流首个数据包穿越整个 interceptor 的问题。
- 后续阶段:修复 SCTP stream-id 在 DTLS role 确定前分配的问题;修复 SCTP 永久零窗口死锁;发布 rc.1;更新内联文档;修复 TURN relayer 消耗 STUN Binding 响应的问题;发布 rc.2。
- 9 月 28 日:发布 v0.21.0 正式版本。
总结
diamond地址:github.com/webrtc-rs/webrtc
webrtc-rs/webrtc v0.21.0 是一次跨越 API、异步层、RTC 核心时间、数据通道、PeerConnection driver、SettingEngine、Transport Objects、ICE restart、interceptor、RTP、RTCP、SCTP、TURN relayer 与文档示例的集中更新。
其中值得重点关注的内容包括:
- API 冻结前的可扩展性准备。
- async webrtc 仓库集成。
- Runtime::now() 与 MockRuntime 虚拟时钟测试带来的 RTC 核心确定性时间能力。
- 慢消费者场景下 data-channel 入站消息从丢弃调整为保留。
- PeerConnection driver 热循环问题修复。
- Android 后台和网络切换场景下的 ICE restart 重绑修复。
- interceptor 的 AttributedPacket 重构、DeliverToApplication 使用及示例补充。
- RTP 首包 interceptor 路径修复。
- SCTP stream-id 分配时机与永久零窗口死锁修复。
- TURN allocation Refresh 上限与 TURN relayer 消耗 STUN Binding 响应问题修复。
经过 alpha、beta 和 rc 多阶段迭代后,v0.21.0 最终发布,汇集了本次版本周期内的 65 次提交与 89 个文件变更。