WebRTC(三):P2P协议

P2P(Peer-to-Peer)协议是一种分布式通信模型,不依赖于传统的服务器/客户端架构,而是由网络中的各个"节点"或"对等体"(peer)共同提供服务和资源。P2P 协议广泛应用于文件共享、区块链、即时通讯、视频流媒体等领域。下面我们对 P2P 协议进行系统性详解。

基本概念

  • 对等体(Peer)

    • 每个参与的节点即是客户端也是服务器,既可以发起请求,也可以响应请求。
  • 去中心化(Decentralization)

    • 不依赖中心服务器,系统鲁棒性更强。
  • 分布式资源共享

    • 资源分布在各个节点上,如文件块、计算能力等。

网络拓扑结构

非结构化 P2P 网络

  • 节点随意连接,如 Gnutella、KaZaA。
  • 查找方式:洪泛搜索(Flooding)、随机行走(Random Walk)。
  • 优点:易于加入和退出,鲁棒性好。
  • 缺点:查询效率低,资源浪费大。

结构化 P2P 网络

  • 节点按一定规则组织,如 DHT(分布式哈希表)网络。
  • 典型代表:Chord、Kademlia、Pastry。
  • 查找效率高,通常为 O(logN)。
  • 缺点:维护开销高,节点动态变化处理复杂。

核心机制

节点发现

  • 机制:引导节点(Bootstrap Node)、广播、DHT。
  • 示例:BitTorrent 使用 tracker 或 DHT 发现 peer。

资源定位与索引

  • 非结构化:关键字广播查找。
  • 结构化:DHT,键值对存储资源映射关系。

文件分块与分发

  • 如 BitTorrent 把文件切分为多个小块,每个 peer 下载并分享部分块,实现高速分发。

数据一致性与完整性校验

  • 使用哈希值(SHA-1、SHA-256)验证每一块数据是否完整。

NAT 穿透

  • P2P 通信常需穿透 NAT 和防火墙,常用方法包括:
    • STUN(Session Traversal Utilities for NAT)
    • TURN(Traversal Using Relays around NAT)
    • ICE(Interactive Connectivity Establishment)
    • UPNP(Universal Plug and Play)

协议与实现

协议/系统 特点 使用场景
BitTorrent 分块下载,Tracker+DHT 查找 文件分享
eMule/Kad 使用 Kademlia DHT 网络 文件分享
Gnutella 非结构化网络,广播查询 老牌 P2P 文件共享
Skype(旧) P2P 实时音视频通信 通话、IM
IPFS 内容寻址、文件分布式存储 Web3、分布式存储
Libp2p 模块化、支持多种传输方式 IPFS 底层通信协议
Ethereum 使用 Kademlia DHT,Gossip 网络 区块链节点通信

优势与挑战

优势

  • 高可用性:无需中心服务器。
  • 可扩展性:节点越多,系统性能越强。
  • 成本低:资源由用户分担。

挑战

  • 安全问题:如恶意节点、DDoS、虚假资源。
  • 网络复杂性:如 NAT 穿透困难、节点动态变化频繁。
  • 数据一致性与冗余控制。
  • 法律风险:如非法内容传播责任问题。

应用场景

  • 文件分享:BitTorrent、迅雷、eMule。
  • 区块链与加密货币:比特币、以太坊。
  • 分布式存储:IPFS、Filecoin。
  • 即时通讯:Signal、旧版 Skype。
  • 边缘计算与 CDN:基于 P2P 的 CDN 网络,如 Peer5。
  • 直播流媒体:如 P2P + WebRTC 直播方案。

P2P流媒体

原理概述

传统流媒体 vs P2P 流媒体

项目 传统流媒体(CDN) P2P 流媒体
架构 中心化服务器 去中心化节点
服务器负载
延迟 中等 视策略而定
扩展性 受限于服务器带宽 极强
成本

典型架构模型

Mesh-Pull 模型(网状拉流)

  • 每个节点从多个邻居拉取流媒体分片。
  • 优点:冗余度高,容错性强。
  • 缺点:调度和协调较复杂。
  • 示例:PPLive、CoolStreaming、WebRTC 多对多架构。

