WebRtc 建联过程

Posted by alonealice on 2020-12-30

宏观流程

  • 使用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来传递数据