WebRTC中的ICE

2023-10-30

ICE简介

ICE是用于UDP媒体传输的NAT穿透协议(适当扩展也可以支持TCP),它需要利用STUN和TURN协议来完成工作。

STUN协议提供了获取一个内网地址对应的公网地址映射关系(NAT Binding)的机制,并且提供了它们之间的保活机制。

TURN协议是STUN协议的一个扩展,允许一个peer只使用一个转发地址就可以和多个peer实现通信。其本质是一个中继协议。

在WebRTC中,ICE会在SDP中增加传输地址信息,利用这个信息进行NAT穿透及确定媒体流传输地址。

ICE Candidate

WebRTC中的ICE Candidate是用来描述可以连接的远端的基本信息,它至少包括(address,port,protocol)三元组,还有Candidate类型、用户名等。

WebRTC将Candidate分成四种类型,且类型间存在优先级次序,从高到低分别为host、srflx、prflx和relay。

  • host:从本机网卡上获取到的地址,一般来说,一个网卡对应一个地址。
  • srflx(server reflexive):从STUN服务器获取到的地址。
  • relay:从TRUN服务器获取到的地址。
  • prflx(peer reflexive):在联通测试中从对端数据报文中获取到的地址。

其中,srflx和prflx地址可能是一样的,但获取的途径不一样。

ICE的基本流程

ICE的基本流程有三步:收集Candidate,交换Candidate,按优先级尝试连接。

收集Candidate

WebRTC在进行NAT穿透时(也就是俗称的打洞),首先会收集Candidate。客户端会按顺序先获取本地的host地址,然后从STUN服务器获取srflx地址,再从TRUN服务器获取relay地址。

交换Candidate

客户端收集到的这些地址会写到SDP报文中,之后通过信令系统将它们发送给对端。对端收到这些Candidate后,会与本地的Candidate组成CandidatePair。当然,这种组合也是有规则的,比如传输协议相同的Candidate才能组成CandidatePair。

需要说明的是WebRTC中的Candidate交换是使用的trickle方式,也就是边收集边交换。

按优先级尝试连接

WebRTC会将CandidatePair按优先级排序,然后按照这个顺序去进行连通性测试。如果有可以连通的CandidatePair就停止尝试,将它作为数据传输地址。后续开始建立连接,成功后就可以利用这个通道传输音视频数据了。

