WebRTC入门——协议篇

定义

WebRTC(Web Real-Time Communication)是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准能使用户在无需安装任何插件或者第三方软件的情况下,实现点对点(Peer-to-Peer)的数据分享和电话会议。

WebRTC包含了若干相互关联的API和协议以达到这个目标,下图即为WebRTC 1对1音视频实时通话过程示意图,本文也将围绕示意图展开学习内容

WebRTC 1对1音视频实时通话

协议

NAT

Network Address Translation(网络地址转换),是一种将IP地址空间映射到另一个空间的方法,方法是在数据包通过流量路由设备传输时修改数据包IP报头中的网络地址信息。在IPv4地址耗尽的情况下,它已成为保护全球地址空间必不可少的工具。

为什么要有NAT:这是因为现实中公网的ip地址过少,很多单位、学校都不能满足为每个主机分配一个公网地址,因此会通过NAT技术将内网的主机地址映射为同一公网地址的不同端口,进行外网访问。

NAT原理

NAT的缺点

NAT解决了内网环境下多主机上网的问题,但是也造成了难以从外网访问内网主机的问题。

NAT的分类

  • 圆锥形NAT:相当于在NAT服务器上打了个洞,所有外部主机都可以按照这个公网的IP:port发送数据,并且顺利找到内网主机

    圆锥形NAT

  • 受限锥形NAT:NAT会记录内网主机访问的外网IP,只有来自同一个IP的请求才能转发到内网主机。

    受限锥形NAT

  • 端口受限型NAT:NAT会记录内网主机访问的外网IP和端口,只有来自同一个IP且同一个端口的请求才能转发到内网主机

    端口受限型NAT

  • 对称型NAT:每次请求的连接都会使用不同的公网端口;注意,对称型NAT和其他三个最大的不同点在于每次请求的端口都会变化,这就导致了NAT穿越的难度增加

    对称型NAT

NAT穿透

