WebRTC通信原理与流程

1、服务器与协议相关

1.1 STUN服务器

图1.1.1 STUN服务器在通信中的位置图

1.1.1 STUN服务简介

STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重 NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的 Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间通信。该协议由RFC 5389定义。

1.1.2 STUN服务的作用

主要是给无法在公网环境下进行通话的设备,分配公网IP用的,其实简单的说来就是告诉客户端的公网IP地址+端口。因为在NAT之后的设备自己是无法知道自己公网的IP和端口的,还有另外一个作用就是找出主机所在NAT的类型,主要会判断出主机所处网络所在是处于完全锥型、地址受限型、端口受限型,NAT对称型,从而找到更合适的通信方案。

1.2 TURN服务器

图1.2-1 TURN服务器在通信中的位置图

1.2.1 TURN服务器简介

TURN的全称为Traversal Using Relays around NAT,是STUN/RFC5389的一个拓展,主要添加了Relay功能。如果 终端在NAT之后, 那么在特定的情景下,有可能使得终端无法和其对等端(peer)进行直接的通信,这时就需要公网 的服务器作为一个中继, 对来往的数据进行转发。这个转发的协议就被定义为TURN。

1.2.2 TURN服务器的作用

当无法建立P2P连接时候,那么就通过TURN服务器来转发媒体数据

1.3 信令服务器

图1.3-1 P2P信令服务器在通信中的位置图

1.3.1 信令服务器简介

作为端对端通信的桥梁,为P2P建立连接,媒体协商,网络协商提供服务,搭在公网上,让局域网内的设备都能访问到,进行通信的交互

1.3.2 信令服务器作用

设备之间的媒体协商(SDP),设备之间的网络协商(Candidate)提供信令交互的通道

1.4 服务器间主要的交互流程图

图1.4-1 端与端,端与服务器间的交互流程

2、ICE Candidate(ICE候选者)

2.1 简介

表示 WebRTC 与远端通信时使用的协议、IP 地址和端口,通常包含以下字段

本地IP地址、本地端口号、候选者类型、优先级、传输协议、访问服务的用户名

2.2 候选者的优先级情况

host(本机候选者)

srflx(内网主机映射的外网地址和端口)

prflx(对等反射候选者)

relay(中继候选者)

host类型是最高优先级的,在WebRTC中,首先对host类型的候选者进行连通性检查,如果他们能够互通,则直接建立连接,其实host类型之间的联通性检测就是内网间的连通性检测

如果host类型无法连接,尝试次优先级的候选者即是srflx类型候选者,然后是prflx

上面3种都不行,那么就会尝试使用relay方式建立连接

优先级: host > srflx > prflx > relay

2.3 收集Candidate

host类型: 即本机内网的IP和端口

srflx类型:即本机NAT映射后的外网的IP和端口

prflx类型:对等反射候选者,通过对端数据包头或者到对端的的地址获取

relay类型: 即中继服务器的IP和端口

2.4 STUN协议

srflx类型的Candidate是通过STURN协议进行收集的,简单来说就是内网主机通过发送STUN消息binding request到STUN服务器,服务器收到请求后,会将请求的IP地址和端口填充到binding response消息中,然后返回给内网主机,内网主机就可以知道自己外网IP和端口。也需要通过STUN协议判断当前网络所处的NAT类型,比如是完全锥形,还是端口限制型,还是地址受限类型,还是对称NAT类型

2.5 TURN协议

也是用STUN协议,只不过协议的类型不一样,比如获取中继的Candidate,会向TURN发送Alllcation指令,relay服务就会在服务端分配一个relay端口,用于中转数据,然后把地址和端口返回给客户端

2.6 ICE

其实ICE就是上面说的获取各种类型的Candidate(候选者)的过程,也就是分为

  1. 在主机收集所有的host类型的Candidate
  2. 通过STUN协议获取srflx类型的Candidate
  3. 通过TURN协议获取relay类型的Candidate

3、通信时序图

3.1 媒体协商时序图

图3.1-1 媒体协商时序图

3.1.1 媒体协商

媒体协商主要用SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端、iOS 端等)的能力, 这里的能力指的是各端所支持的,比如主要有以下内容

  1. 音视频编解码器是什么,这些编解码器设定的参数是什么,采用什么音视频编码格式
  2. 使用的传输协议是什么

3.1.2 涉及的通信协议

  1. Offer信令
  2. Answer信令
  3. Candidate信令

3.2 网络协商时序图

图3.2-1 网络协商时序图

3.2.1 网络协商说明

其实上面绘制的没有完全体现媒体协商与网络协商的同步进行,为了提高连接效率,媒体协商跟网络协商应该同步进行在CreatePeerConnection(设置STUN/TURN服务器地址)后进行CreateOffer,在收到webrtc回调Offer信息,webrtc也在进行网络协商,只要通过回调OnCandidate收到网络协商信息,就通过信令服务把Candidate信息发送到对端去。

