timzaak / blog

8 stars 1 forks source link

WebRTC 资料整理 #94

Closed timzaak closed 8 months ago

timzaak commented 1 year ago

总参考图

webrtc_stack

WebRTC for the Curious

中文版本:给好奇者的 WebRTC

很好的概念入门资料。以下皆概念皆来自于此。

timzaak commented 1 year ago

WebRTC大致过程

Signaling

依据 SDP (Session Description Protocol), 相互传递:通信地址,音视频轨道、编解码,Auth、加密证书,并非必需,可用其他方式替代。

Connecting

ICE (Interactive Connectivity Establishment) 确定通信通道/方式,会维护所有备选通道,以备当前通道失效。例如P2P、Relay。 TURN 是有中继能力的服务器,STUN 获得P2P的打洞通信地址。mDNS是局域网相互发现的一个补充。 服务器端发力点:TURN、STUN

Securing

DTLS (Datagram Transport Layer Security) is TLS over UDP。DTLS 握手交换证书,后续的通信都会基于DTLS进行加解密。

Communicating

SCTP (Stream Control Transmission Protocol) send and receive DataChannel messages RTP (Real-time Transport Protocol) + RTCP exchange media

部分详细流程记录

Offer <-> Answer

Offer Answer Rust example 该流程是上述的 Connecting 的具体实现,具体步骤是: A端创建 PeerConnection 发起 Offer 请求(SDP )到 B 端(HTTP 请求)。 B端收到后,创建 PeerConnection,设置 PeerConnection::set_remote_description(Offe),并返回 Answer(SDP )到 A端。 A端接收后,设置 PeerConnection::set_remote_description(Anwser)。

就此双方会就各自的ICE配置( 在SDP中) 进入到协商通信阶段,双方至少有一方要将 candidate 传递给对方(HTTP 请求),以此选出合适的通信路径进行通信。

或者是说,在相互传递 offer, anwser 之前, 调用 gathering_complete_promise, 提前收集 candidate 列表,并将此 candidate 列表构造成 RTCSessionDescription 传递给对方。此方案不推荐。

An ICE Agent is either Controlling or Controlled. The Controlling Agent is the one that decides the selected Candidate Pair. Usually, the peer sending the offer is the controlling side.

Broadcast

broadcast example broadcast 包含基础的视频流数据处理 + 多播转发。距离正式环境,就是各种参数调优 + 硬件编解码 + Turn Relay。

Reconnection

ICE Server 配置变化时,只能重新创建 PeerConnection。 PeerConnection 断开链接时,有一定可能性重连(具体未知),当 on_peer_connection_state_change 触发 failed 时,可以重新创建 Offer/Answer,进行重建链接,此时 Offer 的参数:iceRestart = true。 链接创建后,先前未能发送的数据会一股脑的发出去。

WebRTC源码与衍生物

WebRTC 国内编译Google C++ 版本 Rust 实现的 WebRTC Go 实现 WebRTC:Pion WebRTC SDK,提供不同平台预编译lib(有Flutter版本) 服务器端看Go,客户端就只有C++版本可用

timzaak commented 1 year ago

额外补充

在总参考图里,整个 WebRTC 基于UDP,而 TURN 、STUN 都有基于 TCP 的 RFC,Chrome/Firefox 已经实现支持 TCP 的TURN, 但不清楚在TCP下,DTLS、SCTP 会如何处理。

目前最火的开源 WebRTC 项目: Pion, 其 TURN 组件对 TCP中继 尚在规划中。现成的代码只能看 Google 开源的 C++ 版本。

相关项目

STUN_SERVER C++, STUN 服务器端客户端实现 coturn/coturn C STUN+TRUN+ICE 服务器端/客户端实现,代码比较难以理解,还是阅读zerotier 或 Rust 相关实现比较轻松

turn-rs Rust 实现的 STUN+TRUN 服务器端,可搭配 webrtc ice rust 使用

名词缩写