WebRTC | ICE详解

目录

一、Candidate种类与优先级

二、ICE策略

 1. iceServers 

2. iceTransportPolicy

三、P2P连接

1.Nat类型

(1)完全锥型NAT

(2)IP限制锥型NAT

(3)端口限制锥型NAT

(4)对称型NAT

四、网络中继

1. TURN协议中转数据

 (1)发送指令Send indication

(2)端对端传输数据


一、Candidate种类与优先级

        ICE中使用的Candidate具有优先级次序,由高到低分别为host、srflx、prflx、relay。WebRTC进行一对一音视频通信时,就是按照这个次序尝试建立连接的。

        不在同一局域网内,双方尝试host型Candidate连接时会失败。不过,在双方尝试连接时,双方Candidate的收集工作并未停止。Candidate收集线程还在收集其他类型的Candidate,如从STUN/TURN服务器收集srflx和relay类型的Candidate;当收集到srflx类型的Candidate时,ICE会尝试NAT打洞,如果打洞成功,则双方会通过P2P的方式传输数据;如果打洞失败,则会通过TURN服务器中转数据。

WebRTC通信时会按照内网、P2P、relay这样的次序尝试连接:

1. 内网连接对应host连接策略。host连接表示直接在本地设备上建立的连接,也就是在同一局域网内的设备之间的直接连接。
2. P2P连接对应srflx和prflx连接策略。srflx(server reflexive)和prflx(peer reflexive)连接都是通过STUN服务器获取的公共IP地址,用于建立点对点连接。srflx连接是通过NAT后的公共IP地址建立的连接,而prflx连接是对等方自己的NAT映射地址。
3. 中继连接对应relay连接策略。当无法建立直接的P2P连接时,WebRTC会使用TURN服务器作为中继,建立relay连接。relay连接通过中继服务器传递数据,确保数据的可靠传输。

        WebRTC中的ICE既考虑了数据传输的效率,又考虑了网络的连通率:

  • WebRTC的ICE机制会选择最好的链路传输音视频数据,即如果通信的双方在同一网段内,则优先使用内网链路;如果通信的双方不在同一网段,则优先使用P2P;当以上方式都无法连通时,则使用relay服务进行中转。
  • ICE的连通率几乎可以达到100%。在内网和P2P无法连通的情况下,它还可以通用中继的方式让彼此连通,从而大大提高了WebRTC的连通率。

二、ICE策略

        RTCPeerConnection提供了一种在浏览器之间建立点对点连接的方式,而无需通过服务器进行中转。它使用了ICE(Interactive Connectivity Establishment)协议来处理网络地址和端口的自动配置,以确保连接的稳定性和可靠性。

        构造RTCPeerConnection对象时,其输入参数的类型为RTCConfiguration。

RTCConfiguration pcConfig = {'iceServers': [{'urls': 'turn:stun.learningrtc.cn:3478','username': "username1",'credential': "password1",},{'urls': 'turn:stun.avdancedu.com:3478','username': "username2",'credential': "password2",}],'iceTransportPolicy': "all",'bundlePolicy': "max-bundle",'rtcpMuxPolicy': "require"
};
RTCPeerConnection pc = new RTCPeerConnection(pcConfig);
…
RTCConfiguration各字段含义

 1. iceServers 

        iceServers是RTCIceServer类型的数组,可以包含一个或多个STUN和/或TURN服务器。

2. iceTransportPolicy

        在ICE中,有两种常见的网络连接策略:

  • all:默认策略,浏览器将尝试使用所有可用的网络接口(如本地IP地址、VPN、Wi-Fi等)来建立连接。这种策略适用于多种网络环境,但可能会增加连接建立的时间和网络带宽的消耗。
  • relay:这种策略仅使用中继服务器(如TURN服务器)来建立连接。中继服务器充当中间人,帮助两个浏览器在防火墙或NAT后面建立连接。这种策略适用于网络环境受限的情况,但可能会增加延迟和中继服务器的负载。

三、P2P连接

1.Nat类型

        P2P指的就是如何进行NAT穿越。NAT在真实的网络环境中随处可见,它的出现主要出于两个目的。一是为了解决IPv4地址不够用的问题。当时IPv6短期内还无法替换IPv4,而IPv4的地址又特别紧缺,所以人们想到让多台主机共用一个公网IP地址,大大减缓了IPv4地址不够用的问题。二是为了解决安全问题。使用NAT后,主机隐藏在内网,这样黑客就很难访问到内网主机,从而达到保护内网主机的目的。

        NAT就是一种地址映射技术,它在内网地址与外网地址之间建立了映射关系。当内网主机向外网主机发送信息时,数据在经过NAT层时,NAT会将数据包头中的源IP地址和源端口号替换为映射后的外网IP地址和外网端口。相反,当接收数据时,NAT收到数据后会将目标地址映射为内网的IP地址和端口再转给内网主机。

        RFC3489和RFC5389是最重要的两份NAT穿越的协议文档。在RFC3489协议中,将NAT分成4种类型,即完全锥型、IP限制锥型、端口限制锥型以及对称型。在这4种类型中,越往后的NAT类型穿越难度越大。

        大多数情况下NAT穿越使用的是UDP,这是因为UDP是无连接协议的,打洞会更加方便。当然,也可以使用TCP打洞。

