《聊聊WebRTC网关服务器》系列文章系由WebRTCon2018中网易云信音视频技术专家的分享内容《从零开始构建音视频网关服务器》整理而成,该系列文章将和大家分享网易NRTC在WebRTC网关项目的自研过程中遇到的一些问题,以及我们最终的解决方法。

《聊聊WebRTC网关服务器》第一篇文章将和大家分享如何选择服务端的端口方案。

标准WebRTC连接建立流程

在讨论如何选择服务器端的端口方案前,我们先来看看标准WebRTC的连接建立流程,这为我们理解这篇文章后续内容提供最基础的知识。

这里描述的是Trickle ICE过程,并且省略了通话发起与接受的信令部分。流程如下:

1) WebRTC A通过SignalServer转发SDP OFFER到WebRTC B。WebRTC B做完本地处理以后,通过 Signal Server转发SDP ANSWER到A。

2)A、B同时向STUN Server发送Binding request请求自身的外网地址,并从STUN Server回包的MAPPED-ADDRESS中得到各自的外网地址;

3)A、B收集完内外网ICE Candidate,并通过Signal Server发送给对方;

4)双方开始做NAT穿越,互相给对方的ICE Candidate发送STUN Binding Request;

5)NAT穿越成功,A、B之间的P2P连接建立,进入媒体互通阶段。在这个过程中,我们看到了有三个核心的部分,SDP协商、ICE Candidate交换、Stun Binding Req/Res的连通性检查。

WebRTC网关连接建立流程

在了解了标准WebRTC的建连流程以后,我们来看看WebRTC客户端如何与网关建连。

首先,我们网关的Media Server拥有公网IP,因此Server就不需要通过Stun Server收集自身的公网IP。WebRTC客户端先与网关SignalServer协商SDP,包括ICE Candidate,Media Server分配IP和端口作为网关的ice candidate发送给客户端。因为网关是公网IP,所以客户端向这个IP发送STUN Binding Request会被服务器收到, 并回复Response。接着客户端与网关媒体服务器进行DTLS握手与秘钥协商,在此基础上进一步进行SRTP的音视频通信。至此,WebRTC客户端与网关服务器建连成功。

好的,现在我们已经具备了探讨服务器端端口选择的基础知识,接下来我们来看看具体有哪些方案。

WebRTC网关服务器媒体架构

最简的服务器端端口方案是我们可以为每个客户端分配一个端口,服务器上使用这个端口区分每个用户,就像图里描述的A、B、C、D四个人在WebRTC网关服务器上分别对应UDP端口10001~1004。这种方案逻辑上很简单,很多开源的服务器都采用这个方案,如janus。另外一个原因是使用了libnice库在服务器上来和客户端做ice建连,类似的做法都是采用多端口的架构。

那么多端口有什么不足呢?

1)很多的网络出口防火墙对能够通过的UDP端口是有限制的;

2)对于服务端来说开辟这么多端口,安全性本身也有一定的问题,特别是网易的运维同学,更是拒绝;

3)开辟这么多的端口在Server端上,端口的开销和性能均有一定的影响。那能否用单端口?使用单端口前,核心要解决的一个问题是:如何区分每一个RTP/RTCP包是属于哪一个WebRTC客户端。

为了解决这个问题,我们需要使用一些小技巧。首先,有几个基础知识点我们先了解一下。如下图:

1)SDP offer和answer里配置的ice-ufrag字段里面内容,原来是用来作为stun数据包的鉴权的,因此STUN Binding Request里面的USERNAME字段就是由上Offer和answer的ice-ufrag内容拼接而成。

2)发送STUN Binding Request的客户端本地udp fd,与ice建连成功后发送媒体数据的udp fd是同一个,也就是说Server上看到的ip port是同一个。

有了上面的背景知识,聪明的你们肯定已经大致有一个方案了。我们来看看实现细节是怎么样的:

1)在服务器给Web端的SDPAnswer中设置 ice-ufrag为roomid/userid,其中RoomID和UserID是通话业务层分配的内容,用于区分每通通话以及参与这。接着做Ice candidate协商,Web端开始做连通性检测,也就是stun binding request里的USERNAME为SDP local和remote的ice-ufrag指定内容。

2)服务器收到stun binding request的客户端ip和端口,并正常回stun binding response。

3)记录客户端地址与用户的信息的映射关系。

4)服务器收到一个rtp/rtcp媒体数据包,通过包的源ip和端口,查询映射表就可以识别这个包属于哪个用户。

在分享完服务端端口选择的方案后,大家都知道WebRTC客户端使用PeerConnection来表示不同的媒体连接,这对于WebRTC来说是基础也是核心,在《聊聊WebRTC网关服务器》第二篇文章将继续为大家介绍如何选择PeerConnection的方案。

——推荐阅读——

Wireshark抓包分析——TCP/IP协议

Wireshark对HTTPS数据的解密

网易云信IM小程序上线?我们是这么做的!>>

