常天宇 彭振
国家无线电监测中心检测中心,中国·北京 100041
WebRTC 是一个跨平台的多媒体框架可以进行音视频处理和实时通讯。通过浏览器进行音视频设备访问管理、音视频采集、数据传输最终搭建实时互动的平台[1]。
信令服务器用来交换每个终端支持的媒体信息(编解码器等)和网络信息(每个终端可能支持的通路);STUN/TURN 服务器用来进行NAT 穿越和提供中继服务;NAT 穿越成功可以建立P2P 通道直连进行媒体数据的传输,否则需要中继节点进行中转[2]。
①下载并安装nodejs、express、serve-index、socket.io模块。
②新建server.js 文件中引入以上模块。
③创建http 和https 服务。
④将socket 服务和web 服务绑定。
⑤服务端侦听底层发送的connection 事件后,继续侦听客户端自定义事件并进行后续的逻辑处理。
⑥打开端口http 服务监听80,https 服务监听443。(web和socket 服务端口复用)
⑦node 运行server.js 文件开启服务。
⑧编写好的客户端html、js、css 文件放在服务端public 路径,利用本地浏览器的v8 引擎进行渲染处理后实现交互。
NAT 功能是给内网地址提供一个公网的映射地址,提高安全性并解决IPV4 地址不足。
有四种类型的NAT,即完全锥型、地址限制性NAT、端口限制性NAT、对称性NAT。安全性依次增加,给NAT穿越打洞带来挑战。对于端口受限锥形与对称性NAT、对称型NAT 与对称性NAT 之间几乎很难打洞成功[3]。虽然可以尝试IP 地址和端口猜测的方式,但对猜测算法要求很高。
如何进行NAT 类型检测有以下步骤:
①服务器2 台,需有2 个IP 地址和端口(#1 服务器双网卡)。
②客户端向服务端发送多个ECHO(UDP 报文)请求,服务端用该IP 地址和端口返回响应。如果一个响应也没有收到,那么说明不支持UDP 形式检测。
③如果客户端收到回复响应,则需要对比返回的ip 地址和发送的IP 地址,如果相同则客户端没有在NAT 之后,否则在NAT 之后。
④客户端再向服务端发送请求,服务端用不同于接收请求的IP 地址和端口进行回复响应,如果客户端收到了响应则说明客户端处于完全开放的公网,否则客户端位于对称性防火墙之后。
⑤如果第三步在NAT 之后重复第四部步骤,客户端收到回复响应,则NAT 类型为完全锥形,否则需要进一步判断。
⑥向第二台服务器重复步骤二操作,得到回复后对比经过NAT 映射后的公网IP 地址和第三步得到的公网IP 是否相同,如果不同则为对称性NAT,如果相同客户端向一台服务器再次发送请求,服务器端用相同的IP 地址但是不同的端口进行回复响应,如果客户端能收到则为IP 限制性NAT,否则为端口限制性NAT。
交换公网IP 地址和端口,便于进行NAT 穿越。是典型的客户端/服务器模式。即客户端发送请求,服务端响应。如果没有STUN 服务,客户端无法知道彼此的IP,即使在公网上的主机也是无法进行通讯的(见图1)。
图1 STUN 服务器工作原理
建立在STUN 协议之上,TURN 客户端发送allocate 请求,服务器分配公网IP 地址和端口提供流媒体数据的中转服务以解决NAT 无法穿越的问题。TURN 服务器对于同一客户端有2 个端口分别提供allocate 请求服务和数据中转服务:TURN 服务器的3478 端口和客户端可以是TCP 或者UDP(NAT 穿越基于TCP 打洞或UDP 打洞,一般来说为了保证请求服务的可靠性都是基于TCP 或者TLS over TCP);50000 端口和客户端是流媒体的UDP 包,UDP 数据的传输方式有send/data 或channel,两者可以共存[4]。
收集每个终端可能的通路(本机地址、反射地址、中继地址)通过信令服务器进行交换然后再进行连通性检测。优先P2P 穿越,不成功选择TURN 中转服务。
STUN/TURN 服务器搭建选型Coturn 并下载安装到服务器,需要配置表1的参数可以提供基本的STUN/TRUN服务。
表1 配置参数
配置好后开启该服务并用Trickle ICE 检查服务运行是否正常。candidate 收集到2 个本机的地址(host 双网卡)、1 个经过NAT 之后的映射公网地址(srflx)以及1 个提供TURN 服务的中继地址(relay)。具体网络可以通过wireshark 或者linux 下的tcpdump 进行抓包分析。
Peer A 和Peer B 进行通讯,先进行媒体协商(即协商共同支持的编解码器等),再进行候选者收集链路优先级排序检查通路,最后进行媒体流的传输。Peer A、Peer B 在建立的通路上进行媒体数据的传输,并将收到的数据添加在本地html页面标签上显示。
信令服务和STUN/TURN 服务可以部署在同一台物理设备上,客户端可以发送本地采集的音视频数据、共享本地桌面、文字聊天和文件传输等实现1V1 实时互动。如果是同一NAT 后的终端通讯,不需要开启STUN/TURN 服务即可建立P2P 直连,如果是不同网络在NAT 穿越失败后需要TURN 服务中转才能进行通讯。
WebRTC 通讯基于服务端(信令服务、STUN/TURN 服务)和客户端的交互,其中信令服务极为重要。随着IPV6的普及,NAT 的功能或被淡化,即可以减少NAT 穿越带来的困难,又能增加网络安全性,为音视频的实时传输提供保障。