当前位置: 首页 > Web前端 > HTML

WebRTC简介

时间:2023-03-28 15:10:06 HTML

什么是WebRTC?很多浏览器都支持,比如Edge、Chrom、Firefox、Opera等。WebRTC总体图WebRTC主要用于实时音视频通信。上图是WebRTC1对1音视频通信的示意图。通过这张图,我们可以了解到,使用WebRTC开发音视频实时通信的整体架构包括:WebRTC端,主要负责音视频的采集/显示、编码/解码、NAT穿越和数据传输等。Signalserver,主要负责信令处理(入房/出房,媒体协商SDP等),可以使用Websocket/Socket实现STUN/TURNserver,主要负责获取本机的公网IP地址WebRTC终端或NAT穿越失败的数据传输(如果NAT穿越成功,使用P2P通信,否则,使用中转服务器中转)交互过程WebRTC端到端连接,以及音视频实时的一般过程通信过程如下:两个WebRTC客户端分别与Signalserver建立连接,Signalserver为WebRTC端分配/加入指定房间。并返回WebRTC房间信息。WebRTC端将创建一个RTCPeerConnection媒体连接。这个连接需要知道双方的流媒体数据格式,才能进行后续的数据传输。它们通过Signal服务器执行SDP媒体协商。WebRTC-1首先创建RTCPeerConnection媒体连接并生成Offer请求(包括客户端支持的媒体格式和其他内容),并设置到RTCPeerConnection的LocalDescription中,然后将Offer请求发送给Signal服务器,Signal服务器将被转发到WebRTC-2端。WebRTC-2端收到Offer请求时,也会创建RTCPeerConnection媒体连接,并将Offer请求中对端支持的SDP设置为RTCPeerConnection的RemoteDescription,并生成Answer响应,设置为LocalDescriptionRTCPeerConnection,然后将其发送到Signal服务器将其转发给WebRTC-1。WebRTC-1收到Answer,设置SDP为RTCPeerConnection的RemoteDescription,完成媒体协商。WebRTC的两端都有对端的连接信息和媒体协商信息,然后就可以连接通信了。注意:WebRTC-1和WebRTC-2建立连接有两种方式:P2P和通过中转服务器中转。SDP包括对端的连接信息。该信息将在生成SDP时与STUN/TURN服务器通信。WebRTC端的ICE(包括如何与其建立连接的信息),然后WebRTC客户端可以通过对方的ICE进行连接。WebRTC如何建立连接WebRTC支持浏览器之间建立连接,但是浏览器所在主机之间的网络环境可能差别很大,有的主机在局域网,有的在公网,本地局域网和公网主机通信需要经过NAT,所以需要了解NAT有哪些类型。让我们看看WebRTC是如何在不同网络环境的机器之间建立连接的。会打一个“洞”,所有知道这个“洞”的外网主机都可以通过这个与主机上的监听程序通信。这个“洞”对应的是NAT映射:内网IP:内网端口<-->外网IP:外网端口那么机器A或C就可以通过这个外网IP与宿主机上的进程通信:外网端口IPRestrictedConeNATIPRestrictedCone是比FullConeNAT严格得多。其主要特点是主机host在NAT中“打洞”后,NAT会对通过打洞的IP地址进行限制。只有注册的IP地址才能通过,也就是说只有本机host访问的外网主机才能通过NAT,即NAT映射表为:IntranetIP:IntranetPort<-->ExtranetIP:ExtranetPort<-->被访问主机的IP,那么只有B可以和X通信,A和C不能通信,因为他们的IP都访问不到。主要特点是主机host在NAT“打洞”后,NAT会对通过打洞的IP地址和端口进行限制。也就是说只有本机host访问的外网主机和提供服务的程序的端口才能通过NAT,即NAT映射表为内网IP:内网端口<-->外网IP:外网端口<-->IPofthehosttovisited:要访问的主机的端口,那么只有B上P1端口的进程才能与之通信。“洞”,访问B会再打一个“洞”,即在六元组内网IP:内网端口<-->外网IP:外网端口<-->外网主机IP:访问的不同端口访问主机和被访问主机对应外网的不同端口,那么主机如何知道自己属于哪一类网络呢?我们需要一台公网服务器,它有两块网卡,那么我们可以通过以下步骤确定它的NAT环境主机,向#1服务器的网卡和端口发送请求,服务器将使用相同的发送Response的IP和端口如果主机没有收到响应,说明主机的网络限制了UDP协议,直接退出。如果能收到返回包,并且返回主机的IP与主机自身IP相同,则说明该主机有公网IP。如果不是,则说明主机处于NAT保护之下。如果主机有公网IP,则需要判断其防火墙类型。这时候可以向server\#1网卡和端口发送请求,然后server\#1另一个网卡网卡和端口返回包如果主机能收到,说明是未受保护的公共网络主机。否则,它受到对称防火墙的保护。如果在步骤3中判断主机受到NAT保护,则需要判断其处于何种类型的NAT环境。步骤如下主机向server#1的网卡和端口发送请求,server#1用另一个网卡和不同的端口发回一个数据包。如果主机收到报文,就说明是一个完整的锥形NAT。如果收不到,就发一个网卡和端口给服务器#2发送请求,用同一个网卡和端口返回数据包。主机收到报文后,比较服务器#1和#2返回的主机外网IP和端口是否一致。如果不一致,就是对称NAT(symmetricNAT的特点是不同的机器通信会开不同的“洞”)如果返回的外网IP和端口相同(说明同一个“洞”被使用),此时你只需要判断是IP限制还是端口限制,就可以向服务器#1的A网卡和端口发送请求,使用同一个网卡的不同端口来返回数据包。如果能收到报文,就是IP限制类型,如果不能收到,就是端口限制类型。我们知道不同restrictedNAT限制的严格程度是symmetricNAT>PortRestrictedNAT>IPRestrictedNAT>FullConeNAT我们在上述方法首先排除了对称和完整的锥体。对称NAT和对称NAT之间,对称NAT和端口限制NAT之间是不可能打洞的。如何建立WebRTC连接?它更复杂。需要考虑端到端的连通性和数据传输的效率。因此,当有多个有效连接时,需要选择传输质量最好的线路。如果可以使用内网连接,就不需要公网了。如果公网不通(比如双方都在对称NAT下),那么就需要通过服务器中转。WebRTC连接建立就是图中红框处理的部分。双方同网段直连内网,绕过公网再连接不同网段的双方建立P2P连接(需要用NAT打个“洞”),以及usetherelayservertotransfertheICEcandidateICE(InteractiveConnectivityEstablishment,ICE)候选表示WebRTC与远端通信使用的协议、IP、端口等,如{IP:xxx.xxx.xxx.xxx,//localIPport:number,//porttype:host/srflx/relay,//type,host表示本地候选,srflx表示内部主机映射的外网地址和端口,relay表示中继candidatepriority:number,//priorityprotocol:UDP/TCP,usernameFragment:string...}WebRTC建立连接时,ICE优先级选择为host>srflx>relay,那么如何获取srflx(外网IP)和中继(中继IP)?这需要了解STUN和TURN协议。STUN协议就是通过上面的NAT引入的。我们知道可以向公网服务器发送请求,然后服务器返回主机的外网IP和端口。这是STUN协议。到自己的公网IP(在公网部署一个STUN服务器,内网主机可以向其发送bing请求获取自己的外网IP和端口)。TURN协议中继类型候选的获取也是通过STUN获取的,只是报文类型不同,主要使用Allocation命令。主机向TURN服务器发送Allocation命令,中继服务器会为服务器分配一个新的端口,用于中继UDP数据报SDP简介SDP简称会话描述协议,用于描述支持的音视频编解码格式通过每个端点和连接相关的信息信息。主要包括以下几个部分:SessionMetadata,会话元数据NetworkDescription,网络描述StreamDescription,流描述SecurityDescriptions,安全描述QosGroupingDescriptions,服务质量描述下面是会话描述和//==========上面表示sessiondescription==========v=0//protocolversiono=-40076593061827749372INIP4127.0.0.1//usernamesessionIDversionnetworkTypeaddressTypeIPs=-//sessionNamet=00//session的开始和结束时间,00表示持久化session...//下面的mediadescription在mediadescription部分包含audio和videomediam=audio9UDP/TLS/RTP/SAVPF11110310490810610513110112113126//Mediatypeaudioport9transportprotocolstreammediaformat...a=rtpmap:111opus/48000/2//RTP数据说明a=fmtp:111minptime=10;useinbandfec=1//格式参数说明...a=rtpmap:103ISAC/16000a=rtpmap:104ISAC/32000...//上面是audio媒体描述,下面是视频媒体描述m=video9UDP/TLS/RTP/SAVPF96979899100101102122127121125107108109124120123119114115116...a=rtpmap:96VP8/90000...//=======安全描述=============a=ice-ufrag:1uEe//连接检测用户名a=ice-pwd:RQe+y7SOLQJET+duNJ+Qbk7z//密码,这两个是连接检测使用的凭证a=fingerprint:sha-25635:6F:40:3D:F6:9B:BA:5B:F6:2A:7F:65:59:60:6D:6B:F9:C7:AE:46:44:B4:E4:73:F8:60:67:4D:58:E2:EB:9C//DTLS指纹认证识别是否是合法用户...//========服务质量说明=========a=rtcp-muxa=rtcp-rsizea=rtpmap:96VP8/90000a=rtcp-fb:96goog-remb//使用Google的带宽评估算法a=rtcp-fb:96transport-cc//启动抗拥塞a=rtcp-fb:96ccmfir//解码错误,请求关键帧a=rtcp-fb:96nack//启用丢包重传功能a=rtcp-fb:96nackpli//类似于fir...多人音视频通信架构?在上面介绍的1对1的通信模型中,如果要实现多对多的通信,一般有3种方案。在Mesh方案中,每个终端在两对之间建立连接,形成一个mesh。MCU(多点会议单元)解决方案。服务器分别与每个客户端建立连接,形成星型结构。所有终端发送的音视频都需要经过服务器的混音后才能发送给客户端。SFU(选择性转发单元)程序。与MCU不同,音视频在这里不混合,只是转发给房间内的其他终端【Mesh架构】【MCU架构】【SFU架构】优缺点Mesh简单,不需要传输数据,不需要开发媒体服务器,上行带宽压力大,资源消耗大,兼容各种客户端MCU技术成熟,客户体验数服务器编解码和混流资源消耗大,延迟SFU高?服务器资源消耗小,延迟低,可以适应不同的终端类型。音视频不同步),客户端使用复杂(混音、渲染等)参考https://zh.wikipedia.org/wiki...https://time.geekbang.org/col...