webrtc获取IceCandidate流程

在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释:

一、ICECandidate的定义

ICECandidate对象通常包含以下关键属性:

  • foundation:用于唯一标识候选者的基础信息,通常是基于候选者的类型、IP地址、协议和replay协议计算出的字符串。

  • component:标识候选者所属的传输组件。对于RTP流,通常使用1;对于RTCP流,通常使用2。

  • protocol:候选者使用的传输协议,通常是UDP,但也可以是TCP(尽管在WebRTC中UDP更为常见)。

  • priority:候选者的优先级,用于在选择最佳候选对时进行比较。优先级的计算公式考虑了候选类型优先级、本地优先级和组件ID。

  • address:候选者的IP地址。

  • port:候选者使用的端口号。

  • type:候选者的类型,包括host、srflx、prflx和relay四种,优先级依次由高到低。

    • host:直接连接到本地网络接口的地址,未经过NAT(Network Address Translation,网络地址转换)转换。
    • srflx(Server Reflexive):通过STUN(Session Traversal Utilities for NAT)服务器获得的NAT映射地址。
    • prflx(Peer Reflexive):在尝试与对等体建立连接时通过STUN响应动态发现的地址。
    • relay:通过TURN(Traversal Using Relays around NAT)服务器中继的地址,用于在对等体之间转发数据。
  • relatedAddress(可选):对于反射(srflx)和对等体反射(prflx)候选者,这是映射到候选者地址的内部IP地址和端口。

  • tcpType(可选):如果候选者使用TCP协议,则指定TCP类型(例如,active、passive、so)。

二、ICECandidate的作用

ICECandidate在WebRTC中主要用于收集、交换和测试潜在的通信端点,以便在复杂的网络环境中(如存在NAT或防火墙时)建立和优化点对点连接。

  • 收集候选者:WebRTC客户端会收集本地网络接口的地址(host候选者)、通过STUN服务器获得的NAT映射地址(srflx候选者)、以及通过TURN服务器获得的中继地址(relay候选者)。
  • 交换候选者:通过信令系统(如WebSocket、SIP等),WebRTC客户端会交换彼此收集到的候选者信息。
  • 测试候选对:WebRTC会使用STUN协议发送Binding请求来测试候选对之间的连通性。成功建立连接的候选对将被优先考虑用于传输媒体数据。

三、ICECandidate的优先级和选择

WebRTC在选择最佳路径来传输媒体数据时,会基于候选对的优先级和连通性测试结果进行决策。如果直接P2P连接无法建立,则可能会回退到使用TURN服务器进行中继。候选者的优先级计算公式考虑了多种因素,以确保在选择最佳路径时能够综合考虑各种条件。

整个流程如下:

 IceCandidate的生成发生在offer生成后,重点在:

void P2PTransportChannel::MaybeStartGathering() {RTC_DCHECK_RUN_ON(network_thread_);// TODO(bugs.webrtc.org/14605): ensure tie_breaker_ is set.if (ice_parameters_.ufrag.empty() || ice_parameters_.pwd.empty()) {RTC_LOG(LS_ERROR)<< "Cannot gather candidates because ICE parameters are empty"" ufrag: "<< ice_parameters_.ufrag << " pwd: " << ice_parameters_.pwd;return;}// Start gathering if we never started before, or if an ICE restart occurred.if (allocator_sessions_.empty() ||IceCredentialsChanged(allocator_sessions_.back()->ice_ufrag(),allocator_sessions_.back()->ice_pwd(),ice_parameters_.ufrag, ice_parameters_.pwd)) {if (gathering_state_ != kIceGatheringGathering) {gathering_state_ = kIceGatheringGathering;SignalGatheringState(this);}if (!allocator_sessions_.empty()) {IceRestartState state;if (writable()) {state = IceRestartState::CONNECTED;} else if (IsGettingPorts()) {state = IceRestartState::CONNECTING;} else {state = IceRestartState::DISCONNECTED;}RTC_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.IceRestartState",static_cast<int>(state),static_cast<int>(IceRestartState::MAX_VALUE));}for (const auto& session : allocator_sessions_) {if (session->IsStopped()) {continue;}session->StopGettingPorts();}// Time for a new allocator.std::unique_ptr<PortAllocatorSession> pooled_session =allocator_->TakePooledSession(transport_name(), component(),ice_parameters_.ufrag,ice_parameters_.pwd);if (pooled_session) {pooled_session->set_ice_tiebreaker(tiebreaker_);AddAllocatorSession(std::move(pooled_session));PortAllocatorSession* raw_pooled_session =allocator_sessions_.back().get(

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

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

相关文章

注意力机制详解

一、引言 注意力机制&#xff08;Attention Mechanism&#xff09;源于对人类视觉的研究&#xff0c;是一种在深度学习模型中模拟人类注意力的机制。它允许模型在处理信息时能够聚焦于当前任务最相关的部分&#xff0c;从而提高模型的性能和泛化能力。本文将从注意力机制的起源…

重温设计模式--单例模式

文章目录 单例模式&#xff08;Singleton Pattern&#xff09;概述单例模式的实现方式及代码示例1. 饿汉式单例&#xff08;在程序启动时就创建实例&#xff09;2. 懒汉式单例&#xff08;在第一次使用时才创建实例&#xff09; 单例模式的注意事项应用场景 C代码懒汉模式-经典…

金仓数据库安装-Kingbase v9-centos

在很多年前有个项目用的金仓数据库&#xff0c;上线稳定后就没在这个项目了&#xff0c;只有公司的开发环境还在维护&#xff0c;已经好多年没有安装过了&#xff0c;重温一下金仓数据库安装&#xff0c;体验一下最新版本&#xff0c;也做一个新版本的试验环境&#xff1b; 一、…

LabVIEW中什么和C 语言指针类似?

在LabVIEW中&#xff0c;与C语言指针类似的概念是 引用 (Reference)。 引用在LabVIEW中主要用于以下几个方面&#xff1a; 数据引用&#xff1a;LabVIEW通过引用传递数据&#xff0c;而不是复制数据。通过引用&#xff0c;多个VIs可以共享数据而不需要复制整个数据结构&#xf…

医疗大模型威胁攻击下的医院AI安全:挑战与应对策略

一、引言 1.1 研究背景与意义 随着人工智能技术的迅猛发展,医疗大模型作为一种新兴的技术手段,正逐渐渗透到医疗领域的各个环节,为医疗服务的数字化转型带来了前所未有的机遇。从辅助诊断到疾病预测,从个性化治疗方案的制定到医疗资源的优化配置,医疗大模型展现出了巨大…

在 Vue3 项目中安装和配置 Three.js

简介 Three.js 是一个轻量级的 WebGL 封装库&#xff0c;用于在浏览器中渲染复杂的 3D 图形。它提供了便捷的 API&#xff0c;可以快速构建 3D 场景、对象和动画。 Vue.js 是一个渐进式 JavaScript 框架&#xff0c;擅长构建用户界面。其响应式数据绑定和组件系统使得复杂的交…

编译原理复习---正则表达式+有穷自动机

适用于电子科技大学编译原理期末考试复习。 1. 正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称regex或regexp&#xff09;是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成&#xff0c;这些字符和符号定义了一种搜索模式…

漏洞检测工具:HOST头部攻击

HOST头部攻击 漏洞定义 Host头部字段在HTTP协议中用于指定请求所针对的域名&#xff0c;以便服务器能够正确地将请求路由到相应的Web应用程序。攻击者通过篡改HTTP请求中的Host头部字段来执行恶意操作。 漏洞危害 Host头部攻击的危害在于它能导致敏感信息泄露、恶意内容执行…

ROS1入门教程6:复杂行为处理

一、新建项目 # 创建工作空间 mkdir -p demo6/src && cd demo6# 创建功能包 catkin_create_pkg demo roscpp rosmsg actionlib_msgs message_generation tf二、创建行为 # 创建行为文件夹 mkdir action && cd action# 创建行为文件 vim Move.action# 定义行为…

DL作业11 LSTM

习题6-4 推导LSTM网络中参数的梯度&#xff0c; 并分析其避免梯度消失的效果 LSTM&#xff08;长短期记忆网络&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;旨在解决普通 RNN 在处理长序列时遇到的梯度消失和梯度爆炸问题。它通过设计多个门…

WWW23-多行为级联|级联图卷积网络的多行为推荐

论文&#xff1a;https://arxiv.org/abs/2303.15720 代码&#xff1a;https://github.com/SS-00-SS/MBCGCN 这篇论文MB-CGCN和上一篇CRGCN是同一个团队的&#xff0c;都是级联的方式。一个用了残差&#xff0c;一个用了特征转换&#xff0c;文章最后有discussion讨论了两者的不…

JAVA开发入门学习七- 数组

数组的概念 概念 数组&#xff1a; 是多个相同类型数据按照一定排列的集合&#xff0c;并使用一个名字命名&#xff0c;并通过编号的方式对这些数据进行统一管理 数组中的概念 数组名&#xff1a; 数组的名称&#xff0c;命名 下标&#xff1a; 从0开始 元素&#xff1a;…

【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹

代码 [MenuItem("Assets/Open Explorer/PersistentDataPath")]public static void OpenPersistentDataPath(){Application.OpenURL(Application.persistentDataPath);}[MenuItem("Assets/Open Explorer/DataPath")]public static void OpenDataPath(){Appl…

链路聚合与GVRP的混合构建(eNSP)

目录 拓扑图&#xff1a; 前置操作&#xff1a; GVRP全局开启&#xff1a; 查询&#xff1a; 实验背景&#xff1a;前面依次搭建了交换机的链路聚合实验手册以及动态vlan GVRP&#xff0c;为了模拟真实环境&#xff0c;本次实验将两者结合。 拓扑图&#xff1a; 前置操作&…

由于这些关键原因,我总是手边有一台虚拟机

概括 虚拟机提供了一个安全的环境来测试有风险的设置或软件,而不会影响您的主系统。设置和保存虚拟机非常简单,无需更改主要设备即可方便地访问多个操作系统。运行虚拟机可能会占用大量资源,但现代 PC 可以很好地处理它,为实验和工作流程优化提供无限的可能性。如果您喜欢使…

华为ensp--BGP路由反射器

学习新思想、争做新青年&#xff0c;今天学习的是BGP路由反射器。 实验目的 理解BGP路由反射器的应用场景 理解BGP路由反射器的工作原理 掌握BGP路由反射器的基本配置方法 实验内容 本实验网络包含了两个AS&#xff0c;两个Cluster。R1、R2、R3属于Cluster 1&#xff0c…

使用idea创建JDK8的SpringBoot项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 使用idea创建JDK8的SpringBoot项目 前言我们经常在创建新的springboot项目&#xff0c;默认使用的是spring.io进行创建&#xff0c;但是它总是只会提供高版本的创建方式&…

初学stm32 --- 定时器中断

目录 时钟选择&#xff1a; 内部时钟选择​编辑 时钟计算方法&#xff1a; 计数器模式 向下计数模式&#xff08;时钟分频因子1&#xff0c;ARR36&#xff09; 向上计数模式&#xff08;时钟分频因子1&#xff0c;ARR36&#xff09; 中央对齐计数模式&#xff08;时钟分频因…

windows下安装配置anaconda及常用的conda命令

Anaconda极大的简化了Python环境和库的管理&#xff0c;其最大的作用就是可以创建、管理多个不同python版本的虚拟环境&#xff0c;起到不同环境相互隔离、互不干扰、避免环境冲突的目的。如果使用本地Python安装多个包&#xff0c;经常会遇到包冲突&#xff0c;导致整个python…

安装CPU版的torch(清华源)

1、安装指令&#xff1a; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2、验证torch是否安装成功 // 使用python验证 import torch print(torch.__version__)能正常打印版本即表示安装成功&#xff0c;如下图