webrtc笔记-信令部分(网络socket)

webrtc通过P2P打通媒体通道,确定本地和远端的IP:PORT对(socket),P2P打洞涉及STUN/TURN协议,主要在P2PTransportChannel类进行,包括收集候选地址,创建维护connections,收发包的主要功能。

参考conductor类,信令流程主要在OnSuccess,OnIceCandidate,OnMessageFromPeer函数,先使用offer/answer消息交换sdp,再交换候选,交换候选没有消息类型,OnMessageFromPeer解析对端消息可以看出不同的处理分支。

一、收集候选地址(ip:port对,socket)
1、候选地址类型分为4类
主机候选(host):从网卡中获取的本地传输地址,如果此地址位于NAT之后,则为内网地址,通过信令服务器(offer/answer,sip)传给对端
服务器反射候选项(srflx):从发送给STUN服务器的Bingding检查中获取的传输地址,如果此地址位于NAT之后,则为最外层NAT的公网地址,通过信令服务器传给对端
对端反射候选(prflx):从对端发送的Stun Binding应答获取的传输地址,一种在连接检查期间新发生的候选,即对对端的候选进行stun检查
中继候选项(relay):媒体中继服务器的传输地址,通过TURN Allocate请求获取,通过信令服务器传给对端
webrtc笔记-信令部分(网络socket)_第1张图片
2、从候选地址类型可以看出,候选地址分本端和远端的地址,收集的动作主要在本端,远端的地址由远端通过信令发送过来。本端地址的收集主要在MaybeStartGathering函数,可以收集host,srflx,relay类型的地址,prflx类型的地址在收到远端地址后,stun检查中获取。

3、代码阅读要注意sigslot机制,Port类,AsyncUDPSocket类,UDPPort类,PortAllocator类,P2PTransportChannel类之间关系。

二、交换候选地址
使用offer/answer或sip交换媒体属性,媒体属性使用sdp协议记录,之后,待搜集到候选地址后,交换候选地址。
webrt PC的例子里,客户端PeerConnectionClient,服务端PeerChannel,ChannelMember,通过HTTP协议交互

1、CreateOffer/CreateAnswer根据用户配置的RTCOfferAnswerOptions信息构造消息(sdp,用JsepSessionDescription类存储配置信息);
2、SetLocalDescription/SetRemoteDescription将用户配置的RTCOfferAnswerOptions信息(JsepSessionDescription类)设置到transport(PushdownTransportDescription),channel(PushdownMediaDescription)等实体;
3、AddIceCandidate将对端的候选地址下发到transport,并创建connection,stun检查,使用ping做长连接心跳检查。connection是本地网卡地址与对端候选地址的组合。进行STUN检查是用stun binding消息,并定时ping检查,保证connection信息准确;SortConnectionsAndUpdateState对每个connection排序,可保证优先选择通畅的连接,这里的ping是STUN的bind消息。

STUN协议参考https://www.cnblogs.com/pannengzhi/p/5041546.html

connection
webrtc笔记-信令部分(网络socket)_第2张图片

三、收发媒体数据
传输层使用UDP传输媒体数据,P2PTransportChannel::SendPacket调用Connection::Send,接着调用UDPPort::SendTo,AsyncUDPSocket::SendTo,最终调用系统函数::sendto发送数据。通过sigslot机制SignalSentPacket信号将发送结果回调给call进行统计。

通过SignalReadEvent信号,OnSocketNotify回调AsyncUDPSocket::OnReadEvent,然后调用系统函数::recvfrom接收数据,接收完数据使用SignalReadPacket信号回调UDPPort::OnReadPacket,P2PTransportChannel::OnReadPacket,一层一层上到应用层处理。

四、一些重要流程节点
1、create offer消息,触发收集local candidates函数MaybeStartGathering,MaybeStartGathering函数会create session并调用StartGettingPorts,过程在BasicPortAllocatorSession::OnMessage中体现。
2、session过程DoAllocate中创建sequence,在sequence中create ports,过程在AllocationSequence::OnMessage中体现。
3、Create Port 会根据不同的端口类型调用对应的初始化函数,例如UDPPort::Init,创建套接字,根据信号执行不同操作,OnLocalAddressReady会发stun的bind请求来收集NAT公网地址,收集后通过signal通知session结果
4、收到answer消息,触发UseCandidatesInSessionDescription设置remote candidates,接着local与remote组成connect.
5、对connects有两个动作,SortConnectionsAndUpdateState和MaybeStartPinging,最终取得selected_connection_用来做P2P传输数据。

你可能感兴趣的:(音视频,webrtc)