由WebRTC谈起

由WebRTC谈起,第1张

IP电话是指基于IP网络来实现语音通信的一种通信方式。而IP网络是通过网络交换机、路由器、通信服务器等进行数据转发和传输的,IP电话正是依托这些设备进行语音通信的。因此,在正常情况下,IP电话需要连接到服务器才能进行语音通信。服务器不仅提供数据转发和传输的功能,还负责将数据包转换为语音信号,确保通信顺畅。但是,也有一些IP电话支持STUN和ICE协议,能够在防火墙或NAT路由器的条件下完成语音通信。这样,IP电话就可以“脱离”服务器进行使用。STUN协议通过向外部服务器发送请求,获得外网IP地址及端口,改善了UDP在对称NAT下的无法穿越。ICE则可以在客户端及中间节点的配合下,实现P2P及中继等多种传输方式的自主选择。因此,只有支持STUN和ICE协议的IP电话,才能够在脱离服务器的情况下正常使用。值得注意的是,即使采用了STUN和ICE协议,IP电话也需要正确设置防火墙、端口映射等参数,以便语音数据能够正确传递。同时,网络环境也会影响通话质量,需要确认带宽、延迟、丢包率等参数是否符合要求。因此,在实际使用中,脱离服务器的IP电话需要有技术支持人员进行调试和支持才能保证语音通信的质量。

在一个典型组网中,一个TURN客户端连接在一个私有网络中,通过一个或多个NAT来连接到公网。在公网中有一个TURN服务器。在因特网的别处有一个或多个对端是这个TURN客户端希望通讯的。这些对端也有可能是在一个或多个NAT的后面。该客户端使用服务器作为一个中继来发送数据包 到这些对端去,并且从这些对端接收数据包。

客户端通过一个IP地址和端口的组合来与服务器建立会话。客户端使用TURN命令在服务器上创建和 *** 作一个ALLOCATION。一旦这个allocation创建好了,客户端能够在数据发往哪个对端的指示下发送应用数据到这个服务器,服务器将中继这些数据到合适的对端。

客户端发送的应用数据包含在TURN消息中,服务器将数据提取出来,并以UDP数据包方式发送给对端。反向上,对端以UDP数据包方式发送应用数据到这个allocation提供的中继传输地址。

因为TURN消息总是包含客户端与哪些对端通讯的指示,客户端能够使用单一的allocation来与多个对端通讯。

turn 术语
TURN client:遵循RFC5766的STUN客户端。
TURN server:遵循RFC5766的STUN服务器。
Peer:TURN客户端希望连接的主机。TURN服务器为TURN客户端和它的对端中继流量,但Peer并不与TURN服务器使用TURN协议进行交互,它接收从TURN服务器发送过来的数据,并向TURN服务器发送数据。
Transport Address:IP地址与端口号的组合。
Host Transport Address:客户端或对端的传输地址。
Server-Reflexive Transport Address:NAT公网侧的传输地址,该地址由NAT分配,相当于一个特定的主机传输地址。
Relayed Transport Address:TURN服务器上的传输地址,用于客户端和对端中继数据。
TURN Server Transport Address:TURN服务器上的传输地址,用于客户端发送STUN消息给服务器。
Peer Transport Address:服务器看到的对端的传输地址,当对端是在NAT后面,则是对端的服务器反射传输地址。
Allocation:通过Allocate请求将中继传输地址提供给客户端,除了中继状态外,还有许可和超时定时器等。
5-tuple:五元组,包括客户端IP地址和端口,服务器IP地址和端口和传输协议(包括UDP、TCP、TLS)的组合。
Channel:通道号与对端传输地址的关联,一旦一个通道号与一个对端的传输地址绑定,客户端和服务器就能够利用带宽效应更大的通道数据消息来交换数据。
Permission:一个对端允许使用它的IP地址和传输协议来发送数据到TURN服务器,服务器只为从对端发来的并且匹配一个已经存在的许可的流量中继到相应的客户端。
Realm:服务器内用于描述服务器或内容的一个字符串,这个realm告诉客户端哪些用户名和密码的组合可用于认证请求。
Nonce:服务器随机选择的一个字符串,包含在报文摘要中。为了防止中继攻击,服务器应该有规律的改变这个nonce。

