WebRTC:P2P 连接过程完全解析

P2P通信基本原理 P2P即点对点协议。当A和B通信的时候,最简单的方式如下,A和B之间通过一个服务器转发数据。而P2P是这样的,双方直接进行通信这种方式能大大减轻服务端的负载,所以特别适合大数据的传输,比如实时音视频聊天、在线视频直播、大文件传输等应用场景。 阅读详情

        宏观流程:

  • 设置 local sdp;
  • 创建一个 transport 对象(启用了 bundle);
  • 收集 local candidates;
  • 设置 remote sdp,添加 remote candidates;
  • ICE 连通性检查,建立 P2P 连接;
  • P2P 数据传输;   

        P2P 关键类:

  • AllocationSequence: 负责对单个网络设备(Network 对象)分配 port,分阶段进行;
  • 各种 port 类:代表的是一种通讯机制的本地实例,它可以和远端的类似实例一起实现数据通讯;
  • Connection: 代表的是一个 local port 和一个 remote port 的通讯链接;
  • PeerConnection: WebRTC 核心类;
  • JsepTransportController: 管理 P2P 连接;
  • 各种 transport 类:P2P 连接的封装,封装了加解密、mux/demux 等逻辑,提供收发数据的接口;
  • BasicPortAllocator, PortAllocator: 保存各种配置,管理 PortAllocatorSession;
  • BasicPortAllocatorSession, PortAllocatorSession: 遍历所有网络设备(Network 对象),分配 port;

          各种 transport 类的关系 :

  • PacketTransportInternal, PacketTransportInterface: packet base transport 的基类;
  • P2PTransportChannel, IceTransportInternal: 继承自 PacketTransportInternal,负责 ICE 相关的功能,包括:收集本地 candidate、和远端 candidate 做连通性检查、数据传输;
  • DtlsTransport, DtlsTransportInternal: 继承自 PacketTransportInternal,负责 DTLS 相关的功能,包括:DTLS 握手、DTLS 加解密;内含一个 IceTransportInternal.                 

        (P2PTransportChannel),收发数据通过它实现; 

        不加密时,写入 DtlsTransport 的数据,直接交给 P2PTransportChannel; 

        加密时,数据会交给 SSLStreamAdapter -> StreamInterfaceChannel -> P2PTransportChannel,这是为了桥接加解密的流式接口与 DtlsTransport 的包式接口;       

       ● DtlsTransport, DtlsTransportInternal: 继承自 PacketTransportInternal,负责 DTLS 相关的功能,包括:DTLS 握手、DTLS 加解密;内含一个 IceTransportInternal.         

        ●DtlsSrtpTransport, SrtpTransport: DTLS-SRTP, SRTP 的实现类,继承自 RtpTransport;

        ●JsepTransport: JsepTransportController 管理 transport 的辅助类,sdp 里每个 m line 都对应于一个数据流(音频、视频、应用数据),每个数据流都需要一个 transport,但可以通过 bundle 技术复用同一个 transport,m line 里的 attribute 描述了 transport 的属性; 

  • 根据 transport 的加密属性,构造它时会准备无加密的 RtpTransport,或 SDES 加密的 SrtpTransport,或 DTLS 加密的 DtlsSrtpTransport;这一逻辑在 JsepTransportController::MaybeCreateJsepTransport 函数里;
  • transport 对象将在设置 sdp 时创建,一个 transport 对象将会对应于一个最终的 P2P 网络连接(socket);