3.2.2 涉及的通信协议

  1. Candidate信令

3.3 局域网内端对端通信时序图

图3.3-1 局域网内通信时序图

3.3.1 局域网内通信

如果两个端同在一个局域网内,可以进行直连的,webrtc中的ICE框架会判断两个端是否在同一局域网,然后进行局域网内的通信

3.3.2 涉及的协议

  1. Candidate信令

3.4 NAT场景P2P连接时序图

图3.4-1 P2P打洞时序图

3.4.1 NAT通信

这种属于两个端之间的P2P的直接连接,是要依靠NAT打洞(P2P穿越),需要借助STUN服务进行协调打洞的过程的,成功率的大小跟设备所处在的NAT类型(完全锥形、地址限制型、端口限制型、完全首先型)有很大的关系,当这种方式失败了,将采用下面的第3种方式,即通过Relay中转的方式进行通信

3.4.2 涉及的协议

  1. Candidate信令

3.5 通过Relay连接通信时序图

图3.5-1 通过Relay连接通信的时序图

3.5.1 通过Relay连接通信

当P2P穿越失败时候,采用这种中继的方式进行通信交换数据,端侧会向TURN服务器发送,Allocation 指令。通过向 TURN 服务器发送 Allocation 指令,Relay服务就会在服务器端分配一个新的 relay 端口,用 于中转 UDP 数据报.

3.5.2 涉及的协议

  1. Candidate信令

4、浏览器通信例子

图4-1 浏览器端接入WebRTC的示例图

拿浏览器接入WebRTC来预览设备端视频的例子

  1. 先http请求从地址服务器上获取信令服务器的地址,STUN/TURN服务器的地址
  2. 与信令服务器建立WebSocket连接
  3. 传入STUN/TURN服务器的配置,创建RTCPeerConection(浏览器WebRTC核心类)
  4. 调用浏览器RTCPeerConection类的接口createOffer
  5. RTCPeerConection类回调onOffer
  6. 调用浏览器RTCPeerConection类的接口,setLocalDescriptions
  7. 从onOffer得到回调的SDP信息转为信令发送到信令服务器
  8. 浏览器收到Answer,调用浏览器类型RTCPeerConnection类的接口,setRemoteDescription
  9. RTCPeerConection类回调OnCandidate
  10. 通过信令服务器发送candidate到对端
  11. 收到信令服务器发过来的candidate,调用浏览器类型RTCPeerConnection类的接口,addIceCandidate
  12. 连接成功后收到RTCPeerConection类的onTrack收到流信息
  13. h5的video标签 设置onTrack返回的流进行播放

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

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

相关文章

Beta分布--贝叶斯建模概率或比例常用分布

Beta分布是一种定义在区间 ([0, 1]) 上的连续概率分布,常用于描述比例或概率的不确定性。它的形状由两个正参数 (\alpha)(alpha)和 (\beta)(beta)控制,能够呈现多种形态(如对称、偏态、U型等&am…

深度学习算法:开启智能时代的钥匙

引言 深度学习作为机器学习的一个分支,近年来在图像识别、自然语言处理、语音识别等多个领域取得了革命性的进展。它的核心在于构建多层的神经网络,通过模仿人脑处理信息的方式,让机器能够从数据中学习复杂的模式。 深度学习算法的基本原理…

深入了解linux系统—— 自定义shell

shell的原理 我们知道,我们程序启动时创建的进程,它的父进程都是bash也就是shell命令行解释器; 那bash都做了哪些工作呢? 根据已有的知识,我们可以简单理解为: 输出命令行提示符获取并解析我们输入的指令…

Redux和Vuex

为什么React和Vue需要Redux和Vuex 状态管理需求的演变 #mermaid-svg-GaKl3pkZ82yc1m8E {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GaKl3pkZ82yc1m8E .error-icon{fill:#552222;}#mermaid-svg-GaKl3pkZ82yc1m8E…

Kubernetes排错(十三):Pod间偶发超时问题排查

在微服务架构中,Pod间偶发的通信超时是最令人头疼的问题之一。本文将通过生产环境中的真实案例,手把手教你定位这类"幽灵问题"。 一、快速定位问题方向(5分钟缩小范围) 1. 基础检查三板斧 # 检查Service与Endpoint映…

Nginx 源码安装成服务

一、环境准备 一台装有 CentOS 7.9 的虚拟机(IP: 192.168.40.81)nginx-1.21.6.tar.gz 安装包一个(版本随意) 二、安装 1)解压 nginx-1.21.6.tar.gz tar -xzvf nginx-1.21.6.tar.gz -tar:这是一个在 Linu…

L51.【LeetCode题解】438. 找到字符串中所有字母异位词(四种方法)

目录 1.题目 2.分析 暴力解法 方法1:排序(超时) 方法2:哈希表(险过) ★判断两个哈希表是否相同算法(通用方法,必须掌握) 能相等的前提:两个哈希表的大小相等 哈希表有迭代器,可以使用范围for从头到尾遍历 提交结果 优化方法:定长滑动窗口 提交结果 使用哈希数组更快…

