WebRTC是如何建立链接的

作者:神秘网友 发布时间:2021-01-12 20:21:31

WebRTC是如何建立链接的

WebRTC建立链接的基本原则

首先是两个关于WebRTC建立链接的场景:

场景一:双方都在同一个网段内

A和B进行通信,要是双方都在同一个网段内,那么最高效的通信方式就是双方通过内网进行连接,要想让双方进行内网链接,首先需要解决的就是如何让A和B知道对方是在同一个内网中。

场景二:双方处于不同网段

A和B通信,要是双方处于不同网段,那么就必须通过公网进行链接通信,走公网进行通信也有两种方式:

  • 1. 通过P2P的方式进行链接通信;
  • 2. 通过中转服务器,A、B都首先和中转服务器C建立链接,A要想发送消息给B,首先将信息发送给C,C再中转发送给B,同样的B向A发送消息,也需要通过C的转发。

对于上面的两种公网通信的方式,WebRTC中会优先选择方式1,因为方式2会增加A、B之间通信的时长。

WebRTC在建立链接之前,首先会收集所有可能的候选链接方式,并对这些候选链接方式进行优先级排序,然后按照优先级从高到低进行连通性测试,直到找到一个可连通的候选方式,然后通信双方会按照这种连通方式进行链接。

WebRTC众多的链接候选者中,可以分为三类:

  • host:本级候选者
  • srflx:P2P链接候选者
  • relay:中继服务器候选者

三类候选者中,host候选者的优先级是最高的,当host类型的候选者无法建立链接的时候,WebRTC会从srflx候选者中进行连通性测试,也就是尝试通过P2P的方式连接双方,如果失败才会尝试使用relay的方式进行链接。

当WebRTC通信双方需要建立链接的时候,每一段会提供很多候选者,比如一方的主机上有两块网卡,那么两个网卡的不同端口都是一个候选者,WebRTC会按照上面的优先级对每种类型的候选者进行连通性测试,测试成功之后,通信双方就建立了链接。

三种类型候选者的收集:

  • host类型:即本机内网的IP和端口号,这种候选者是最容易收集的;
  • srflx类型:本级通过NAT映射之后的外网IP和端口号;
  • relay类型:中继服务器的IP和端口号;

host类型的候选者直接获取本机的内网IP和端口号就可以了,srflx类型的候选者需要通过STUN服务器获取,relay类型的候选者则需要通过TURN服务器来获得。

1. STUN协议

首先我们的主机要想访问公网资源,必须有自己的公网地址,这样当我们的主机在访问公网中某个主机上的资源的时候,资源主机才能够通过我们主机的公网地址找到我们的主机,并将你想要访问的资源发送给你。

一般情况下,在一个网段内的主机只有内网IP和端口号,那内网的主机是如何访问公网资源的呢?实际上,内网的网关都有NAT的功能,NAT的功能是将内网IP映射转换成公网地址。当我们的内网主机想要访问公网资源的时候,内网网关会将请求的内网地址映射成公网地址,然后将请求发送到要访问的公网服务器上,服务器处理好请求之后,将响应数据传递给请求中携带的公网地址上,该公网接收到响应数据之后,它的网关就会通过之前的地址映射最终中转给内网的主机。通过这种方式实现内网主机访问公网资源的需求。

基于以上的这种方式,我们可以知道内网主机虽然不知道自己在公网的地址,但是内网主机访问的服务器是直到内网主机对应的公网IP的,于是我们在公网中架设一台服务器,通过这台服务器可以询问到自己的公网地址。实际上这一询问流程已经被定义成了一套规范,就是STUN协议。当前比较流行的STUN服务器是CoSTUN,可以直接架设访问。

2. TURN协议

WebRTC通信双方通过P2P的方式无法建立链接的情况下,会使用relay服务进行中转服务。

relay是所有候选者中优先级最低的链接方式,但是relay也是连通率最高的方式。WebRTC通信双方通过向TURN服务器发送Allocation指令获得在relay服务器上的端口,用于中转UDP数据。