关键类的数量关系:

        一个 PeerConnection - 一个 JsepTransportController - 一个 JsepTransport(启用了 bundle)。

        一个 DtlsSrtpTransport - 一个 DtlsTransport - 一个 P2PTransportChannel。 

         一个 JsepTransportController - 一个 BasicPortAllocator - 多个 BasicPortAllocatorSession,但一次分配过程只会有一个 session。

        一个 BasicPortAllocatorSession - 多个 AllocationSequence。

         一个 AllocationSequence - 多个 port。

        一个 P2PTransportChannel - 多个 Connection,但最终会选出一个 Connection 使用。

        收集本地 candidate:

        设置 local sdp,开始收集 candidate: 

  1. PeerConnection::SetLocalDescription
  2. JsepTransportController::MaybeStartGathering
  3. P2PTransportChannel::MaybeStartGathering
  4. BasicPortAllocatorSession::StartGettingPorts
  5. BasicPortAllocatorSession::DoAllocate

        DoAllocate:

        DoAllocate 里会遍历所有网络设备(Network 对象),创建 AllocationSequence 对象,调用其 Init Start 函数,分配 port。 

  1. BasicPortAllocatorSession::DoAllocate
  2. AllocationSequence::Start
  3. AllocationSequence::OnMessage

        AllocationSequence 分配 port 分为三个 phase:UDP, RELAY, TCP。每个 phase 之间间隔一个 step delay。

        UDP phase :

        UDP phase 会收集两种类型的 candidate:host 和 srflx。

        一旦创建了 AsyncPacketSocket 对象,有了本地 IP 和端口,host 类型的 candidate 也就已经就绪了,而 AsyncPacketSocket 对象在 AllocationSequence::Init 里就已经创建好了,所以可以直接发出 host candidate。 

        host candidate

  1. AllocationSequence::OnMessage
  2. AllocationSequence::CreateUDPPorts
  3. BasicPortAllocatorSession::AddAllocatedPort
  4. UDPPort::PrepareAddress
  5. UDPPort::OnLocalAddressReady
  6. Port::AddAddress
  7.  sig slot (SignalCandidateReady)
  8. BasicPortAllocatorSession::OnCandidateReady

         srflx candidate

        

         RELAY phase

         WebRTC 目前支持两种中继协议:GTURN 和 TURN。现在基本都是使用标准的 TURN 协议。TURN 协议是 STUN 协议的一个扩展,它利用一个中继服务器,使得无法建立 P2P 连接的客户端(NAT 严格限制导致)也能实现通讯。

        TURN 协议的工作流程如下:

        客户端发送 Allocate request 到 server,server 返回 401 未授权错误(带有 realm 和 nonce),客户端再发送带上认证信息的 Allocate request,server 返回成功分配的 relay address。分配成功后,客户端需要通过发送机制(Send Mechanism)或信道机制(Channels)在 server 上配置和其他 peer 的转发信息。此外 allocation 和 channel 都需要保活。

        WebRTC 使用的是信道机制,因为这一机制的数据开销更低。

        收集 TURN relay candidate 时也可以复用收集 host candidate 时创建的 socket 对象,这一逻辑通过 PORTALLOCATOR_ENABLE_SHARED_SOCKET flag 控制,前面我们就已经知道,默认情况下它是开启的。

        由于 TURN 协议是 STUN 协议的扩展,所以基本的发送请求、接收响应的代码是复用的,下面只描述 TURN 协议独特的部分:

  1. AllocationSequence::OnMessage
  2. AllocationSequence::CreateRelayPorts
  3. BasicPortAllocatorSession::AddAllocatedPort
  4. TurnPort::PrepareAddress
  5. TurnPort::SendRequest
  6. ↓ message
  7. StunRequest::OnMessage
  8. ↓ 发送请求、接收响应
  9. StunRequestManager::CheckResponse
  10. TurnAllocateRequest::OnErrorResponse
  11. TurnAllocateRequest::OnAuthChallenge
  12. TurnPort::SendRequest
  13. ↓ 发送请求、接收响应
  14. StunRequestManager::CheckResponse
  15. TurnAllocateRequest::OnResponse
  16. TurnPort::OnAllocateSuccess
  17. Port::AddAddress
  18. ↓ sig slot (SignalCandidateReady)
  19. BasicPortAllocatorSession::OnCandidateReady

设备互联 (二) p2p连接 p2p连接 阅读详情

相关推荐

WebRTC实现P2P文件传输

本文讲的是利用WebRTC中的RTCPeerConnection的能力如何实现P2P通信的,在文末还有demo实现了P2P传输文件的应用,P2P传输文件的好处就是可以在同一内网的两台机器直接通过内网传输。本文涉及的技术点会有点多,我会先从介绍WebRTC和P2P开始,然后围绕WebRTC建立P2P连接的过程了解所有的具体内容。

yinshipin007的博客 1597

关于P2P(点对点)