协议交互过程详细举例
以图2为例进行讲解,每个消息中,多个属性包含在消息中并显示它们的值。为了方便阅读,值以人们可读的格式来显示。

接着,客户端为了准备向对端A发送一些应用数据而创建一个permission。这里通过一个CreatePermission请求来做到。该请求携带XOR-PEER-ADDRESS属性包含有确定的请求的IP地址,这里为对端A的地址;需要注意的是,属性中地址的端口号被设置为0在CreatePermission请求中,并且客户端使用的是对端A的server-reflexive地址而不是它的主机地址(私网地址);客户端在该请求中携带与之前的Allocate请求中一样的username、realm和nonce值,因此该请求被服务器认可。此时在该请求中,客户端没有携带SOFTWARE属性。
服务器收到该CreatePermission请求,产生一个相应的许可,并以CreatePermission成功响应来回应。该响应中只包含了Transaction-ID和MESSAGE-INTEGRITY属性。

现在客户端使用Send indication来发送应用数据到对端A。对端的server-reflexive传输地址包含在XOR-PEER-ADDRESS属性中,应用数据包含在DATA属性中。客户端已经在应用层上执行了路径MTU发现功能,因此通过DON’T-FRAGMENT属性来告知服务器当通过UDP方式来向对端发送数据时应设置DF位。Indications不能使用长期证书机制来认证,所以该消息中没有MESSAGE-INTEGRITY属性。
服务器收到Send indication后,提取出应用数据封装成UDP格式发给对端A;UDP报文的源传输地址为中继传输地址,并设置DF位。
对端A回应它自己的包含有应用数据的UDP包给服务器。目的地址为服务器的中继传输地址。当服务器收到后,将生成Data indication消息给客户端,携带有XOR-PEER-ADDRESS属性。应用数据包含在DATA属性中。

接着,对端B发送UDP数据包回应给服务器的中继传输地址。服务器收到后,回应给客户端ChannelData消息,包含UDP数据包中的数据。服务器知道是给哪个客户端发送ChannelData消息,这是因为收到的UDP数据包中的目的地址(即服务器的中继传输地址),并且知道使用的是哪个通道号,这是因为通道已经与相应的传输地址绑定了。

浏览器本身不支持点对点建立信道进行通信,需通过服务器进行中转。因此浏览器之间一次通信需通过两段信道,通信效率同时受制于两段信道宽度,因此并不适合数据流的传输。

WebRTC是浏览器实时通信 RTC 的提供 JS 接口, JS 接口通过信令建立浏览器点对点(peer-to-peer,P2P)的信道,信道可发送任何数据并无需经过服务器。

WebRTC提供三个API

WebRTC使用 RTCPeerConnection 在浏览器之间传递流数据,此流数据通道是P2P的,无需服务器中转。但并不意味着能抛弃服务器,仍需服务器为传递信令(signaling)来建立信道。WebRTC没有定义用于建立信道的信令协议,信令并不是 RTCPeerConnection API 的一部分。

既然没有定义信令(signaling)的协议,可选择任意方式(如AJAX、WebSocket)任意协议(如SIP、XMPP)来传递信令,建立信道。

需要信令来交换信息分为:

通过服务器建立信道

WebRTC提供浏览器之间P2P信道进行数据传输,但建立这个信道必须有服务器的参与。

WebRTC需服务器提供:

NAT/防火墙穿越技术

在处于使用NAT设备的私有TCP/IP网络中的主机之间建立连接时需使用NAT穿越。NAT的行为是非标准化的,穿越技术大多使用公共服务器,使全球任何地方都能访问得到IP地址,在 RTCPeerConnection 中实用ICE框架来保证 RTCPeerConnection 实现NAT穿越。

ICE

ICE(Interactive Connectivity Establishment, 综合性NAT穿越技术)框架整合各种NAT穿越技术如STUN、TURN(Traversal Using Relay NAT,中继NAT实现的穿透),ICE先使用STUN尝试建立一个基于UDP的连接,失败后实用TCP(先尝试>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12723932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存