Tree-Push 模型(树状推流)

  • 服务器构建一棵推送树,节点按层级接受流。
  • 优点:延迟低,实现简单。
  • 缺点:节点失效会影响子节点,鲁棒性差。
  • 示例:老版 LiveSky。

Hybrid 模型

  • 树状结构为主干,网状结构提供冗余和修复。
  • 多用于实际系统,如:PPStream、WebRTC Mesh + SFU。

关键技术组件

分片与调度机制

  • 视频被切分成小块(Segment/Chunk)。
  • 每个 Peer 记录自己已拥有的分片,通过调度算法(如稀有优先、最短路径)决定拉流来源。

邻居节点发现

  • 借助 tracker、信令服务器、DHT 网络或 WebRTC signaling 寻找可用 peer。

NAT 穿透

  • 使用 STUN/TURN/ICE 协议实现点对点通信。
  • WebRTC 在浏览器中广泛支持。

内容缓存与缓存替换

  • 节点使用内存或磁盘缓存片段,提升可用性并降低重复下载。

质量控制与抗丢包

  • 使用 FEC(前向纠错)、ARQ(重传)或冗余备份防止丢包。
  • 结合 ABR(自适应码率)提升体验。

WebRTC + MediaSource

基本流程

text 复制代码
浏览器A <--Signaling--> 浏览器B
    |                        |
 WebRTC建立P2P通道        WebRTC建立P2P通道
    |                        |
  A请求流片段             B传输视频数据块

技术栈

组件 功能说明
WebRTC 实现点对点传输
MediaSource 实现浏览器端拼接播放片段
Signaling 建立连接前用于交换 SDP/ICE 信息
JS调度器 控制哪些分片向哪些 peer 请求

NAT 穿透

NAT 穿透(NAT Traversal)是指在网络地址转换(NAT)存在的情况下,使两个位于不同私有网络内的客户端(peer)能通过互联网直接建立点对点通信的一种技术手段。

类型

NAT(Network Address Translation)广泛部署在家庭和企业路由器上,将内网地址映射为公网地址。根据行为,NAT 一般分为以下几类:

类型 外部主机访问限制 是否可穿透
Full Cone NAT 所有外部主机可访问 易穿透
Restricted Cone NAT 仅允许曾通信过的 IP 访问 可穿透
Port Restricted Cone 仅允许曾通信过的 IP:端口 有难度
Symmetric NAT 为每个目标 IP:端口分配不同映射端口 很难穿透

技术概览

常用技术栈:

技术 作用
STUN 探测 NAT 类型、获取公网映射地址
TURN 中继服务器,无法直连时使用
ICE 综合使用 STUN/TURN 选最佳路径

STUN:Session Traversal Utilities for NAT

工作流程:

  1. Peer 向 STUN 服务器发送请求;
  2. 服务器返回其公网 IP 和端口;
  3. Peer 将此信息发送给对方,用于建立连接。

示例(简化):

text 复制代码
内网PeerA --> STUN服务器
           <-- 显示A的公网IP:PORT
内网PeerA --> 内网PeerB(交换地址)
PeerA <==> PeerB 开始尝试打洞通信

优点:轻量快速

缺点:对 Symmetric NAT 无效

UDP 打洞(UDP Hole Punching)

UDP 打洞是一种常见穿透技术,适用于 Full Cone、Restricted Cone 等。

步骤:

  • A、B 向一个服务器注册各自地址;
  • 服务器向双方分发对方的公网地址;
  • A、B 同时向对方发送数据包,NAT 表建立;
  • 成功后实现点对点通信。

TCP 打洞(较复杂)

与 UDP 类似,但因为 TCP 是连接型协议,打洞难度大。

解决方法:

  • 同时尝试主动连接(Simultaneous Open)
  • 使用中间服务器做协商

适用场景少,一般 WebRTC/VoIP 选择 UDP。

TURN:Traversal Using Relays around NAT

