跳转至

R-VPN 性能优化计划

实现状态

阶段 功能 状态 位置
阶段 1 SplitRatchet 并发访问 ✅ 已实现 rvpn-core/src/crypto/ratchet.rs
阶段 2 缓冲区大小优化 ✅ 已实现 通道缓冲区:10,000 个槽位
阶段 3 客户端重连逻辑 ✅ 已实现 rvpn-client/src/tunnel.rs
阶段 4 二进制协议迁移 ✅ 已实现 rvpn-core/src/protocol/codec.rs
额外 连接池 ✅ 已实现 rvpn-server/src/handler.rs

原始架构瓶颈(已解决)

1. DoubleRatchet 锁竞争 ✅ 已修复

问题Arc<RwLock<DoubleRatchet>> 序列化了所有加密/解密操作。

解决方案:实现了 SplitRatchet,使用独立的 Arc<Mutex<SendingChain>>Arc<Mutex<ReceivingChain>>: - encrypt() 只锁定发送链 - decrypt() 只锁定接收链 - DH ratchet 操作仍需要两个锁(但发生频率较低)

结果:加密和解密操作真正的并发访问。

2. 缓冲区大小过小 ✅ 已修复

问题:有限的通道缓冲区大小导致背压。

解决方案:将通道缓冲区大小增加到 10,000 个槽位,以应对高吞吐量场景。

结果:更好地处理突发流量和大文件传输。

3. JSON 序列化开销 ✅ 已修复

问题:二进制数据在 JSON 中进行 Base64 编码,增加了约 33% 的开销。

解决方案:迁移到使用原始二进制编码的二进制协议。

结果:带宽减少约 30%,序列化更快。

4. 无连接复用 ✅ 已修复

问题:每个 HTTP 请求都创建一个新的代理连接。

解决方案:在服务器中实现了连接池。

结果:连接复用带来更好的性能。

5. 无客户端重连 ✅ 已修复

问题:当 WebSocket 断开时,客户端直接退出而不是重新连接。

解决方案:实现了自动重连功能,包括: - 清理过期连接 - 心跳机制 - 指数退避重试逻辑

结果:更好的用户体验,自动恢复连接。


性能基准测试

吞吐量测试

  • 通过代理下载大文件(100MB)
  • 结果:并发 ratchet 访问带来显著提升

并发测试

  • 加载包含多个资源的网站(YouTube、新闻网站)
  • 结果:多个并发连接下页面加载流畅

延迟测试

  • 首字节时间测量
  • 结果:由于二进制协议,延迟降低

重连测试

  1. 启动客户端和服务器
  2. 加载网页
  3. 终止服务器进程
  4. 重启服务器
  5. 结果:客户端重新连接并可以再次加载页面

备注

  • TLS 由 Caddy 反向代理处理,因此我们不需要在服务器中实现 TLS
  • Double Ratchet 协议需要严格的消息顺序 - 通过适当的链同步来维护
  • 客户端重连意味着重新进行 X3DH 握手和 Double Ratchet 初始化(新会话)