我们如何实现NAT穿透:方式就是在NAT后面的主机向公网指定端口发送一个包,这样就会在NAT服务器上留下一个端口。其他主机只要知道了这个端口,就可以向内网主机发送数据了,这个行为形象的称之为“打洞”。

  • 一方是圆锥形NAT:

    当一方是圆锥形NAT,它只要向某个公网服务器(例如STUN服务器)发送一个包,这样它在公网的IP和端口就确定了。无论对端是哪种类型的NAT,只要向这个IP和端口发送数据即可连通

  • 双方是受限锥型NAT或者端口受限型NAT

    双方都向公网服务器发送一个包,确定自己的IP和端口,并通过公网服务器发送给对方,接着双方再向对方地址发送一个包,就可以实现通信

  • 一方是对称型NAT

    1. 当对方是圆锥型NAT:只要让对方先发送请求即可

    2. 当对方是受限锥型NAT:需要在双方交换完地址后,对方先发送一个包,确保指定IP的数据可接收,本机再向对方IP和端口发送数据,完成连接

    3. 当对方是端口受限型NAT:需要在双方交换完地址后,本机先发送一个包,在NAT服务器上打洞。但是此时对端并不知道本机这次打洞的端口,所以需要向各个端口都进行发包探测。此时本机需要不停的向对端发包,直至某一个包被接收。此时双方都确定了对方的IP和端口,完成通信。

    4. 当对方是对称型NAT:没有办法连通,因为其中一个主机在探测时,自身的端口都会变化,这样对方无法确定本机端口。因此只能通过公网服务器进行中转(例如TURN服务器

ICE

Interactive Connectivity Establishment(交互式连接设施),是一个允许你的浏览器和对端浏览器建立连接的协议框架。

在实际的网络中,有很多原因导致简单的从A端到B端的直连不能如愿完成,这需要绕过阻止建立连接的防火墙,给你的设备分配一个唯一可见的地址(通常情况下我们的大部分设备没有一个固定的公网地址),如果路由器不允许主机直连,还得通过一台服务器转发数据,ICE通过使用以下几种技术完成上述工作。

STUN

Session Traversal Utilities for NAT(NAT会话穿透应用程序),是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间创建UDP通信

一旦客户端得知了Internet端的UDP端口,通信就可以开始了。如果NAT是完全圆锥形的,那么双方中的任何一方都可以发起通信;如果NAT是受限圆锥型NAT或端口受限型NAT,双方必须一起开始传输,如果是对称型NAT则不能使用

STUN是一个client-server协议,一个VoIP电话或软件包可能会包括一个STUN客户端,这个客户端会向STUN服务器发送请求,之后服务器会向STUN客户端报告NAT路由器的公网IP地址以及NAT为允许传入流量传回内网而开通的端口

STUN示意图

TURN

Traversal Using Relay NAT(NAT的中继穿透方式),是一种资料传输协议(data-tranfer protocol),允许在TCP或UDP的连接在线跨越NAT或防火墙。

TURN是一个client-server协议。TURN的NAT穿透方法与STUN类似,都是通过获取应用层的公有地址达到NAT穿透,但在实现TURN client的终端必须在通信开始前与TURN server进行交互,并要求TURN server产生relay port,也就是relayed-transport-address。这时TURN server会创建peer,即远程端点(remote endpoints),开始进行中继(relay)的动作,TURN client会利用relay port将资料发送至peer,再由peer转传到另一方的TURN client。很显然这种方式是开销很大的,所以只有在没得选择的情况下采用。

TURN示意图

SDP

Session Description Protocol(会话描述协议),是一个描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等。所以在数据传输时两端都能够理解彼此的数据,本质上,这些描述内容的元数据并不是媒体流本身

从技术上讲,SDP并不是一个真正的协议,而是一种数据格式,用来描述在设备之间共享媒体的连接。

信令与信令服务器

信令

WebRTC是一个完全对等技术,用于实时交换音频、视频和数据。如其他地方所讨论的,必须进行一种发现和媒体格式协商,以使不同网络上的两个设备相互定位,这个过程被称为信令,并涉及两个设备连接到第三方共同商定的服务器,这两台设备可以相互定位,并交换协商消息。

信令服务器

两个设备之间建立WebRTC连接需要一个信令服务器来实现双方通过网络进行连接。信令服务器的作用是作为一个中间人帮助双方在尽可能少的暴露隐私的情况下建立连接。

WebRTC并没有提供信令传递机制,可以使用任何方式比如WebSocket或者XMLHttpRequest等等,来交换彼此的令牌信息。最重要的是信令服务器并不需要理解和解释信令数据内容。

总结

了解清楚各种协议之后,我们得有个大体的概念,就是需要大体的知道webRTC协议各个模块是如何联系在一起的:

以A和B进行视频通话为例,现在决定采用webRTC协议,实现p2p的连接,也就是A和B之间能直接进行媒体流的传输,不需要外加的媒体服务器进行转发。

  1. 在访问外网的时候,需要知道对方的IP和port,我们才能访问到指定的设备。而A和B在他们各自的路由局域网内,是不知道这个IP和port,它们各自的IP和端口是由路由分配的,这个分配IP和port的协议就是NAT(网络地址转换)
  2. A和B之间需要实现p2p连接,就需要知道自己本身的IP和端口,然后告诉对方自己的这些信息,这样才能实现互联,这时STUN(NAT会话穿透应用程序)服务器就派上用场了,A和B分别向stun服务器发送请求,stun服务器会返回他们各自的IP和port,但是NAT有四种类型(圆锥型NAT、受限锥型NAT,端口受限型NAT,对称型NAT),如果是对称型NAT,通过stun服务器是不能获取到IP和端口的,这时A和B之间要进行媒体的交流,就得靠TURN(NAT的中继方式)了,turn服务器是个中转站,A和B之间通信的所有媒体流,都是经过turn服务器进行转发的。
  3. 是采用stun还是turn服务器,这个会交由ICE(交互式连接设施)来帮助我们决策,ICE是一个框架,主要任务就是帮助我们建立双方的连接。
  4. 那么通过stun/turn服务器,A和B都知道自己的IP和port,那这个信息要如何告诉对方呢,这个就需要通过信令服务器了。A和B之间建立媒体连接,还需要知道对方各自处理流媒体的能力,这个信息也是通过信令服务器来转发的。信令服务器并不需要关心发送的内容,只需要负责信息的转发即可。

参考

WebRTC_API

理解NAT穿越

WebRtc学习之旅 —— Android端应用开发