什么是webRTC
webRTC(web Real Time Communations)是一个开源的,提供各种终端(比如PC浏览器,android/ios客户端)实时通信(特别是音视频)的协议!
对上层来说,就是一些接口调用。如果是浏览器,那就是java script API,如果是客户端,也有相应的库支持。
webRTC的应用场景:
- 音视频通话/多人会议
- 桌面共享/协助
- 云游戏
- 直播/在线教育
那么,两个webRTC应用终端之间,如何通信?这需要中间商(放心,不赚差价^^)。
中间商就包括,信令服务器+STUN/TURN服务器。
什么是信令服务器
信令服务器是用户终端之间交换信息的服务器,起到中介的作用。传递的信息,包括业务信息,媒体信息,网络信息!
业务信息指的是,终端A & B加入视频聊天,退出视频聊天,禁言等。
媒体信息指的是,终端A & B互相要知道,对方用什么编解码器,音视频是否支持等。比如B总要知道A是用什么编码的,自己又能支持什么编码格式的流,互相沟通好了,才能定下最后A & B实际用什么编解码器。
在WebRTC中用来描述 网络信息的术语叫SDP(Session Description Protocol)。终端之间互相沟通媒体信息,称为媒体协商。
网络信息指的是,终端A & B把自己的网络信息(特别是外网IP&端口)告知信令服务器,服务器帮通知到对端,如果是同一个局域网,直接通过P2P传输,如果不是,则尝试NAT穿越,再不行,就中转。外网IP端口如何获取?通过向另一个服务器获取。该服务器基于STUN协议(Session Traversal Utilities for NAT),返回给终端一个外网IP&端口。具体下面将介绍。
在WebRTC中用来描述 网络信息的术语叫candidate。
信令服务器,可以自己基于socket.io开发,也可以基于开源的项目做二次开发,如Janus。
什么是STUN/TURN服务器?
STUN和TURN都是网络协议。基于这个协议搭建的服务器,就简单称STUN/TURN服务器。
STUN(Session Traversal Utilities for NAT)用于得到终端的外网IP&端口!让终端之间,尝试能否根据外网IP&端口直接通信。当然了,STUN并不是每次都能成功的为需要NAT的通话设备分配IP地址,如果失败了,则需要下面的TURN做辅助。
TURN(Traversal Using Relays around NAT)用于终端之间,无法直接P2P通信的时候,做一个中继服务!简单的说,终端A把音视频传递给TURN服务器,终端B从TURN服务器读取A的音视频数据。
实现了两个协议,并整合到一起的,是一个ICE框架(Interactive Connectivity Establishment:交互式连通建立方式)。在linux下,就是一个库。github源码:https://github.com/libnice/libnice
所以,这个服务器,也可以叫做,ICE服务器。
基于库实现的一个linux服务程序,也有开源的,叫做coturn。github源码:https://github.com/coturn/coturn
我们可以直接把coturn安装在服务器上,直接就能用!
参考
https://medium.com/av-transcode/what-is-webrtc-and-how-to-setup-stun-turn-server-for-webrtc-communication-63314728b9d0
https://zhuanlan.zhihu.com/p/79489847
https://www.jianshu.com/p/37007fe05215
https://webrtc.org/
https://www.jianshu.com/p/1257cc7d6eed