当然,这也可能不需要,而是P2P Client 在上线后主动进行 “Discover(发现)”,在大多数的 P2P 工程及解决方案之中,并不需要在P2P上线后,主动广播并告知所有其它在线的P2P Client 链路信息。但现在的P2P,实现上面会略微有一些复杂:需要采取UDP打洞的技术,但UDP打出来的洞,是有持续时间的,因为ASN/ISP(运营商)对于P2P,存在较为严重的技术限制。上图为P2P的标准架构,即一个P2P中心服务器,用以为P2P发现其它P2P客户端提供支援,并可以实现UDP打洞。

liulilittle的博客 2416

WebRTC:去中心化网络P2P框架解析

本文深入探讨了WebRTC视频通话中的P2P(点对点)框架及其核心技术,特别是去中心化网络的概念。文章首先对比了中心化网络和去中心化网络的特点,指出去中心化网络通过直接连接提高效率和稳定性。接着,详细介绍了网络地址映射(NAT)的原理及其三种实现方式:静态转换、动态转换和端口地址映射(PAT),并分析了NAT在网络安全中的作用。此外,文章还讨论了不同类型的NAT及其对网络通信的影响,以及如何通过STUN和TURN协议实现网络穿透,确保设备间的直接连接。最后,文章总结了这些技术如何共同支持WebRTC视频通话

2301_76564925的博客 2290

第二十三章 建立P2P 连接

PeerConnection 是 WebRTC 连接流程中无法绕过的一个类,甚至可以认为这个类是整个连接流程的 Controller。当2个用户分别在2端试图连接对方的时候,首先由信令服务器服务,使得相互可以认识到对方的存在,之后,就需要建立一个稳定的长连接,此时并没有另外一个中央服务器处理这2个客户端的共有信息,我们认为是2个Endpoint到Endpoint的连接,也称为Peer2Peer的连接,简称P2P .WebRTC中重要的类PeerConnection负责建立这个连接。

ms44的专栏 2608

实现WebRTC P2P连接

WebRTC是为了解决实时音视频传输问题,致力于提供免安装、免插件、免专利费,人人可用的高效便捷的实时流媒体传输。

yinshipin007的博客 649

基于 WebRTC 的 P2P 文件传输

WebRTC 是一个实时通信的技术,它提供了一套 API,可以让浏览器实现 P2P 通信,而且不需要额外的插件,这使得 WebRTC 成为了一种非常有前景的技术。在前面几篇文章中,我们已经介绍了 WebRTC 的基本概念和使用,包括音视频通话、屏幕共享、媒体流的处理,还有 WebRTC 与 Tensorflow.js 的结合。而这次,我将介绍 WebRTC 的另一个重要功能:P2P 文件传输。// 监听文件通道状态// 当文件通道状态发生变化时触发。

军火库 1990

WebRTC Native源码分析——P2P连接过程详解

一年前我初步分析了 WebRTC 的 P2P 连接过程,并总结为了安卓 P2P 连接过程和 DataChannel 使用一文,那会儿我刚接触 WebRTC C++ 的代码,看起来着实头大,而且安卓的代码要调试、测试也很麻烦,所以很多细节就没有展开,今天就让我们在 iOS 的工程里,对 P2P 连接的过程进行一个彻底的剖析。 概览 首先我们从宏观上了解一下 P2P 连接的过程,以及一些关键类之间的关系,这样在看代码时就不至于迷失在细节里。此外,没看过安卓 P2P 连接过程和 DataChannel 使用的

paradox_1_0的博客 2253

Buck电路中自举电容串联小电阻的作用

在Buck电路中,自举电容(Cboot)驱动高边MOSFET时,因寄生电感和电容会形成LC谐振回路,导致SW节点高频振铃,引发EMI问题。串联小电阻(Rboot)可引入阻尼效应,抑制振铃、改善波形和EMI性能,但会略微增加开关损耗。设计时建议预留可调电阻位(2Ω~20Ω),根据实测结果平衡效率与系统稳定性,提升电源可靠性。这一措施是优化开关电源EMC的常见实践。

硬核科技 627

WebRTC P2P建立过程

