【免费下载链接】altersend
Send files directly between devices over the internet - no cloud storage, no size limits.
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 寻址原理:加入码只是「门牌号」
这是最精妙的设计之一:加入码本身永远不会在网络上暴露。
- 发送端每次分享生成一个随机 32 字节密钥,hex 编码后就是 64 位加入码;
- 两端都对加入码做 BLAKE2b 哈希,得到同一个discovery key(发现密钥);
- 双方以这个哈希值为「主题」加入 DHT——网络里能看到的只有哈希,反推不出加入码;
- 连接建立后还有话题认证:发送端下发随机 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.
相关推荐
Zeek AYIYA 隧道分析器实战指南:ayiya_ports 端口配置与 UDP 隧道解析原理
Zeek AYIYA 隧道分析器实战指南:ayiya_ports 端口配置与 UDP 隧道解析原理 本篇技术指南围绕 Zeek 内置的 AYIYA(Anythi
网络安全网络IDSZeek AYIYA 隧道协议分析器:UDP 端口配置、报文解析与隧道解封装原理
Zeek AYIYA 隧道协议分析器:UDP 端口配置、报文解析与隧道解封装原理 导读 本文围绕 Zeek 内置的 base/packet protocols/
网络安全网络IDSParlAI Chat Service 全解析:将对话模型接入 Messenger / 浏览器 / 终端 / WebSocket
ParlAI Chat Service 全解析:将对话模型接入 Messenger / 浏览器 / 终端 / WebSocket Chat service 是
NLP人工智能深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考