总结

  • WebRTC的ICE会选择出最好的连接通道来传输音视频数据。
  • WebRTC的连通率几乎是100%,因为即使无法完成P2P的连接,最终也能通过中继(relay)的方式来实现端到端的连接。
  • 那么WebRTC具体是怎样利用ICE协议来实现P2P的NAT穿透的呢?请关注后续文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC中的ICE 的相关文章

  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573
  • coturn STUN 请求在本地工作,但不适用于远程连接

    我已成功向 coturn 服务器发出 TURN 请求 https github com coturn coturn https github com coturn coturn 但在执行 STUN 请求时失败 如果我尝试从运行服务器的同一台
  • 如何使用webrtc录制视频

    我需要在使用 Nodejs 构建的网站上使用笔记本电脑摄像头录制视频 为此 我使用 webRTC 到目前为止 我可以使用笔记本电脑摄像头拍照 但我需要录制视频 有人可以帮忙解释一下代码将如何进行吗 我当前的代码如下
  • Chrome WebRTC DataChannels:即使使用 STUN,ICE-TCP 服务器反射候选也丢失

    我正在建造 又一个 通过 DataChannels 手动发送 WebRTC 聊天信号 http jsfiddle net UYxL3 81 CoffeeScript 对不起 JS 们 它在本地连接中工作正常 但不能在 NAT 后面的互联网上
  • 将 PCM 波形数据转换为 numpy 数组,反之亦然

    情况 我正在使用 WebRTC 中的 VAD 语音活动检测 WebRTC VAD https github com wiseman py webrtcvad Python 适配器 这示例实现 https github com wiseman
  • 通过 websocket 的 SIP 到真正的 SIP

    我正在尝试实现一个 sip 服务器用于从HTMLsip客户端 使用sipml5制作 在我研究这样做的过程中 我遇到了 sip over web sockets 这可能对我有用 但是 我不确定用户代理是否通过 sip over 连接web s
  • 在网络浏览器中实现一个好的 redis 客户端需要什么?

    之前已经有人问过这个问题我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗 https stackoverflow com questions 5759120 can i connect directly to
  • 适用于高带宽应用的 WebRTC 数据通道

    我想通过 WebRTC 数据通道发送单向流数据 并且正在寻找最佳配置选项 高带宽 低延迟 抖动 以及其他人在此类应用程序中的预期比特率的经验 我的测试程序发送 2k 的块 使用 2k 的 bufferedAmountLowThreshold
  • 使用 django 通道将 webRTC 视频流发送到服务器

    我正在尝试创建一个用 django 编写的人脸检测 Web 应用程序 该应用程序是这样工作的 用户导航到该 url 相机在客户端计算机上启动 然后将每一帧发送到服务器进行人脸检测 然后将处理后的帧显示在网页上 我知道我无法使用 opencv
  • 如何在java应用程序中使用webRTC特定模块

    我有一个简单的java应用程序应用程序客户端可以向服务器发送 接收纯音频 UDP 数据包 服务器将音频数据包转发给除发送者之外的所有人 现在我该如何使用webRTC 回声消除我的应用程序端的模块或其他功能模块 我发现可以使用 JNI 和 w
  • 在 Heroku 上部署 PeerJS 服务器

    我的 PeerJS 服务器有问题 我从这里使用了 部署到 Heroku 按钮 https github com peers peerjs server https github com peers peerjs server 我不知道如何连
  • 使用 ASP.NET MVC 处理/接收从 WebRTC 或任何基于浏览器的捕获机制到服务器的实时视频网络摄像头流

    我们需要从 WebRTC 或来自客户端网络摄像头的任何其他捕获机制 即使并非所有浏览器都支持 但作为 PoC 捕获实时视频流 该实时视频需要由服务器组件 ASP Net MVC Web API 处理 我想服务器上的代码将如下所示 HttpP
  • 无法设置远程应答 sdp:无法下推传输描述:无法为通道设置 SSL 角色

    我正在使用 webRTC 构建一个支持音频通话的系统 它的工作原理如下 用户AcreateOffer then setLocalDescription与offer 用户BreceiveOffer then setRemoteDescript
  • 我可以在 DTLS-SRTP 加密中指定自己的加密密钥吗

    在 Chrome 中的 webrtc Web 应用程序中 我曾经通过覆盖 SDP 中的加密信息来指定自己的加密密钥 我现在正在迁移我的 webrtc Web 应用程序以使用 DTLS SRTP 进行加密 启用 DTLS 后 有没有办法告诉
  • 有没有办法使用 getUserMedia 减少延迟?

    在尝试减少视频延迟的同时WebRTC通信时 我测量了视频捕获和视频显示之间的延迟 为了防止测量 WebRTC 涉及的延迟 我只是使用getUserMedia和一个 HTMLvideo显示流 我通过每帧显示时间戳来做到这一点 使用reques
  • 我可以简化同一专用网络上计算机的 WebRTC 信号传输吗?

    WebRTC 信号让我发疯 我的用例非常简单 信息亭和控制室网络应用程序之间的双向音频对讲 两台计算机都在同一网络上 两者都无法访问互联网 所有机器都有已知的静态 IP 我读到的所有内容都希望我使用 STUN TURN ICE 服务器 这个
  • Libsourcey 缺少 -fPIC 编译错误

    我正在尝试运行 LibSourcey 以使用 Webrtc 流服务器 问题是我似乎无法让它发挥作用 我努力在我的 Ubuntu 16 04 上 cmake 该项目 cmake 文件中的正则表达式 但现在它已修复 我实际上遇到的问题是编译时的
  • Websocket 连接失败并显示星号 11

    我正在尝试将 websocket 配置为与 asterisk 11 一起使用 但是存在一些问题 我遵循的步骤是 在 http conf 中启用以下内容 enabled yes bindaddr 0 0 0 0 bindport 8088 我
  • 通过 Websockets 进行 WebRTC 视频聊天

    我正在尝试使用 webRTC 和 WebSockets 进行信号发送来开发视频聊天应用程序 我的问题是 我不知道创建 RTCPeerConnection 并通过 webSocket 连接两个对等点 2 个浏览器 的过程是什么 至少在本地 我
  • webrtc - 获取网络摄像头的宽高比

    我正在尝试学习如何开发 webRTC 应用程序 我想知道是否可以获得相机的宽高比 我不知道它是否有帮助 但我正在使用 webrtc io 但是 if更好 我可以停止使用它 From MDN https developer mozilla o