根据最初的定义,WebRTC被指定为P2P(peer-to-peer)技术,旨在通过其浏览器(也称为P2P)在客户端之间直接发送媒体流。在P2P架构中,客户端建立通信之前,首先需要建立到应用服务器(有时也成为信令服务器)的信令连接。而 WebRTC规范中没有规定信令方法或协议,它允许采用现有方法(SIP,WebSockets,XMPP等)或实现专有信令过程。应用服务器保存业务逻辑,并作为会话描述协...

ice_ly000的博客 2008

百度智能云ASR实战:5分钟搞定Unity语音转文字(含完整代码)

本文详细介绍了如何在Unity中集成百度智能云ASR服务,实现高效的语音转文字功能。从环境配置、音频处理到服务端通信,提供完整代码示例和实战优化技巧,帮助开发者快速实现语音交互功能,适用于游戏开发、XR应用等场景。

ujm56789012的博客 215

STM32H750实战:用TIM+DMA驱动ADC/DAC实现音频回环(附CubeMX配置避坑指南)

本文详细介绍了在STM32H750上构建高保真、低延迟音频链路的实战方法。通过配置TIM定时器作为硬件节拍器,精准触发ADC采集与DAC播放,并利用DMA实现数据的自动搬运,全程无需CPU干预。文章重点剖析了CubeMX配置中的关键步骤与常见“坑点”,如ADC的Conversion Data Management模式选择、DMA的FIFO与Burst模式配置,以及STM32H7系列必须开启ADC全局中断等,并提供了完整的代码实现与调试验证指南。

1057

webrtc p2p Android,WebRTC-Android P2P 连接过程

前面四篇里,我们分别分析了 WebRTC Android 的视频采集、视频渲染和视频硬编码,最后把相关代码剥离出来形成了一个独立的模块:VideoCRE,并对其进行了极大地内存抖动优化。从本篇起,我们将迈入新的领域:网络传输。首先我们看看 P2P 连接的建立过程,以及 DataChannel 的使用,最终我们会利用 DataChannel 实现一个 P2P 的文字聊天功能。前面四篇没看过的朋友,下...

weixin_35724794的博客 656

Android 12,通过JNI写framebuff实现白板书写加速

Android 书写加速

448313096@qq.com 1204

WebRTC PeerConnection 建立连接过程介绍

0x00 前言 WebRTC 中数据传输都是通过被称为 PeerConnection 的对象来完成的,PeerConnection 在可以传输数据前的建立过程现对于传统的 C/S 模式有略微差别,类似于 P2P 连接的建立过程,并且复用了传统的 STUN/TURN/ICE 架构的 P2P 实现方式。由于 WebRTC 支持 MESH/SFU/MCU 三种模式,使用 PeerConnection 概念的好处是可以同时兼容这三种模式,即使是像 SFU/MCU 这种非 P2P 的场景也同样使用 PeerConne

aggresss 1万+

第6章: MMU Notifier在KVM虚拟化中的应用

本文分析了KVM如何利用MMU Notifier机制维护客户机与宿主机地址映射一致性。KVM采用三层地址空间转换架构(GVA→GPA→HPA),通过硬件辅助虚拟化(EPT/NPT)实现高效转换。重点探讨了KVM MMU Notifier回调实现,包括invalidate_range_start/end等核心函数,以及HVA范围处理流程。当宿主机内存变化时,KVM通过注册的notifier回调及时更新映射关系,确保虚拟化环境的内存一致性。文章详细解析了相关数据结构和关键代码实现,揭示了KVM内存管理的核心机制

图形/计算GPU的驱动与虚拟化技术分享园地 2324

ComfyUI报错ModuleNotFoundError: No module named ‘comfy.options‘

好家伙,我一想我刚刚好像用了pip安装了comfy模块,不会是和ComfyUI自带的comfy模块产生冲突了吧。(3)还有的说是项目不是最新版,叫更新到最新版本的,好家伙,我报错之前根本没更新也没错,突然就报错的。(4)还有的说没有comfy.options这部分代码,叫自己去拉一个,我一看也有啊。我也不知道啥时候脑抽风去装这么个东西的,幸好我聪明机智,一眼就知道了。看把我气的,然后网上搜集各种资料,一个一个去试。

满目星辰 5159

WebRTC实战:从媒体流到P2P连接

