理解 P2P 网络技术

我的消息
理解 P2P 网络技术

从 RustDesk 到 BT 下载:理解 P2P 网络技术

最近自己部署了一套 RustDesk 远程服务,实现了笔记本远程控制家里电脑,以及家里电脑反向控制放在公司的笔记本电脑

在实际使用中,我发现客户端显示的是「加密直连(TCP)」。这让我产生了一个疑问:

家里和公司的电脑都没有独立公网 IP,为什么还能直接建立连接?既然能够直连,自己部署的 VPS 又起到了什么作用?

顺着这个问题,我逐渐了解到了 P2P(Peer-to-Peer,点对点网络)技术,也把它与直播、BT 下载等常见应用联系了起来

一、什么是 P2P?

P2P,中文通常称为点对点网络

传统的 Client-Server(客户端-服务器)架构中,客户端通常需要向服务器请求数据,再由服务器返回结果

而 P2P 的核心思想是:网络中的节点可以直接与其他节点交换数据,不必始终依赖中心服务器完成数据传输

简单来说:

  • 传统架构:用户向服务器请求数据,服务器向用户提供数据
  • P2P 架构:用户既可以是数据的接收者,也可以是数据的提供者

服务器并不一定消失,而是可以从数据传输者转变为负责协调、发现和管理节点的角色

二、为什么没有公网 IP,也能实现直连?

这是我在部署 RustDesk 时最感兴趣的部分

假设:

  • 公司电脑:192.168.1.100
  • 家里电脑:192.168.0.100
  • VPS:xxx.xxx.xxx.xx

公司和家里的电脑都处于各自的局域网中,内网 IP 无法直接被互联网中的其他设备访问

这里涉及一个重要的网络技术:NAT(网络地址转换)

当内网设备主动访问互联网时,路由器会将内网地址和端口映射到外部网络地址和端口。这样,设备虽然没有独立公网 IP,仍然能够正常访问互联网

P2P 技术可以利用这种机制,通过 NAT 穿透(NAT Traversal)尝试建立两个内网设备之间的直接通信

以 RustDesk 为例,整个过程可以简单理解为:

  1. 公司电脑和家里电脑分别连接 VPS 上的 hbbs 服务
  2. hbbs 获取双方连接过来的公网出口地址、端口等网络信息
  3. 当一方请求连接另一方时,hbbs 协调双方交换连接信息
  4. 两台电脑按照协商结果尝试建立直接连接
  5. 如果 NAT 穿透成功,双方就可以直接传输数据

这里需要强调:公网 IP 并不是 VPS 分配给两台电脑的,而是从双方主动建立的网络连接中观察到的外部网络地址

这种技术并不是百分之百成功。如果网络环境限制较严格,例如某些对称型 NAT 或企业防火墙,就可能无法建立直连

三、RustDesk 中 VPS 到底起到了什么作用?

这次自建 RustDesk 服务端,我使用 Docker 部署了两个核心组件:

组件 主要作用
hbbs 设备注册、在线状态维护、连接协商和 NAT 穿透辅助
hbbr 直连失败时提供中继通信

它们承担的职责并不相同。

hbbs:负责帮助设备找到彼此

公司电脑和家里电脑都连接到 hbbs。需要建立远程连接时,hbbs 帮助双方交换必要的网络信息,协调连接建立

hbbr:负责在直连失败时传输数据

如果两台设备无法建立 P2P 连接,就可以通过 hbbr 转发远程桌面数据

这也解释了为什么客户端显示「加密直连(TCP)」时,远程桌面画面不需要经过 VPS

可以将整个过程分成三个阶段:

  • 设备上线:VPS 负责设备注册和在线状态维护
  • 建立连接:VPS 负责协调双方、辅助 NAT 穿透
  • 数据传输:直连成功后,双方直接通信;直连失败则使用中继

因此,P2P 并不是不需要服务器,而是让服务器不必始终参与实际数据传输

四、P2P 在直播领域的应用

理解 RustDesk 后,我又想到一个问题:

现在大型直播平台同时有成千上万甚至上百万观众,难道主播真的需要把实时视频数据直接传输给每一个观众吗?

当然不是。

查阅了资料后发现,目前主流直播平台通常采用 CDN(内容分发网络)进行视频分发