(1)完全锥型NAT

        完全锥型NAT的特点:一旦打洞成功,所有知道该洞的主机都可以通过它与内网主机进行通信。

(2)IP限制锥型NAT

        IP限制锥型NAT要比完全锥型NAT严格得多。IP限制锥型NAT的主要特点:NAT打洞成功后,只有与之打洞成功的外网主机才能通过该洞与内网主机通信,而其他外网主机即使知道洞口也不能与之通信。

(3)端口限制锥型NAT

        端口限制锥型NAT的主要特点:除了像IP限制锥型NAT一样需要对IP地址进行检测外,还需要对端口进行检测。

(4)对称型NAT

        对称型NAT是4种NAT类型中对数据包检测最严格的。对称型NAT的特点:内网主机每次访问不同的外网主机时,都会生成一个新洞,而不像前面3种NAT类型使用的是同一个洞。

        对称型NAT每次访问不同外网主机都生成新洞的这种特性,导致对称型NAT碰到对称型NAT或者对称型NAT遇到端口限制型NAT时,双方打洞的成功率非常低,即使可以互通,成本也非常高。WebRTC遇到上面这两种情况时,直接放弃打洞的尝试。

四、网络中继

        当遇到NAT之间无法打通的情况时,WebRTC会使用TURN协议通过中转的方式实现端与端之间的通信。

1. TURN协议中转数据

        TURN协议采用了典型的客户端/服务器模式,其服务器端称为TurnServer,客户端称为TurnClient。TurnClient与TurnServer之间通过信令控制数据流的发送。

        TurnClient与TurnServer之间的传输协议既可以是UDP,也可以是TCP,而在TurnServer上分配的relay地址使用的都是UDP。

 (1)发送指令Send indication

        该指令包括两个属性:XOR-PEER-ADDRESS和DATA。其中XOR-PEER-ADDRESS属性用于指定向哪个主机转发数据,DATA属性指明数据的具体内容。

(2)端对端传输数据

        一种方法就是上面说的Send indication指令,当TurnClient向某个Peer发数据时就要使用它。相反,当Peer通过TurnServer向TurnClient转发数据时,使用Data indication指令,指明向哪个TurnClient转发数据。

        另一种方法是使用tunnel机制。使用tunnel机制的好处是不用再像使用Send/Data indication指令一样,每次都要指定数据发往的地址,只需要在开始发送数据之前,发送ChannelBind指令将channel number与目标地址绑定一次即可,后面统一使用channel number就可以找到发往的目的地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/95357.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot、java实现调用企业微信接口向指定用户发送消息

因为项目的业务逻辑需要向指定用户发送企业微信消息&#xff0c;所以在这里记录一下 目录 引入相关依赖创建配置工具类创建发送消息类测试类最终效果 引入相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

在Centos环境中搭建Nginx环境

一、Nginx概念简介 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 Nginx与redis相同&#xff0c;都是基于多路复用模型构建出的产物&#xff0c;因此它与R…

利用Opencv实现人像迁移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用Opencv实现人像迁移&#xff0c;欢迎大家一起参与探讨交流~ 本文目录&#xff1a; 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…

20W IP网络吸顶喇叭 POE供电吸顶喇叭

SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途&#xff1a; ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器&#xff0c;用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等&#xff1b;室内使用效果均佳。 产品特点&#xff…

BC136 KiKi去重整数并排序

给定一个整数序列&#xff0c;KiKi想把其中的重复的整数去掉&#xff0c;并将去重后的序列从小到大排序输出。 输入描述 第一行&#xff0c;输入一个整数n&#xff0c;表示序列有n个整数。 第二行输入n个整数&#xff08;每个整数大于等于1&#xff0c;小于等于1000&#xf…

学校信息管理系统说明文档

目录 0学生信息管理系统体验教程. 4 0.0Student management异地打开方法&#xff1a;. 4 1. 管理系统设计需求分析. 6 1.1 需求介绍. 6 1.2功能需求. 6 1.2.1 学生信息录入. 6 1.2.2 学生信息查询. 6 1.2.3 权限管理. 6 1.2.4 添加学生信息验证. 6 2.功能介绍. 7 2.1…

