webrtc 信令
来自ChatGPT
WebRTC(Web Real-Time Communication)是一种可以在浏览器之间实现实时音视频通信的技术。信令是 WebRTC 中的一部分,用于管理会话的建立、维护和结束。简单来说,信令是用于交换元数据以建立连接的过程。
在 WebRTC 中,需要进行一些信令交换步骤来建立连接,例如:
交换SDP(Session Description Protocol):每个端点都需要将其本地的SDP发送给对方,并且解析对方发来的SDP。
交换ICE(Interactive Connectivity Establishment)候选项:WebRTC 会在两个端点之间建立多个连接,并尝试找到最佳的连接。ICE候选项是一组网络地址和端口,用于在对等方之间建立连接。
交换网络信息:包括网络类型、带宽和网络状况等信息,以帮助双方选择最佳的连接。
以上这些步骤需要通过信令服务器来完成。信令服务器负责协调连接双方之间的通信,并确保会话能够顺利进行。WebRTC 并没有规定信令协议,因此开发人员可以自行选择适合自己应用的协议,例如 SIP(Session Initiation Protocol)、XMPP(Extensible Messaging and Presence Protocol)或 WebSocket 等。
本文看下是如何获取ICE候选项 ice candidate
在 WebRTC 中,ICE(Interactive Connectivity Establishment)协议用于在两个端点之间建立多个连接,并尝试找到最佳的连接。ICE协议使用候选项(Candidate)来表示可以建立连接的网络地址和端口组合。
在 WebRTC 中,候选项由 ICE 代理服务器生成,并发送给对端。ICE 代理服务器可以是 STUN(Session Traversal Utilities for NAT)服务器、TURN(Traversal Using Relay NAT)服务器或者同时支持 STUN 和 TURN 功能的服务器。
当 WebRTC 客户端开始建立连接时,它会向 ICE 代理服务器发送一个请求,以获取可用的候选项。ICE 代理服务器会返回一组网络地址和端口组合,用于尝试建立连接。ICE 候选项可能包括以下几种类型:
- 主机候选项(Host Candidate):本地计算机的网络地址和端口组合。
- 服务器反射候选项(Server Reflexive Candidate):通过 STUN 服务器获取的公网 IP 地址和端口组合。
- 对称候选项(Symmetric Candidate):使用对称 NAT 进行 NAT 穿透时获取的网络地址和端口组合。
- 中继候选项(Relay Candidate):使用 TURN 服务器进行 NAT 穿透时获取的网络地址和端口组合。
ICE 候选项是根据网络状况动态生成的,当网络环境发生变化时,WebRTC 客户端可能会重新生成新的候选项并发送给对端。因此,在建立 WebRTC 连接时,确保正确获取和处理 ICE 候选项非常重要,以确保连接的稳定性和质量。
SdpOfferAnswerHandler
在 crateoffer
&& setlocalDescription
之后就需要获取 candidate了,setlocalDescription 从 PeerConnection 进到 SdpOfferAnswerHandler
1 | webrtc/src/pc/sdp_offer_answer.cc |
注释也说的很清楚了 transport_controller_s()->MaybeStartGathering();
获取 candidates 的入口。
MaybeStartGathering
1 | /Users/blackox626/webrtc/src/pc/peer_connection.cc |
注册了 candidate 获取的回调: transport_controller_->SubscribeIceCandidateGathered
先看下收集之后的行为
1 | void PeerConnection::OnTransportControllerCandidatesGathered( |
首先 sdp_handler_->AddLocalIceCandidate(candidate.get()); 设置本地ice candidate
然后 通过 OnIceCandidate 事件回调 传递到上层app ,app通过 signal message 发送到webrtc server,webrtc server 转发给对端
app 同样也会收到 webrtc server转发过来的对端的 ice candidate
1 | void PeerConnection::AddIceCandidate( |
通过 sdp_handler_->AddIceCandidate 设置对端的ice candidate;
JsepTransportController
JavaScript Session Establishment Protocol (JSEP) JavaScript 会话建立协议
1 | /webrtc/src/pc/jsep_transport_controller.cc |
先看下 DtlsTransports 的生产过程
1 | SdpOfferAnswerHandler::DoSetLocalDescription -> |
1 | .../webrtc/src/p2p/base/default_ice_transport_factory.cc |
在来看 dtls->ice_transport()->MaybeStartGathering()
dtls->ice_transport() 就是 P2PTransportChannel
1 | dtls->ice_transport()->SignalCandidateGathered.connect( |
这里就跟之前的peer_connection 中 SubscribeIceCandidateGathered 注册回调 对应上了
P2PTransportChannel
1 | .../webrtc/src/p2p/base/p2p_transport_channel.cc |
1 | .../webrtc/src/p2p/client/basic_port_allocator.cc |
通过 udp port 连接到 ice server , 注册 OnCandidateReady 回调 就跟前面 p2p_transport_channel OnCandidateReady 对应上了
port
1 | .../webrtc/src/p2p/base/stun_port.cc |
udp port 跟 stun/turn server socket连接 发送 SendStunBindingRequest,拿到 related_address。
1 | .../webrtc/src/p2p/base/port.cc |
AddAddress 创建 Candidate,通过 SignalCandidateReady 层层回调返回 回去….
conclusion
整个 Candidate 的 收集过程就走完了 ~ OVER ~
在 WebRTC 中,ICE 协议使用 ICE Candidate 信息来描述设备的网络地址。ICE Candidate 包含以下信息:
媒体类型(音频或视频)
协议类型(UDP 或 TCP)
IP 地址
端口号
套接字类型(IPv4 或 IPv6)
优先级
基础地址类型(服务器反射地址、对称 NAT 地址、中继地址等)
根据 ICE Candidate 中的基础地址类型,可以将 ICE Candidate 分为以下四种类型:
主机候选(host candidate):主机候选是指设备的本地地址,即通过 STUN 服务器获取的本地 IP 地址和端口号。主机候选可以直接用于通信,是 ICE 协议中优先级最高的候选类型。
服务器反射候选(server reflexive candidate):服务器反射候选是指通过 STUN 服务器获取的公网 IP 地址和端口号。服务器反射候选可以用于 NAT 环境下的通信,优先级次于主机候选。(stun bingding request)
中继候选(relay candidate):中继候选是指通过 TURN 服务器获取的 IP 地址和端口号。中继候选可以用于 NAT 环境下的通信,但通信质量可能会较差,优先级最低。
连通性测试过程中,在来自对方的数据报文里看到的地址(peer reflexive,缩写为prflx) (Connection Request)