WebRTC通话原理

0. WebRTC通话原理

1. 前言

  1. 当两个不同网络环境的(具备摄像头/麦克风多媒体设备的)浏览器,要实现点对点的实时音视频对话需要进行:
    1. 媒体协商
    2. 网络协商

2. 目录

  1. 媒体协商
    1. SDP
  2. 网络协商
    1. NAT是什么?
    2. NAT穿透又是什么?

1. 媒体协商

  1. 媒体协商指两个客户端交换双方的媒体信息。
  2. 首先两个客户端(Peer-A和Peer-B)通过一个双方都能访问的信令服务器来交换各自的媒体信息。
  3. 交换的媒体信息是SDP会话描述文本协议,描述了连接双方想要建立怎样的连接和支持的媒体格式。
    1. 比如,客户端A支持VP8、H264多种编码格式,而客户端B支持VP9、H264,要保证二端都能正确的编解码,那么就需要将H264作为双方的编码格式。

image.png

  1. SDP会话描述文本协议,包含媒体描述信息,比如分辨率,媒体类型(video, audio),编码格式,传输协议(RTP/UDP/IP)以及加密算法等内容,交换SDP的过程称为“媒体协商”。
  2. SDP解析如下。

1. SDP

  1. SDP(Session Description Protocol)是用于描述媒体信息的协议,以文本格式描述终端功能和首选项。SDP只包含终端的媒体元数据,不包含媒体数据内容。
    1. 建立连接的双方通过交换SDP获取彼此的分辨率、编码格式、加密算法等媒体信息。
  2. SDP通常包含如下内容:
    1. 会话属性。
    2. 会话活动的时间。
    3. 会话包含的媒体信息。
    4. 媒体编/解码器。
    5. 媒体地址和端口信息。
    6. 网络带宽的信息。
  3. WebRTC使用SDP交换双方的网络和媒体元数据,当遇到连接失败、黑流等问题时,可以分析SDP来查找问题。

1. SDP字段的含义及格式

  1. 下表所示是SDP各个字段的含义及格式。image.png
  2. 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://www.example.com/seminars/sdp.pdf
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
  1. 该会话由用户jdoe创建,email地址是[email protected],发起会话的源地址为10.47.16.5,会话名称是SDP Seminar,i和u字段描述了会话的扩展信息。
  2. t字段指明了会话在2个小时内有效,c字段指明了目标的IP地址为224.2.17.12,地址的TTL是127,a字段表明只接收数据。
  3. 两个m字段指明都使用RTP音视频配置:第一个音频媒体流使用端口49170,载荷类型是0;第二个视频媒体流使用端口51372,载荷类型是99。
  4. 最后,a字段指明了类型99使用的编码格式是h263-1998,编码时钟频率是90kHz。
  5. 再看一段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;
  1. 表示本会话包含的是视频内容,使用H.264进行编码,编码时钟频率是90kHz,profile-level-id和packetization-mode是传给H.264的参数。

2. 网络协商

  1. 网络协商需要做两个步骤:
    1. 获取外网IP地址和端口。
    2. 通过信令服务器交换“网络信息”。
  2. 理想情况下,每个客户端都使用公网IP,可以直接进行点对点连接,但实际情况中,客户端或大或小都处于某个局域网内,就需要NAT(Network Address Translation,网络地址转换)。
  3. 但NAT会保护内网地址的安全性,当采用P2P的连接方式,NAT会阻止外网地址的访问,这时就得采用NAT穿透。
  4. NAT穿透技术很多,WebRTC中使用的STUN协议和TURN协议在UDP里进行应用。
  5. STUN(Session Traversal Utilities for NAT)是一种公网地址及端口的发现协议,客户端向STUN服务发送请求,STUN服务返回客户端的公网地址及NAT网络信息。
  6. 对于建立连接的双方都位于对称NAT网络的情况,使用STUN发现网络地址后,仍然无法成功建立连接。这种情况就需要借助TURN协议提供的服务进行流量中转。
  7. TURN(Traversal Using Relays around NAT)通过数据转发的方式穿透NAT,解决了防火墙和对称NAT的问题。
    1. TURN支持UDP和TCP协议。
  8. 通信双方借助STUN协议能够在不使用TURN的情况下成功建立P2P连接。如果有特殊情况,无法建立P2P连接,则仍需要使用TURN进行数据转发。
  9. 下图展示了单独使用STUN与结合使用STUN和TURN的对比。
    1. 使用STUN建立的是P2P的网络模型,网络连接直接建立在通信两端,没有中间服务器介入。
    2. 使用TURN建立的是流量中继的网络模型,用户两端都与TURN服务建立连接,用户的网络数据包通过TURN服务进行转发。

