☰
浏览器也能P2P?AlterSend Web接收端WebSocket隧道DHT原理全解析
2026/10/10 15:11:34 网站建设 项目流程

【免费下载链接】altersend

Send files directly between devices over the internet - no cloud storage, no size limits.

项目地址:https://gitcode.com/gh_mirrors/al/altersend
点击查看免费下载

AlterSend Web 接收端让你无需安装任何应用,直接在浏览器里接收朋友通过 P2P 传输的文件。它背后的关键,是一条WebSocket 隧道 DHT链路:浏览器无法直接说 UDP,于是 AlterSend 把 DHT 协议操作封装进 WebSocket 隧道,经由 dht-relay 服务器接入 Hyperswarm 分布式哈希表(DHT),再与发送端完成端到端加密直连。本文带你完整看懂这套「浏览器 P2P 接收」的原理。

一、浏览器接收端:打开链接即可收文件

桌面端或手机端发起分享后,AlterSend 会生成一个分享链接。接收方点开链接,进入 AlterSend Web 页面:粘贴(或直接携带)加入码,等待几秒,文件列表就出现了——文件不经过任何云端存储,直接从发送方的设备流式下载到浏览器。

整个接收端的体验由 App.tsx 组织:输入码、连接中、下载中、断线重连,几个屏幕状态来回切换;而真正干活的状态机在 useReceiveViewModel.ts 里。

二、为什么浏览器不能直接做 P2P?

AlterSend 的 P2P 网络构建在 Hyperswarm 之上,其核心是一个 Kademlia DHT。桌面端和手机端可以直接用 UDP 数据包与 DHT 节点通信,但浏览器有硬性限制:

  • 浏览器不能主动发起 UDP 连接(WebRTC 的复杂度对纯接收场景过重);
  • DHT 的探测、查找、中继握手都需要低层传输能力。

所以浏览器端必须「借道」:把 DHT 的所有操作隧进一条 WebSocket 长连接,由部署在公网的 hyperswarm-dht-relay 服务器代为转发 DHT 流量。

三、WebSocket 隧道:一条连接接入整个 DHT

隧道建立的代码集中在 relay.ts,核心只有三步:

1. 双中继竞速,选最快的连接

AlterSend 运营了两个 dht-relay 节点:法兰克福(relay.altersend.com)和新加坡(relay-sg.altersend.com)。fastestRelay()函数会同时向两个节点发起 WebSocket 连接,谁先握手成功就用谁,15 秒内都失败才报错。这样即使某个区域到某节点链路很差,用户也能秒级切到最优路径。

2. 把 WebSocket 包装成 DHT 节点

连接建立后,代码用new DHT(new Stream(true, socket), { custodial: false })把这条 WebSocket 流包装成一个完整的 DHT 节点实例。注意{ custodial: false }这个参数——它是后面「中继服务器看不见内容」的关键。

3. 15 次 DHT 查找,锁定发送端

findPeer()会向 DHT 发起最多 15 次lookup,每次间隔 1 秒。查到的不是发送端的地址,而是它的对端公钥——随后dht.connect(peer.publicKey)就能穿过隧道建立 Noise 加密连接。

四、DHT 寻址原理:加入码只是「门牌号」

这是最精妙的设计之一:加入码本身永远不会在网络上暴露。

  1. 发送端每次分享生成一个随机 32 字节密钥,hex 编码后就是 64 位加入码;
  2. 两端都对加入码做 BLAKE2b 哈希,得到同一个discovery key(发现密钥);
  3. 双方以这个哈希值为「主题」加入 DHT——网络里能看到的只有哈希,反推不出加入码;
  4. 连接建立后还有话题认证:发送端下发随机 challenge,接收端回复topicProof(加入码, nonce)哈希值(见 session.ts 与 orchestrator.ts)。证明持有真实加入码后,才释放文件列表。

也就是说,即使有人从网络上观察到 DHT 探测流量,也无法冒充接收者拿到文件。

五、web-relay 消息:告诉发送端「我在哪条隧道上」

浏览器端的 DHT 是「寄生」在某条特定 WebSocket 连接上的。发送端如果想把大文件的传输额度升级,需要知道接收端挂在哪个中继节点。

于是接收端在认证后会发一条web-relay控制消息,带上自己的隧道连接 ID(cid)和中继主机名(control-channel.ts)。发送端收到后调用 upgradeWebRelay.ts,通过 announce.ts 在altersend-pro通道上向该中继出示一个短期签名的额度令牌。中继只转发、不存储,整个升级过程加密完成。

文件随后经@altersend/drive分块引擎逐块流式写入浏览器,进度实时回传;单次传输的大小上限也不是写死的,而是从所在中继的/limits.json实时拉取(relay.ts 中的fetchRelayLimit)。

六、中继到底能看见什么?——几乎什么也看不见

层面浏览器接收端桌面/移动端的盲中继回退
寻址入口WebSocket → dht-relay(隧道 DHT)UDP 直连 DHT,失败后走盲中继
中继职责代理 DHT 流量配对双方并转发已加密的 UDX 流
数据可见性零(custodial: false,密钥在浏览器生成)零(只转发 Noise 加密字节流)

桌面端的盲中继列表也不是硬编码的:conf.ts 会从 DHT 上一份签名的可变记录(mutable record)里动态拉取中继列表,中继节点轮换无需发版;DHT 实例本身是全局共享、按租约释放的,见 dht.ts。完整设计背景可阅读 docs/architecture.md。

七、关键源码索引

想深挖实现,按这条链路读代码即可:

  • 隧道建立与中继竞速:apps/web/src/transfer/relay.ts
  • 总连接流程(寻址 → 握手 → 限额监听):apps/web/src/transfer/index.ts
  • 认证与 offer 等待:apps/web/src/transfer/session.ts
  • 接收端状态机:apps/web/src/useReceiveViewModel.ts
  • 发送端中继升级:packages/core/src/worklet/relay/
  • 架构总览:docs/architecture.md

一句话总结:AlterSend 用「WebSocket 隧道 DHT + 非托管中继 + 加入码哈希寻址 + 话题认证」这套组合拳,让浏览器这个最封闭的运行环境,也能安全地接入去中心化的 P2P 文件传输网络——接收方零安装,中继零可见,内容零落地。

【免费下载链接】altersend

Send files directly between devices over the internet - no cloud storage, no size limits.

项目地址:https://gitcode.com/gh_mirrors/al/altersend
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询