摘要:WebRTC技术实现浏览器间实时音视频与数据传输,无需中转服务器。本文详解其核心流程:通过getUserMedia捕获媒体流并显示;枚举设备并配置约束参数;利用RTCPeerConnection建立P2P连接,依赖STUN/TURN穿透网络障碍;通过ICE候选交换与SDP提议/应答协商连接;动态管理轨道及群组架构(Mesh/SFU/MCU)。附TypeScript风格代码示例,涵盖从采集到关闭的完整实现,为开发实时应用提供基础框架。

YF云飞的博客 1184

MicroPython学习:在STM32上进行移植

本文将介绍如何在STM32上移植MicroPython,并提供相应的源代码。通过以上步骤,你已经成功地将MicroPython移植到STM32上,并可以使用MicroPython语言编写和运行代码。你可以进一步探索MicroPython的功能和API,以利用STM32的各种外设和功能。使用STM32CubeProgrammer或其他适当的烧录工具,将编译生成的MicroPython固件烧录到STM32微控制器中。打开该文件,并根据你的STM32微控制器类型进行必要的配置更改。模块来控制STM32的LED。

JeeVue的博客 1237

WebRTC实时通信原理与P2P连接实战

打开浏览器,无需安装任何插件,就能进行视频通话——这在十年前是难以想象的。WebRTC(Web Real-Time Communication)让这一切成为现实。它是由Google主导开发的开源项目,已被W3C和IETF标准化,如今所有主流浏览器都原生支持。但WebRTC不仅仅是"视频通话API",它的底层是一套完整的P2P实时通信框架。理解它的原理,对于开发任何需要低延迟传输的应用都大有裨益。 1.2 三大核心API API 功能 使用场景 获取摄像头/麦克风 采集本地音视频 建立

在代码的世界里,每天进步1% 1360

华为OD机试 双机位C卷:微服务的集成测试 (C/C++/Py/Java/JS/Go)

华为OD机试 双机位C卷 :微服务的集成测试 ,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 微服务的集成测试 , 华为OD 微服务的集成测试

qq_45776114的博客 2066

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

webrtc建立连接的过程

WebRTC 是个神奇的技术,让浏览器直接进行点对点(P2P)音视频通话或数据传输,不用每次都靠服务器中转。想知道 Alice 和 Bob 是怎么通过 WebRTC 建立视频通话的吗?下面是整个过程,拆分成几个简单步骤,带你搞清楚每一步都在干啥!,两者配合让 WebRTC 在复杂的网络环境下也能实现高效的 P2P 通信。信令服务器只是个“临时助手”,真正的音视频数据靠 P2P,省服务器、降延迟!如果你觉得需要调整语气(比如更专业或更简短),或者想加点图表(比如流程图),告诉我,我可以再改!

iamzchi 1780

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android WebRtc 视频通话(P2P)

android端使用WebRTC 实现P2P 语音和视频电话呼叫,无需帐户或访问互联网。 没有发现机制,没有网格化,也没有服务器。

ansondroider的博客 7549

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WebRTC 源码分析(五):安卓 P2P 连接过程和 DataChannel 使用

    从本篇起,我们将迈入新的领域:网络传输。首先我们看看 P2P 连接的建立过程,以及 DataChannel 的使用,最终我们会利用 DataChannel 实现一个 P2P 的文字聊天功能。     P2P 连接过程   首先总结一下 WebRTC 建立 P2P 连接的过程(就是喜欢手稿): 我们先来一个简单的名词解释。   SDP   SDP 全称 Sessi...

欢迎关注我 https://x.com/Awesome_AI_News 1424

WebRTC-Java 项目中的 P2P 连接实现详解

WebRTC 技术在现代实时通信应用中扮演着重要角色,而 WebRTC-Java 项目为 Java 开发者提供了实现 WebRTC 功能的强大工具。本文将深入探讨如何使用 WebRTC-Java 库实现点对点(P2P)连接,特别关注 STUN 服务器配置、ICE 候选收集以及数据通道建立等核心功能。 ## 核心组件介绍 ### PeerConnectionFactory PeerConnec...

gitblog_07171的博客 1362
上一篇: C++11:enable_shared_from_this
下一篇: uwebsoket的编译
怕什么真理无穷
博客等级 码龄10年 415粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值