宏观流程
- 使用websocket或者其他方式先建立连接;
- 创建并设置 local sdp;
- 服务器和客户端使用websocket交换彼此的sdp;
- 设置 remote sdp
- 收集 local candidates;
- 两端发送并交换candidates;
- 添加 remote candidates;
- 使用remote candidates 创建connection;
- ICE 连通性检查,建立 P2P 连接;
- P2P 数据传输;
建立第三方连接
建立第三方连接的方式可以使用webscoket或者其他任何可以传输数据的方式,主要是用来前期传输sdp和candidate相关的数据的。
创建local sdp
SDP,它是一种描述会话(Session)的协议,实际上就是一个字符串。它里面最基础的有多媒体数据格式和网络传输地址,当然还包括很多其他的配置信息。createOffer
主要逻辑就是根据创建 PeerConnection
对象时指定的 MediaConstraints
,以及在 createOffer
调用前添加的 VideoTrack
/AudioTrack
/DataChannel
情况,拼出初始 SDP,最后在 PeerConnectionClient.SDPObserver#onCreateSuccess
中会添加 codec 相关的值。 P2P 连接的建立过程,offer 和 answer 其实都是 SDP,而 local/remote 则是相对的,offer 是会话发起者的 local SDP,是会话加入者的 remote SDP,answer 则是会话发起者的 remote SDP,是会话加入者的 local SDP。
传递candidate
每个传输地址记录值都叫做一个 candidate,candidate 可能有三种:
- 客户端从本机网络接口上获取的地址(host);
- STUN server 看到的该客户端的地址(server reflexive,缩写为 srflx);
- TURN server 为该客户端分配的中继地址(relayed);
candidate 收集完毕后,双方的 candidate 两两配对,然后分三步对 candidate 组合进行连通性检查:
- 把 candidates 组合按优先级排序;
- 按顺序发送检查请求(STUN Binding request),源地址是 candidate 组合的本地 candidate,目的地址是对方 candidate;
- 收到对方的检查请求后发出响应(STUN Binding response);
使用 candidate
交换了 candidate 之后,WebRTC 会建立连接,发送 STUN ping 检查 candidate 连通性。连通性检查通过后,再交换 DTLS 证书,最后就可以发送音视频数据了。
DataChannel
在PeerConnection创建完成之后,会使用其创建DataChannel,并用DataChannel来传递数据