随机推荐

  • C++之private虚函数

    一般我们说虚函数 它的访问级别都是public的 用类对象可以直接调用 这样就可以实现运行时的类型绑定 那如果我们将虚函数私有化会出现什么情况呢 我们先来看一个非虚函数私有化的例子 class Base private void Print
  • LeetCode——051

    The n queens puzzle is the problem of placing n queens on an n n chessboard such that no two queens attack each other Gi
  • 支持目标打卡,活力三环让运动更有趣

    1 什么是活力三环 熟悉华为运动健康 华为智能穿戴的小伙伴们一定对 健康三环 有所了解 在最新版本的华为运动健康App以及HUAWEI WATCH 4 系列产品中 全新推出了 活力三环 助力用户养成运动习惯 保持活力满满 全新的 活力三环
  • 深入了解AS3 Socket 和TCP

    磨刀不误砍柴工 让我们从概念入手 逐步深入 所谓socket通常也称作 套接字 用于描述IP地址和端口 是一个通信链的句柄 应用程序通常通过 套接字 向网络发出请求或者应答网络请求 Socket 通讯是我们开发多人在线游戏中的常用通讯方式
  • (十一)Springboot+ElasticSearch8整合

    前言 在 Elasticsearch7 15版本之后 Elasticsearch官方将它的高级客户端 RestHighLevelClient标记为弃用状态 推出全新的 Java API客户端 Elasticsearch Java API C
  • HTML+CSS - 导航栏下拉菜单

    div class main div class nav ul li a href 项目一 a ul li a href 分类一 a li li a href 分类二 a li li a href 分类三 a li li a href 分类
  • pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式

    我们经常会看到后缀名为 pt pth pkl的pytorch模型文件 这几种模型文件在格式上有什么区别吗 其实它们并不是在格式上有区别 只是后缀不同而已 仅此而已 在用torch save 函数保存模型文件时 各人有不同的喜好 有些人喜欢用
  • 数据结构——二叉树遍历和常见问题

    树的概念 1 树的概念 要了解二叉树的遍历规则必须先要知道树的结构和概念 树是一种非线性的数据结构 它是由n n gt 0 个有限结点组成一个具有层次关系的集合 把它叫做树是因 为它看起来像一棵倒挂的树 也就是说它是根朝上 而叶朝下的 根结
  • Arduino配置ESP32-PICO-KIT开发环境

    文章结构 1 说明 2 环境搭建 2 1 ESP32 PICO KIT 2 2 配置Arduino IDE 3 连接硬件 4 烧录例程 5 视频 1 说明 作者还拥有个人公众号 会写一些感悟文章 知圈 二维码如下 欢迎扫描关注 关注后有作者
  • 提高信噪比可以减弱其影响的差错是什么

    通信信道的噪声主要分为两种 热噪声和冲击噪声 1 热噪声为信道固有的 引起的差错是随机差错 可以通过提高信噪比来降低它对数据传输的影响 2 冲击噪声为外界电磁干扰引起的 它是引起传输差错的最主要原因 无法通过提高信噪比来避免
  • Feign 和 OpenFeign 两者区别

    Feign 和 OpenFeign 两者区别 Feign是Springcloud组件中的一个轻量级Restful的HTTP服务客户端 Feign内置了Ribbon 用来做客户端负载均衡 去调用服务注册中心的服务 Feign的使用方式是 使用
  • java学习与总结:计算机网络

    文章目录 计算机网络体系结构 osi七层结构 四层结构 五层网络结构以及对应的协议 TCP和UDP协议 tcp三次握手与四次挥手 11个状态 socket的结构 用户态 内核态 http和https的区别 长连接和短连接的区别 http中常
  • java中的mapper是什么_java中entity层、dao层、service层、mapper层、util层、controller层具体含义以及表现...

    entity层 A entity就是属性类 通常定义在model层里面 相当于MVC的M层 属于数据模型层 B 一般得实体类对应一个数据表 其中的属性定义数据表中的字段 实体类的字段数量 gt 数据库表中需要操作的字段数量 dao层 A d
  • 4Sum (C++实现)

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • java包及其使用

    1 包的概念 包 package 是Java提供的一种区别类的名字空间的机制 是类的组织方式 是一组相关类和接口的集合 它提供了访问权限和命名的管理机制 Java中提供的包主要有以下3种用途 1 将功能相近的类放在同一个包中 可以方便查找与
  • iOS高版本备份恢复到低版本系统的方法

    一般来说 在更新iOS系统的时候我们都会建议大家先用iTunes对系统进行完整备份 但时不时都会有人偷懒 或者使用手机OTA升级而没有对系统备份 最终导致不满意新系统了 想降级却无备份可以恢复的尴尬局面 面对这种情况 小编也是百般无奈啊 好
  • Photoshop 2023(版本24.0)新增功能和软件下载

    了解 2022 年 10 月发布的 Photoshop 桌面版 版本 24 0 中的新增功能和增强功能 新增功能 对象选择工具 在检测和建立选区方面得到了改进 如天空 水 自然地面 植物或建筑等元素 只需将鼠标指针悬停在对象上并单击即可建立
  • Ubuntu系统中安装Java环境

    Ubuntu安装Java环境 步骤1 下载jdk 我选择的jdk版本文件 jdk 8u131 linux x64 tar gz 步骤2 创建单独的目录 sudo mkdir usr local java 步骤3 将下载的文件复制到我们创建的
  • 蓝桥杯 大学B组 JAVA软件开发 真题-九进制转十进制

    问题描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 九进制正整数 2022 9 2022 9 转换成十进制等于多少 运行限制 最大运行时间 1s 最大运行内存 512M import java util Sca
  • WebRTC中的ICE

    ICE简介 ICE是用于UDP媒体传输的NAT穿透协议 适当扩展也可以支持TCP 它需要利用STUN和TURN协议来完成工作 STUN协议提供了获取一个内网地址对应的公网地址映射关系 NAT Binding 的机制 并且提供了它们之间的保活