0. WebRTC通话原理
1. 前言
- 当两个不同网络环境的(具备摄像头/麦克风多媒体设备的)浏览器,要实现点对点的实时音视频对话需要进行:
- 媒体协商
- 网络协商
2. 目录
- 媒体协商
- SDP
- 网络协商
- NAT是什么?
- NAT穿透又是什么?
1. 媒体协商
- 媒体协商指两个客户端交换双方的媒体信息。
- 首先两个客户端(Peer-A和Peer-B)通过一个双方都能访问的信令服务器来交换各自的媒体信息。
- 交换的媒体信息是SDP会话描述文本协议,描述了连接双方想要建立怎样的连接和支持的媒体格式。
- 比如,客户端A支持VP8、H264多种编码格式,而客户端B支持VP9、H264,要保证二端都能正确的编解码,那么就需要将H264作为双方的编码格式。
- SDP会话描述文本协议,包含媒体描述信息,比如分辨率,媒体类型(video, audio),编码格式,传输协议(RTP/UDP/IP)以及加密算法等内容,交换SDP的过程称为“媒体协商”。
- SDP解析如下。
1. SDP
- SDP(Session Description Protocol)是用于描述媒体信息的协议,以文本格式描述终端功能和首选项。SDP只包含终端的媒体元数据,不包含媒体数据内容。
- 建立连接的双方通过交换SDP获取彼此的分辨率、编码格式、加密算法等媒体信息。
- SDP通常包含如下内容:
- 会话属性。
- 会话活动的时间。
- 会话包含的媒体信息。
- 媒体编/解码器。
- 媒体地址和端口信息。
- 网络带宽的信息。
- WebRTC使用SDP交换双方的网络和媒体元数据,当遇到连接失败、黑流等问题时,可以分析SDP来查找问题。
1. SDP字段的含义及格式
- 下表所示是SDP各个字段的含义及格式。
- SDP如下。
v=0
o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
s=SDP Seminar
i=A Seminar on the session description protocol
u=http:
e=j.doe@example.com (Jane Doe)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 99
a=rtpmap:99 h263-1998/90000
- 该会话由用户jdoe创建,email地址是[email protected],发起会话的源地址为10.47.16.5,会话名称是SDP Seminar,i和u字段描述了会话的扩展信息。
- t字段指明了会话在2个小时内有效,c字段指明了目标的IP地址为224.2.17.12,地址的TTL是127,a字段表明只接收数据。
- 两个m字段指明都使用RTP音视频配置:第一个音频媒体流使用端口49170,载荷类型是0;第二个视频媒体流使用端口51372,载荷类型是99。
- 最后,a字段指明了类型99使用的编码格式是h263-1998,编码时钟频率是90kHz。
- 再看一段WebRTC使用H.264编码时的SDP信息片段,示例如下。
m=video 49170 RTP/AVP 98
a=rtpmap:98 H264/90000
a=fmtp:98 profile-level-id=42A01E;packetization-mode=1;
- 表示本会话包含的是视频内容,使用H.264进行编码,编码时钟频率是90kHz,profile-level-id和packetization-mode是传给H.264的参数。
2. 网络协商
- 网络协商需要做两个步骤:
- 获取外网IP地址和端口。
- 通过信令服务器交换“网络信息”。
- 理想情况下,每个客户端都使用公网IP,可以直接进行点对点连接,但实际情况中,客户端或大或小都处于某个局域网内,就需要NAT(Network Address Translation,网络地址转换)。
- 但NAT会保护内网地址的安全性,当采用P2P的连接方式,NAT会阻止外网地址的访问,这时就得采用NAT穿透。
- NAT穿透技术很多,WebRTC中使用的STUN协议和TURN协议在UDP里进行应用。
- STUN(Session Traversal Utilities for NAT)是一种公网地址及端口的发现协议,客户端向STUN服务发送请求,STUN服务返回客户端的公网地址及NAT网络信息。
- 对于建立连接的双方都位于对称NAT网络的情况,使用STUN发现网络地址后,仍然无法成功建立连接。这种情况就需要借助TURN协议提供的服务进行流量中转。
- TURN(Traversal Using Relays around NAT)通过数据转发的方式穿透NAT,解决了防火墙和对称NAT的问题。
- TURN支持UDP和TCP协议。
- 通信双方借助STUN协议能够在不使用TURN的情况下成功建立P2P连接。如果有特殊情况,无法建立P2P连接,则仍需要使用TURN进行数据转发。
- 下图展示了单独使用STUN与结合使用STUN和TURN的对比。
- 使用STUN建立的是P2P的网络模型,网络连接直接建立在通信两端,没有中间服务器介入。
- 使用TURN建立的是流量中继的网络模型,用户两端都与TURN服务建立连接,用户的网络数据包通过TURN服务进行转发。
- 下面进行问题解答:
- NAT是什么?
- NAT穿透又是什么?
1. NAT是什么?
- NAT(Network Address Translator)即网络地址转换,用来解决IPv4地址不够用问题。
- 虽然IPv6可以彻底解决地址不够用的问题,但是IPv6要替换IPv4进程缓慢,IPv6覆盖率不高。
- 所以就需要在IPv4协议内缓解地址问题的方案,即NAT。
- NAT基本思想是由NAT设备(比如家用路由器)修改从私有网络发送到互联网的IP报文的源地址字段,以及修改从互联网发送到私有网络的IP报文的目标地址字段。
- NAT的应用极为广泛,当接入某个局域网,或者连接Wi-Fi时,实际上已经处于NAT网络之中了。NAT具有以下优点:
- 共享上网:NAT技术通过地址和端口映射,使用少量公网IP即可实现大量内网IP地址共享上网。
- 提高网络安全性:不同的内网IP地址映射到少量公网IP地址,对外隐藏了内网网络结构,从而防止外部攻击内网服务器,降低了网络风险。
- 方便网络管理:通过改变映射关系即可实现内网服务器的迁移和变更,便于对网络进行管理。
- 节省成本:使用了少量公网IP地址,节省了IP地址的注册及使用费用。
- 下图展示了这个过程。
- 两台处在不同NAT设备后面的主机无法直接建立TCP或UDP连接,借助NAT穿透(NAT traversal)技术可以克服这一问题,让P2P通信成为可能。
- NAT穿透技术很多,WebRTC中使用的STUN协议和TURN协议在UDP里应用,这两个协议也都可以用于TCP。
2. NAT穿透又是什么?
- 按照地址转换方法进行划分,NAT分为如下4类。
- 全锥形NAT(Full cone NAT)
- 一旦一个内网地址(ip1:port1)映射到公网地址(ip2:port2),所有发自ip1:port1的包都经由ip2:port2向外发送。任意外部主机都能通过向ip2:port2发包到达ip1: port1。
- 地址受限锥形NAT(Address-Restricted cone NAT)
- 只接收曾经发送到对端IP地址的数据包。一旦有一个内网地址(ip1:port1)映射到公网地址(ip2:port2),所有发自ip1:port1的包都经由ip2:port2向外发送。任意外部主机(hostAddr:any)都能通过向ip2:port2发包到达ip1:port1,但前提是ip1:port1之前有向hostAddr:any发送过包,any表示端口不受限制。
- 端口受限锥形NAT(Port-Restricted cone NAT)
- 类似地址受限锥形NAT,但是端口也受限制。一旦有一个内网地址(ip1:port1)映射到外网地址(ip2:port2),所有发自ip1:port1的包都经由ip2:port2向外发送。一个外部主机(hostAddr:port3)能够发包到达ip1:port1的前提是ip1:port1之前有向hostAddr:port3发送过包。
- 对称NAT(Symmetric NAT)
- 映射的外网地址端口号不固定,会随着目的地址的变化而变化。
- 锥形NAT与对称NAT的区别在于,在NAT已分配端口号port2给客户端的情况下,如果Client继续用port1端口与另一外网服务器通信,锥型NAT还会继续用原来的port2端口,即所分配的端口号不变。
- 而对于对称NAT,NAT将会分配另一端口号(如port3)给Client的port1端口。
- 即,同一内网主机、同一端口号,对于锥形NAT,无论与哪一个外网主机通信,都不改变所分配的端口号。
- 而对于对称NAT,同一内网主机、同一端口号,每一次与不同的外网主机通信,就重新分配一个端口号。
- 对称NAT的这个特性使得位于该网络下的WebRTC用户无法使用STUN协议建立P2P连接。
- 大型公司网络中经常采用的对称型 NAT,这类网络就需要使用TURN技术,通过数据转发的方式穿透NAT,解决了防火墙和对称NAT的问题。
- WebRTC开源社区提供了coturn项目来实现STUN/TURN服务。