基本流程:

  1. 主播通过 OBS 等软件采集、编码视频
  2. 视频上传到平台的直播接入服务器
  3. 平台进行转码、封装和处理
  4. 视频被分发到多个 CDN 边缘节点
  5. 观众从距离自己较近的 CDN 节点获取视频

这种架构能够将主播的一份直播流分发给大量观众,避免所有观众直接访问同一台源服务器

不过,P2P 也可以应用于直播

例如 CDN + P2P 混合分发模式:

  • CDN 提供稳定的视频数据源
  • 观众获取视频片段后,可以继续分享给其他观众
  • 其他观众既可以从 CDN 下载,也可以从附近的节点获取视频片段

这样能够分担 CDN 的带宽压力

但纯 P2P 直播存在上传带宽不足、节点不稳定、延迟控制困难等问题,所以大型直播平台通常不会完全依赖纯 P2P

五、BT 下载:最经典的 P2P 应用之一

这也是我最熟悉的一种 P2P 应用

平时下载大型游戏、电影时,经常会接触到 BT 种子

BT(BitTorrent)是一种典型的 P2P 文件分发协议

与传统 HTTP 下载不同,BT 并不要求你从单一服务器获取完整文件,而是将文件拆分成许多片段,由多个节点共同提供

例如,一个 100 GB 的游戏安装包:

  • A 节点拥有文件的前几个片段
  • B 节点拥有另外几个片段
  • C 节点拥有其他片段

下载者可以同时从多个节点获取不同的数据片段

更有意思的是:下载者在获得部分文件片段后,也可以将这些片段上传给其他用户

也就是说,BT 下载中的用户往往同时承担下载者和上传者两个角色。

为什么下载人数越多,速度可能越快?

因为参与下载的人越多,网络中可能出现越多拥有不同文件片段的节点

如果这些节点具有充足的上传带宽,整个资源群(Swarm)的数据供应能力就会提高

这也是为什么一些热门游戏资源的 BT 下载速度可能非常快

但下载人数并不等于有效上传者数量

如果一个资源有 1000 个下载者,却只有一个上传带宽很低的做种者,那么下载速度仍然可能很慢。

BT 中有两个重要概念:

名称 含义
Seeder 已经拥有完整文件,并向其他节点上传数据的人
Leecher 正在下载文件,同时也可能上传已获得的数据的人

如果一个冷门资源没有任何节点持有你缺少的文件片段,即使能够找到 Tracker,也无法完成下载。

Tracker 和 DHT

那么 BT 节点如何找到彼此?

这里涉及两个重要机制:

  • Tracker:帮助下载者发现同一个资源群中的其他节点
  • DHT:分布式哈希表,可以在没有中心 Tracker 的情况下帮助节点发现其他节点

它们解决的是节点发现问题,而不是实际文件传输问题

这与 RustDesk 的 hbbs 有一定相似之处:都承担了帮助节点发现彼此、建立通信的职责,但实现方式和协议并不相同。

六、几种应用背后的共同思想

通过这次学习,我把几个看似不同的应用放在一起进行了对比:

应用 主要技术 核心作用
RustDesk P2P、NAT 穿透 两台设备直接远程通信
BT 下载 BitTorrent、DHT 多个节点共同分发文件
大型直播 CDN、部分场景使用 P2P 大规模分发实时视频
视频会议 WebRTC、P2P、SFU 低延迟实时音视频通信

它们并不一定采用完全相同的网络架构,但有一个共同的设计思想:

尽可能让网络中的节点参与数据交换,而不是让所有数据都必须经过一个中心服务器。

七、总结

这次 RustDesk 自建服务让我从一个实际问题出发,逐渐理解了 P2P 网络技术

最初我以为,两台没有公网 IP 的电脑不可能直接通信;后来才了解到,借助 NAT 穿透,两台设备可以尝试建立直接连接

也明白了 VPS 并不是一定要负责传输所有数据,它还可以承担设备发现、连接协商和备用中继等职责

再联系到直播和 BT 下载,就能发现 P2P 的应用其实非常广泛

它不仅解决了设备之间如何直接通信的问题,还让普通用户的设备成为网络资源的一部分

从某种意义上说:

传统网络更强调服务器向用户提供资源,而 P2P 让用户之间也能够直接提供资源、交换资源

这就是我对 P2P 技术最直观的理解

评论 0

登录后即可参与讨论。

还没有评论,欢迎登录后参与讨论。