image.png

  1. 下面进行问题解答:
    1. NAT是什么?
    2. NAT穿透又是什么?

1. NAT是什么?

  1. NAT(Network Address Translator)即网络地址转换,用来解决IPv4地址不够用问题。
  2. 虽然IPv6可以彻底解决地址不够用的问题,但是IPv6要替换IPv4进程缓慢,IPv6覆盖率不高。
  3. 所以就需要在IPv4协议内缓解地址问题的方案,即NAT。
  4. NAT基本思想是由NAT设备(比如家用路由器)修改从私有网络发送到互联网的IP报文的源地址字段,以及修改从互联网发送到私有网络的IP报文的目标地址字段。
  5. NAT的应用极为广泛,当接入某个局域网,或者连接Wi-Fi时,实际上已经处于NAT网络之中了。NAT具有以下优点:
    1. 共享上网:NAT技术通过地址和端口映射,使用少量公网IP即可实现大量内网IP地址共享上网。
    2. 提高网络安全性:不同的内网IP地址映射到少量公网IP地址,对外隐藏了内网网络结构,从而防止外部攻击内网服务器,降低了网络风险。
    3. 方便网络管理:通过改变映射关系即可实现内网服务器的迁移和变更,便于对网络进行管理。
    4. 节省成本:使用了少量公网IP地址,节省了IP地址的注册及使用费用。
  6. 下图展示了这个过程。

image.png

  1. 两台处在不同NAT设备后面的主机无法直接建立TCP或UDP连接,借助NAT穿透(NAT traversal)技术可以克服这一问题,让P2P通信成为可能。
  2. NAT穿透技术很多,WebRTC中使用的STUN协议和TURN协议在UDP里应用,这两个协议也都可以用于TCP。

2. NAT穿透又是什么?

  1. 按照地址转换方法进行划分,NAT分为如下4类。
    1. 全锥形NAT(Full cone NAT)
      1. 一旦一个内网地址(ip1:port1)映射到公网地址(ip2:port2),所有发自ip1:port1的包都经由ip2:port2向外发送。任意外部主机都能通过向ip2:port2发包到达ip1: port1。
    2. 地址受限锥形NAT(Address-Restricted cone NAT)
      1. 只接收曾经发送到对端IP地址的数据包。一旦有一个内网地址(ip1:port1)映射到公网地址(ip2:port2),所有发自ip1:port1的包都经由ip2:port2向外发送。任意外部主机(hostAddr:any)都能通过向ip2:port2发包到达ip1:port1,但前提是ip1:port1之前有向hostAddr:any发送过包,any表示端口不受限制。
    3. 端口受限锥形NAT(Port-Restricted cone NAT)
      1. 类似地址受限锥形NAT,但是端口也受限制。一旦有一个内网地址(ip1:port1)映射到外网地址(ip2:port2),所有发自ip1:port1的包都经由ip2:port2向外发送。一个外部主机(hostAddr:port3)能够发包到达ip1:port1的前提是ip1:port1之前有向hostAddr:port3发送过包。
    4. 对称NAT(Symmetric NAT)
      1. 映射的外网地址端口号不固定,会随着目的地址的变化而变化。
  2. 锥形NAT与对称NAT的区别在于,在NAT已分配端口号port2给客户端的情况下,如果Client继续用port1端口与另一外网服务器通信,锥型NAT还会继续用原来的port2端口,即所分配的端口号不变。
  3. 而对于对称NAT,NAT将会分配另一端口号(如port3)给Client的port1端口。
    1. 即,同一内网主机、同一端口号,对于锥形NAT,无论与哪一个外网主机通信,都不改变所分配的端口号。
    2. 而对于对称NAT,同一内网主机、同一端口号,每一次与不同的外网主机通信,就重新分配一个端口号。
  4. 对称NAT的这个特性使得位于该网络下的WebRTC用户无法使用STUN协议建立P2P连接。
    1. 大型公司网络中经常采用的对称型 NAT,这类网络就需要使用TURN技术,通过数据转发的方式穿透NAT,解决了防火墙和对称NAT的问题。
  5. WebRTC开源社区提供了coturn项目来实现STUN/TURN服务。

猜你喜欢

转载自blog.csdn.net/weixin_41910694/article/details/128905855