C++中String的语法及常用接口用法

在C语言中&#xff0c;string是一个标准库类&#xff08;class&#xff09;&#xff0c;用于处理字符串&#xff0c;它提供了一种更高级、更便捷的字符串操作方式&#xff0c;string 类提供了一系列成员函数和重载运算符&#xff0c;以便于对字符串进行操作和处理。 一、string…

步步为赢:打造一个酷炫而吸引人的Hadoop HDFS分布式文件系统集群部署方案

文章目录 版权声明一 分布式存储缘起二 分布式的基础架构2.1 大数据架构模式2.2 主从模式 三 HDFS的基础架构HDFS的角色组成 四 HDFS集群环境部署4.1 安装包下载4.2 Hadoop安装包目录结构4.3 修改配置文件&#xff0c;应用自定义设置4.4 分发Hadoop文件夹4.5 配置环境变量4.6 授…

Ubuntu安装最新版neovim

Ubuntu安装最新版neovim 一、前言 对于neovim版本很重要&#xff0c;有很多插件几乎都要要求neovim版本在0.8或者0.9。但是有一个很严重的问题就是&#xff0c;Ubuntu使用sudo apt install neovim的版本很低达不到要求&#xff08;写文章时是0.7&#xff09; 二、解决方法 …

罗勇军 →《算法竞赛·快冲300题》每日一题:“质因子数量” ← 快速幂、素数筛

【题目来源】http://oj.ecustacm.cn/problem.php?id1780http://oj.ecustacm.cn/viewnews.php?id1023【题目描述】 给出n个数字&#xff0c;你可以任意选择一些数字相乘&#xff0c;相乘之后得到新数字x。 其中&#xff0c;x的分数等于x不同质因子的数量。 请你计算所有选择数…

企望制造ERP系统 RCE漏洞[2023-HW]

企望制造ERP系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;…

JDBC封装与设计模式

什么是 DAO &#xff1f; Data Access Object(数据存取对象) 位于业务逻辑和持久化数据之间实现对持久化数据的访问 DAO起着转换器的作用&#xff0c;将数据在实体类和数据库记录之间进行转换。 ----------------------------------------------------- DAO模式的组成部分 …

考研算法第46天: 字符串转换整数 【字符串,模拟】

题目前置知识 c中的string判空 string Count; Count.empty(); //正确 Count ! null; //错误c中最大最小宏 #include <limits.h>INT_MAX INT_MIN 字符串使用发运算将字符加到字符串末尾 string Count; string str "liuda"; Count str[i]; 题目概况 AC代码…

【自用】云服务器 docker 环境下 HomeAssistant 安装 HACS 教程

一、进入 docker 中的 HomeAssistant 1.查找 HomeAssistant 的 CONTAINER ID 连接上云服务器&#xff08;宿主机&#xff09;后&#xff0c;终端内进入 root &#xff0c;输入&#xff1a; docker ps找到了 docker 的 container ID 2.config HomeAssistant 输入下面的命令&…

音视频FAQ(一):视频直播卡顿

一、摘要 本文介绍了视频直播卡顿的四个主要原因&#xff0c;用户网络问题、用户设备性能问题、技术路线的选择和实现问题。因本文主要阐述视频直播的卡顿&#xff0c;故技术路线的实现指的是&#xff1a;CDN供应商的实现问题&#xff0c;包含CDN性能不足、CDN地区覆盖不足。对…

【JAVA】我们该如何规避代码中可能出现的错误?(一)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言三种类型的异常异常处理JAVA内置异常类Exception 类的层次 前言 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的&…

Spring Cloud面试突击班1

Spring Cloud面试突击班1 1.Spring Cloud 中有哪些组件&#xff0c;整个项目架构中我们的重点又有哪些&#xff1f; Spring Cloud 是一套基于Spring Boot的微服务解决方案。 Spring Cloud生态在国内主流的分为两套&#xff0c;一套是以奈飞开源的Spring Cloud Netfilx 20%&a…

Redis持久化:RDB和AOF机制详解

目录 1.Redis持久化简介 2.RDB持久化 2.1 什么是 RDB 持久化&#xff1f; 2.2 触发方式 2.3 Redis.conf中配置RDB 2.4 RDB 更深入理解 2.5 RDB优缺点 3.AOF持久化 3.1 什么是 AOF 持久化&#xff1f; 3.2 如何实现AOF 3.3 Redis.conf中配置AOF 3.4 深入理解AOF重写 4.RDB和…

【LeetCode75】第三十一题 反转链表

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 最经典的链表题&#xff0c;没有之一&#xff01;&#xff01;&#xff01; 强烈建议直接把模板记住&#xff01;&#xff01;&#xf…

4.物联网LWIP之C/S编程

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…