作者: 亢少军

彼此要了解对方的网络情况,这样才有可能找到一条相互通讯的链路。需要做以下两个处理。

  1. 获取外网IP地址映射。
  2. 通过信令服务器(signal server)交换“网络信息”。

理想的网络情况是每个浏览器的电脑都是公网IP,可以直接进行点对点连接。如图所示。

实际情况是我们的电脑和电脑之间都是在某个局域网中并且有防火墙,需要NAT(Network Address Translation,网络地址转换),如图所示。

在解决WebRTC使用过程中的上述问题的时候,我们需要用到STUN和TURN。

NAT

NAT(Network Address Translation,网络地址转换)简单来说就是为了解决IPV4下的IP地址匮乏而出现的一种技术。
举例就是通常我们处在一个路由器之下,而路由器分配给我们的地址通常为192.168.1.1 、192.168.1.2如果有n个设备,可能分配到192.168.1.n,而这个IP地址显然只是一个内网的IP地址,这样一个路由器的公网地址对应了n个内网的地址,通过这种使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。如图所示。

NAT技术会保护内网地址的安全性,所以这就会引发个问题,就是当我采用P2P之中连接方式的时候,NAT会阻止外网地址的访问,这时我们就得采用NAT穿透了。
于是我们就有了如下的思路:我们借助一个公网IP服务器,Peer-A与Peer-B都往公网IP/PORT发包,公网服务器就可以获知Peer-A与Peer-B的IP/PORT,又由于Peer-A与Peer-B主动给公网IP服务器发包,所以公网服务器可以穿透NAT-A与NAT-B并发送包给Peer-A与Peer-B。
所以只要公网IP将Peer-B的IP/PORT发给Peer-A,Peer-A的IP/PORT发给Peer-B。这样下次Peer-A与Peer-B互相消息,就不会被NAT阻拦了。
WebRTC的NAT/防火墙穿越技术,就是基于上述的一个思路来实现的。在WebRTC中采用ICE框架来保证RTCPeerConnection能实现NAT穿越。

ICE

ICE(Interactive Connectivity Establishment,互动式连接建立)是一种框架,使各种NAT穿透技术(STUN,TURN…)可以实现统一。该技术可以让客户端成功地穿透远程用户与网络之间可能存在的各类防火墙。

STUN

NAT 的UDP简单穿越(Session Traversal Utilities for NAT)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间建立UDP通信。如图2-7所示,STUN服务器能够知道Peer-A以及Peer-B的公网IP及端口。

即使透过 STUN 服务器取得了公用 IP 位址,也不一定能建立连线。因为不同的NAT类型处理传入的UDP分组的方式是不同的。四种主要类型中有三种是可以使用STUN穿透:完全圆锥型NAT、受限圆锥型NAT和端口受限圆锥型NAT。但大型公司网络中经常采用的对称型 NAT(又称为双向NAT)则不能使用,这类路由器会透过NAT布署所谓的“Symmetric NAT限制”。也就是说,路由器只会接受你之前连线过的节点所建立的连线。这类网络就需要TURN技术。

TURN

TURN(Traversal Using Relays around NAT)是STUN/RFC5389的一个拓展,主要添加了Relay功能。如果终端在NAT之后, 那么在特定的情景下,有可能使得终端无法和其对等端(peer)进行直接的通信,这时就需要公网的服务器作为一个中继,对来往的数据进行转发。这个转发的协议就被定义为TURN。
在STURN服务器的基础上,再架设几台TURN服务器。在STUN分配公网IP失败后,可以通过TURN服务器请求公网IP地址作为中继地址。媒体数据由TURN服务器中转。如图所示。

当媒体数据走TURN中转,这种方式的带宽由服务器端承担。所以在架设中转服务时要考虑硬件及带宽。
提示:ICE跟STUN、TURN不一样,ICE不是一种协议,而是一个框架,它整合了STUN和TURN。

以上是WebRTC中经常用到的协议,STUN和TURN服务器我们使用coturn开源项目来搭建,地址为:https://github.com/coturn/coturn。也可以使用Golang技术开发的服务器来搭建,地址为:https://github.com/pion/turn。

WebRTC交流群: 425778886
开源地址: https://github.com/kangshaojun
学习地址:https://ke.qq.com/course/package/32134