总结上面的内容,WebRTC的通信双方在进行链接之前会按照优先级收集链接的候选者,按照优先级的高低,分别是:在本级收集所有的host类型的候选者进行内网链接,通过STUN协议收集srflx候选者进行P2P链接,通过TURN协议收集relay候选者通过中转服务器链接并传输UDP数据。

WebRTC是如何建立链接的 相关文章

  1. 笔记10DVM或ART是如何对JVM进行优化的

    DVM大多数实现和传统的JVM相似,但是为了满足Android在手机端内存的限制,Dalvik对JVM做了一些独有的优化。 Dex文件 传统的class文件是由Java源码文件编译生成的,而Android在编译打包的时候,会将所有的class文件整合优化,最终生成class.dex文件。dex文件

  2. WebRTC NAT穿越原理

    在真实的网路环境中,NAT随处可见,NAT出现的两个目的: 1. 解决IPv4地址不足的问题,在IPv6在短期内无法替代IPv4的情况下,为了解决IPv4不足的问题,引入了NAT解决方案,NAT让多个主机公用一个公网IP地址,内网主机访问公网资源的时候,NAT会对内网主机的地

  3. 但斌:2021年如何穿越周期践行长期投资价值腾讯产业加速器·2021年度思享会

    2020是不平凡的一年,面对未来的不确定性,企业家如何思考破局?放眼全球,展望2021,经济环境还将面临哪些机遇和挑战? 初创企业在历史洪流中,如何穿越周期,赢得未来? 哪些产业和赛道拥有穿透周期、抵抗风险的能力? 1月7日,以“穿越周期,共话未来”为

  4. ggplot2中 ggsave如何用

    问题:我将ggsave应用在pipe %% 符号中,报错! 「报错信息:」 ?Error in UseMethod(grid.draw) : grid.draw没有适用于c(LayerInstance, Layer, ggproto, gg)目标对象的方法? 查阅了资料,ggplot2中调用ggsave有以下三种: 1. 把ggplot2保存为对象,然后调

  5. 理解交互设计如何发现需求寻找创新的机会点

    本文是针对自己最近学习交互设计知识的一个理解与学习笔记,通过阅读《交互设计原理与方法》书籍的学习并结合上一篇文章《理解交互设计从0到1》的总结,进一步学习了解如何进行用户研究,以帮助我们生成和筛选创意,并完成核心功能的归纳。 完成一个产品的早

  6. N2一年多点数据如何计算BLUP值

    一年多点数据如何计算BLUP值 上一节,介绍了什么是BLUP值(N1 | 什么是BLUP值?),鸽了这么多天,今天水一篇。 话说, 「工欲善其事,必先利其器」 ,我搞定了Typora写markdown设置免费图库之后(良心教程 | 如何在Typora中设置免费的图床),这写作体验,

  7. 如何用matlab获取高精度互联网时间日期

    本期作为matlab软件开发系列第二 这里可以明确告诉大家一点,matlab版mathpix公式识别工具到时候不会以源代码而是以exe安装包的方式分享给大家。相应源代码则会上传至 原创代码共享Q群 ,有需要的伙伴可以尽早加入该群,在matlab爱好者公众号中回复“ 原创

  8. 如何使用TCGA数据分析肠道菌群

    我们知道TCGA数据库包括很多患者的二代测序的数据。关于二代测序。之前我们就介绍过,其实二代测序的数据是是一部分所有细胞的核苷酸序列。对于这一部分的序列,只是看我们拿什么背景物种的参考基因组,就可以比对什么就得到什么数据。因此,如果使用微生物

  9. 你是如何保证 Redis 缓存与数据库双写一致性的

    在做系统优化时,想到了将数据进行分级存储的思路。因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息。基本上配置了很久才会变一次。而有一些数据实时性要求非常高,比如订单和流水的数据。所以这里根据数据要求实时性不同将数据分

  10. Node.js中如何创建和提取zip文件方法介绍

    相关推荐:《nodejs 教程》 Zip文件是常用的压缩文件格式。大多数开发人员最终使用tarball而不是zip文件。但在某些情况下,您需要使用zip文件,例如将函数上载到AWS Lambda。在本文中,我将演示如何用 adm-zip npm模块创建和提取zip文件。 创建一个Zip文件

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词