当直连失败(如遇到 Symmetric NAT)时,TURN 提供中继。

  • Peer A 通过 TURN 服务器上传数据;
  • TURN 服务器再中继给 Peer B。

缺点:消耗服务器带宽,成本较高

优点:几乎万能,适合商业部署兜底方案

ICE:Interactive Connectivity Establishment

WebRTC 和 SIP 通信中广泛采用

ICE 是一种框架,用于自动选择最优通信路径:

  • 收集候选地址(Host、STUN、TURN);
  • 双方交换候选地址;
  • 逐一测试可用性;
  • 优先使用直连,失败则自动切换到 TURN。

穿透失败的原因

  • 双方都使用 Symmetric NAT;
  • 防火墙丢弃了探测包;
  • 企业或运营商部署了 NAT444 / CGNAT;
  • NAT 映射超时时间太短,连接未建立前失效;
  • STUN/TURN 服务器不可达。

DHT算法

DHT(分布式哈希表,Distributed Hash Table )是一种去中心化的键值对存储系统,用于在大规模分布式网络中高效地定位和检索资源。它广泛应用于 P2P 网络(如 BitTorrent、Kademlia)、区块链、分布式缓存系统等。

核心思想

DHT 的目标是:

在没有中心服务器的情况下,将键(key)映射到负责存储它的节点上。

  • 所有节点平等、自治;
  • 每个节点只需维护有限的邻居信息;
  • 键通过哈希算法(如 SHA1)映射到某个节点上;
  • 查找过程类似"路由跳转",而不是广播。

关键特性

特性 描述
去中心化 无需中央控制服务器
高可扩展性 可扩展至数百万节点
容错性强 节点加入/离开不会破坏整体结构
查找效率高 通常为 O(log N) 步查找目标节点

主流 DHT 算法

名称 路由复杂度 特点
Chord O(log N) 环形结构,使用 finger table
Kademlia O(log N) 二进制距离,异或操作,稳定性好
Pastry O(log N) 基于前缀匹配的路由
Tapestry O(log N) 支持命名服务,机制类似 Pastry
CAN O(N^1/d) 空间划分结构,适用于多维数据

应用场景

场景 说明
BitTorrent 用于 trackerless 网络中查找资源节点(infohash)
IPFS 通过内容寻址获取分布式文件块
区块链网络 用于节点发现、交易广播等
P2P 网络通信 查找目标 peer 地址,建立连接
WebRTC 信令 DHT 可辅助替代中心信令服务器(如libp2p)

面临的问题与挑战

问题 说明
NAT 穿透困难 节点无法接受外部连接,影响查找效率
恶意节点攻击 可能返回虚假信息(需结合信任机制)
高 churn 率 节点频繁上下线需高效更新路由表
数据不可持久化 节点离线后,其存储数据可能丢失
相关推荐
TE-茶叶蛋24 分钟前
WebSocket 前端断连原因与检测方法
前端·websocket·网络协议
从未、淡定6 小时前
HTTP 网络协议演进过程
网络·网络协议·http
Koma_zhe9 小时前
【微软RDP协议】微软RDP协议技术架构特点与跨地域应用实践
网络协议·架构·信息与通信
小猪写代码11 小时前
大白话解释蓝牙的RPC机制
网络·网络协议·rpc
邪恶的贝利亚12 小时前
从sdp开始到webrtc的通信过程
webrtc·流媒体·sdp
小墙程序员12 小时前
一文了解网络连接的完整流程
网络协议·tcp/ip
游戏开发爱好者815 小时前
iOS App上线前的安全防线:项目后期如何用Ipa Guard与其他工具完成高效混淆部署
websocket·网络协议·tcp/ip·http·网络安全·https·udp
Amy.Wang15 小时前
常见的网络协议有哪些
网络·网络协议
心月狐的流火号16 小时前
Java网络编程深度解析:TCP与UDP如何共享同一端口
网络协议
freyazzr17 小时前
TCP/IP 网络编程 | Reactor事件处理模式
开发语言·网络·c++·网络协议·tcp/ip