全面复盘!深度剖析直播答题产品架构的难点与坑>>

如何快速设计短信验证码>>

如何做好Android 端音视频测试>>

聊聊WebRTC网关服务器1:如何选择服务端端口方案?相关推荐

  1. 聊聊WebRTC网关服务器2:如何选择PeerConnection方案?

    <聊聊WebRTC网关服务器>系列文章系由WebRTCon2018中网易云信音视频技术专家的分享内容<从零开始构建音视频网关服务器>整理而成,该系列文章将和大家分享网易NRTC ...

  2. 即构自研WebRTC网关服务器架构实践

    演讲 / 黄开宁 整理 / 小极狗 作为实时音视频领域最火的开源技术,WebRTC 点对点的架构模式,无法支持大规模并发.如何在架构中引入服务端,一直是开发者关注的热点.5月20日,在WebRTCon ...

  3. 物联网系统上位机源码,含服务器和客户端 物联网服务端程序

    物联网系统上位机源码,含服务器和客户端 物联网服务端程序,可以接受市面上大多数透传数据的DTU登录,以及和DTU双向通讯 程序功能:能分组管理,不同的组别用户只可见自己组别的设备,设备和客户端登录掉线 ...

  4. 在阿里云服务器上搭建 SVN 服务端

    一.SVN 服务端搭建流程 1.安装 svn apt-get install subversion // 方式二:yum install subversion ps:查看版本 svnserve --v ...

  5. gm修改爆率需要重启服务器吗,传奇SF服务端上修改怪物爆率图文教程

    修改怪物爆率基本上是每个版本在改的时候要走的一步,因为每个GM思路不同,想法不同,他给玩家展现出来的版本也不同,就是自己玩单机也要去改,谁不想爆率高点对吧,今天给大家讲解一下通过修改服务端的怪物爆率, ...

  6. 服务器ec系列,Cloud_EC服务端错误码大全

    在服务端开发过程中,会经常返回错误码,如果没有对应的错误码描述,仅仅有一个返回码很 难定位问题,这样进展和效率都会很低下! 这里将常见的错误码与对应的描述总结在这里,后续会一直进行追加与完善,详情如下 ...

  7. 急速rust服务器管理_Rust 与服务端编程的碎碎念

    Rust 是 Mozilla 推出的一门系统编程语言,非常看重内存安全,是一门非常优秀的语言.Mozilla 用它构建了其下一代的浏览器内核 servo,其工程能力毋庸置疑. 那么,Rust在服务端编 ...

  8. 魔兽世界修改服务器配置文件,worldserver.conf 服务端配置文件说明

    worldserver.conf 这个文件是服务端的配置文件,可以在这里做很多个性化修改 注意:修改这个必须重启服务端才能生效 首先这个文件要使用支持 utf-8 格式的文本编辑器,比如 VS cod ...

  9. 网狐获取服务器信息,网狐服务端扩展业务接口手册

    互联网的精神是开放的,是分享的.开放,使它不存在时间和地域的界限,知识的获取在互联网时代变得简单.而分享精神,更是互联网发展的原动力,它让不同的见解得以交流,各式各样的需求得到满足. 网狐科技成立于2 ...

最新文章

  1. python实现均值滤波_python如何实现均值滤波?
  2. ASP程序快速生成Excel文件
  3. Spring(5)——Spring 和数据库编程
  4. 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间
  5. mysql int zerofill_Mysql 中int[M]—zerofill-阿里云开发者社区
  6. NoSQL(2)之 Redis配置与优化
  7. 启动一个Java进程
  8. 关于SQLSERVER的全文目录跟全文索引的区别
  9. 大神把可视化放进数据地图里,原来不敲代码一样能做
  10. 可以获取get post url 传递参数的统一方法
  11. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)...
  12. c#winform窗口页面一打开就加载的方法
  13. 降低成本,提高生产力—8句话讲清RPA的部署 1
  14. RabbitMQ-Java实现Publish/Subscribe订阅模式
  15. 7-4 组从配置-操作
  16. webstorage html5,HTML5-WebStorageAPIs的简述
  17. jvm垃圾回收机制_深入理解 JVM 垃圾回收机制及其实现原理
  18. 入门注解@DependsOn
  19. Linux AHCI驱动分析之块设备层
  20. MacBook外接“键盘鼠标”设置经验

热门文章

  1. angular2.0学习日记1
  2. 字节 字符 utf-8 unicode 以及提交表单验证字符长度 .......
  3. Android开发(七)——判断网络状态
  4. MFC UI按钮多线程
  5. (转)RemoteView 设置控件属性
  6. [翻译]C#数据结构与算法 – 第六章BitArray类
  7. pycharm的中自定义库和关键字_Python“库”在树莓派中的应用解析
  8. unicode 字符集环境下的mfc 读写 ini 配置文件的_WSL:在Windows下优雅地玩Linux
  9. 2021年热门临床研究盘点
  10. 医学论文摘要撰写的四要素以及注意事项