WebRTC通话原理-网络协商-NAT-ICE-STUN-TURN相关推荐

  1. WebRTC通话原理

    WebRTC通话原理 目录 媒体协商-音视频编解码 网络协商 STUN TURN 媒体协商+网络协商 数据的交换通道 WebRTC API 一对一通话 1. 媒体协商-音视频编解码 比如: Peer- ...

  2. WebRTC通话原理(六)

    WebRTC通话原理-基本流程 基本流程 WebRTC通话最典型的应用场景就是一对一音视频通话,如微信或QQ音视频聊天.通话的过程是比较复杂的,这里我们简化这个流程,把最主要的步骤提取出来,如图所示. ...

  3. 构建 WebRTC 应用所需的后端服务 STUN, TURN

    Build the backend services needed for a WebRTC app STUN, TURN, and signaling 机翻 原文:Build the backend ...

  4. webrtc笔记(1): 基于coturn项目的stun/turn服务器搭建

    webrtc是google推出的基于浏览器的实时语音-视频通讯架构.其典型的应用场景为:浏览器之间端到端(p2p)实时视频对话,但由于网络环境的复杂性(比如:路由器/交换机/防火墙等),浏览器与浏览器 ...

  5. 【WebRTC---入门篇】(九)WebRTC网络基础:P2P/STUN/TURN/ICE

    NAT 作用:内网地址转公网地址 STUN 作用:中介将公网信息彼此交换 TURN 作用:P2P不成功的话在云端架设服务器,双方进入同一房间.可以在一起进行数据交互 ICE 作用:打包以上取最优,先尝 ...

  6. WebRTC通话原理-SDP协议

    作者: 亢少军 会话描述协议Session Description Protocol (SDP) 是一个描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等.所以在数据传输时两端都能够理解彼此 ...

  7. webrtc(2):Centos6 安装 stun/turn服务

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/47109183 未经博主允许不得转载. 1,关于stun和turn STUN(Si ...

  8. WebRTC in the real world: STUN, TURN and signaling

    http://www.cnblogs.com/bktmkd/p/5100082.html 翻译☞http://www.html5rocks.com/en/tutorials/webrtc/infras ...

  9. 详解 WebRTC 协议原理与框架、WebRTC编程问题迎刃而解

    转载注:本文转载csdn的<极客雨露>博客文章,转载者根据个人理解对此两篇文章内容.进行整编并添加文档标题和编号,增加转载标注内容. 一.WebRTC 是什么 WebRTC,名称源自网页即 ...

最新文章

  1. golang sdk后端怎么用_Golang资深后端工程师需要了解的知识点
  2. php 表单提交2次,微信开发之php表单微信中自动提交两次问题解决办法
  3. Swift使用iconfont图标
  4. B2C Opinions
  5. ORACLE删除表分区和数据
  6. wordpress主页php,wordpress主页在哪里设置
  7. php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决
  8. 一文了解机器学习以及其相关领域(上)
  9. Php真太阳时计算公式,第七章:如何计算真太阳时?
  10. 欧拉-拉格朗日方程(Euler -Lagrange equation)
  11. vgc机器人编程1到13题_工业机器人编程与实操 期末试题
  12. 对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法
  13. java 提交mac地址栏_Mac系统快捷键大全 - 米扑博客
  14. 初级调色转档CameraRaw
  15. 关于_CameraDepthTexture的疑惑
  16. <img>标签中alt属性和title属性的区别
  17. 模拟烟雾传感器 (MQ2)
  18. [转]SAP R/3开发类及表/结构资料
  19. Android 8.0系统源码分析--Camera processCaptureResult结果回传源码分析
  20. 内部碎片和外部碎片的区别

热门文章

  1. 使用 Eslint + husky + lint-staged + Prettier 提高前端项目质量、统一项目代码风格
  2. ALC、AGC、DRC、EQ对比
  3. MMS - 什么是MMS?
  4. 为什么要使用高彩模式
  5. 用python爬取豆瓣影评及影片信息(评论时间、用户ID、评论内容)
  6. 从985非科班到网易伏羲CV算法岗
  7. 数美科技风控前沿| AIGC需要什么内容风控基建?ChatGPT本“人”有话要说
  8. java person类_定义一个Person类,含姓名、性别、年龄等字段;继承Person类设计
  9. Fiddler抓包,并修改请求数据
  10. 湖南无线数字电服务器,戴尔服务器搭建湖南省高校数字化图书馆