Qt模块化架构设计教程 -- 轻松上手插件开发

概述 在软件开发领域,随着项目的增长和需求的变化,保持代码的可维护性和扩展性变得尤为重要。一个有效的解决方案是采用模块化架构,尤其是利用插件系统来增强应用的功能性和灵活性。Qt框架提供了一套强大的插件机制,可以帮助开发者轻松实现这种架构。 模块化与插件系统 模…

深入理解 HashMap 的索引计算:右移与异或的作用

在 Java 中,HashMap 是一种高效的数据结构,它通过将键映射到数组中的索引位置来实现快速的插入和查找。但之前看源码总是理解到它要hash之后散列到数组中某一个位置,但却从未深究它究竟怎么散列的,如果不够散那就意味着hash冲突增…

overleaf较高级的细节指令

换行命令 原来代码是将三个矩阵表达式在同一行显示,使用aligned环境(需引入amsmath宏包,一般文档导言区默认会引入),把三个矩阵的定义分别放在不同行,可通过\\换行。 对齐命令 &放在等号前&#xff0…

LiteLLM:统一API接口,让多种LLM模型调用如臂使指

在人工智能迅猛发展的今天,各种大语言模型(LLM)层出不穷。对开发者而言,如何高效集成和管理这些模型成为一个棘手问题。LiteLLM应运而生,它提供了一个统一的API接口,让开发者可以轻松调用包括OpenAI、Anthropic、Cohere等在内的多种LLM模型。本文将深入介绍LiteLLM的特性、…

Google语法整理

以下是从整理出的 Google 语法: site:指定域名,如 “apache site:bbs.xuegod.cn”,可查询网站的收录情况 。 inurl:限定在 url 中搜索,如 “inurl:qq.txt”,可搜索 url 中包含特定内容的页面&a…

python 写一个工作 简单 番茄钟

1、图 2、需求 番茄钟(Pomodoro Technique)是一种时间管理方法,由弗朗西斯科西里洛(Francesco Cirillo)在 20 世纪 80 年代创立。“Pomodoro”在意大利语中意为“番茄”,这个名字来源于西里洛最初使用的一个…

Compose Multiplatform iOS 稳定版发布:可用于生产环境,并支持 hotload

随着 Compose Multiplatform 1.8.0 的发布,iOS 版本也引来的第一个稳定版本,按照官方的原话:「iOS Is Stable and Production-Ready」 ,而 1.8.0 版本,也让 Kotlin 和 Compose 在移动端有了完整的支持。 在 2023 年 4 …

Jenkins 服务器上安装 Git

安装 Git # 更新包列表 sudo apt update# 安装 Git sudo apt install git 验证安装 # 检查 Git 版本 git --version 查看所有全局配置 git config --global --list 查看特定配置项 # 查看用户名配置 git config --global user.name# 查看邮箱配置 git config --global u…

OpenHarmony SystemUI开发——实现全局导航栏和状态栏关闭

在实际生产中,进场遇到需要关闭导航栏和状态栏的需求,现分享解决办法: 开发环境 OpenHarmony 5.0.0r 代码分析 思路: launcher本身可以关闭 导航栏(实际是 公共事件,发送消息给systemUI来实控制&#x…

大模型微调终极方案:LoRA、QLoRA原理详解与LLaMA-Factory、Xtuner实战对比

文章目录 一、微调概述1.1 微调步骤1.2 微调场景 二、微调方法2.1 三种方法2.2 方法对比2.3 关键结论 三、微调技术3.1 微调依据3.2 LoRA3.2.1 原理3.2.2 示例 3.3 QLoRA3.4 适用场景 四、微调框架4.1 LLaMA-Factory4.2 Xtuner4.3 对比 一、微调概述 微调(Fine-tun…

单片机-STM32部分:10-2、逻辑分析仪

飞书文档https://x509p6c8to.feishu.cn/wiki/VrdkwVzOnifH8xktu3Bcuc4Enie 安装包如下:根据自己的系统选择,目前这个工具只有window版本哦 安装方法比较简单,都按默认下一步即可,注意不要安装到中文路径哦。 其余部分参考飞书文档…

uniapp-商城-48-后台 分类数据添加修改弹窗bug

在第47章的操作中,涉及到分类的添加、删除和更新功能,但发现uni-popup组件存在bug。该组件的函数接口错误导致在小程序中出现以下问题:1. 点击修改肉类名称时,回调显示为空,并报错“setVal is not defined”&#xff0…

STM32-ADC模数转换器(7)

目录 一、ADC简介 二、逐次逼近型ADC 三、ADC基本结构图 四、规则组的四种转换模式 五、转换时间 对GPIO来说,它只能读取引脚的高低电平,使用了ADC模数转化器之后,就可以对高电平和低电平之间的任意电压进行量化,最终用一个变…