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
基本流程
浏览器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
工作流程:
- Peer 向 STUN 服务器发送请求;
- 服务器返回其公网 IP 和端口;
- Peer 将此信息发送给对方,用于建立连接。
示例(简化):
内网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 率 | 节点频繁上下线需高效更新路由表 |
数据不可持久化 | 节点离线后,其存储数据可能丢失 |