分享: 基于 kcp 写的 node 代理工具 nysocks

2017-12-10 14:37:19 +08:00
 oyyd

TLDR; nysocks是基于kcp提供的 nodejs 上的 SOCKS5 代理工具,对丢包的网络环境有较好的效果。

Linode Tokyo 2, JP 机房的测试:

tcp 代理

nysocks(kcp + libuv) fast

分享一些背景和过程和思考

前几个月看到了 kcp 和 kcptun,觉得很有意思。起初我判断如果要做一个代理工具的话,整体性能不会是最终瓶颈。于是便想用熟悉的 node (纯 js )一边学习 kcp,一边重新写一个代理工具。但最终在性能这块,实际上还是达不到可用的程度,主要有两点:

  1. node 中,v8 环境的 udp 调用,光是在本地收发 1MB 的数据都需要超过 80ms。虽然 node 在 buffer 处理上,对脚本而言已经做的很高效了,但在频繁的回调和协议解析和内容拼接上还是远远不够。
  2. node 8 之前的版本没办法设置 send/recv (虽然 libuv 是支持的),需要在操作系统上层面上利用 sysctl 增大 buffer 大小。

果然过于底层的应用对脚本来说还是太严苛了。于是我便考虑用 c/cpp 以 node-addon 的形式写底层的传输、加密解密部分,顶层还是用 node 做 SOCKS 和 tcp 部分加快开发速度。但我一开始还是担心,因为我知道对于对 c/cpp,v8 底层,libuv 不熟悉的话,写出来的 node-addon 性能往往还不如用纯 js 写的代码高。

好在之前看到了 Scott Frees 的 blog 和这本电子书 —— C++ and Node.js Integration(需付费)。实践证明,如果你有类似的需求的话,特别是在 c/cpp 层面进行非阻塞进程的操作及大量 buffer 在 c/cpp 和 v8 之前转换的这种场景,这本书中的内容是非常有效、实用的。

最终的结果还是让我自己满意的,c/cpp 部分满足了性能的需求,node 部分开发得足够快,也算是让自己找到了对 node-addons 的定位。但整个项目比我一开始预想的大了太多,精力和经验有限,目前还有非常多可以优化、改进的点。

希望能对有需求的同学和需要类似实现参考的同学一点微小的帮助。

3118 次点击
所在节点    分享创造
18 条回复
suikator
2017-12-10 14:46:20 +08:00
长宽除了 tcp 包基本都出不了境 用你这个能解决 udp 99%丢包的问题吗
t123yh
2017-12-10 15:06:08 +08:00
@suikator udp2raw
ccsexyz
2017-12-10 15:17:07 +08:00
我觉得对于代理类的程序,js 的开发速度不一定能超过 c++
123s
2017-12-10 15:28:37 +08:00
厉害了
oyyd
2017-12-10 15:41:10 +08:00
@suikator 丢包过大的情况当然无解
zuosiruan
2017-12-10 15:45:05 +08:00
牛逼🐮
oyyd
2017-12-10 15:46:54 +08:00
@ccsexyz 我对 c/cpp 的经验不足。但抛开核心部分,像是日志,daemon,CLI 工具这些工具,用脚本写确实足够快,性能也不是问题。
qfdk
2017-12-10 16:25:51 +08:00
先尝后买了
silicaite
2017-12-10 19:41:05 +08:00
看起来不错哟....
gbin
2017-12-10 19:56:43 +08:00
厉害了,能智能分流不?
oyyd
2017-12-10 20:21:34 +08:00
@gbin 分流具体指的是?
zj299792458
2017-12-10 20:41:06 +08:00
@oyyd 估计他说的是类似 PAC 这种服务
bao3
2017-12-11 09:29:38 +08:00
@gbin #10 分流这种事,操作系统层面就解决了,不必用额外的软件
gbin
2017-12-11 13:45:25 +08:00
@oyyd 分流就是 #12 说的 PAC。
@bao3 感谢指导,我现在通过 proxifier 可以实现想要的分流。请问一下 Linux 基于操作系统层面分流具体是怎么做?或者 Google 关键词?
oyyd
2017-12-11 14:31:03 +08:00
@gbin nysocks 里面默认开启了一个 pac 服务(默认开在 8090 端口),数据是 gfwlist 的一个副本
gbin
2017-12-11 14:41:52 +08:00
@oyyd tks.
vincentD
2017-12-11 14:58:03 +08:00
@oyyd 楼主,和你是相同的 Linode,tokyo2 jp 线路,目前是用的 kcptun 加速,这个速度会更快吗?
oyyd
2017-12-11 19:04:22 +08:00
@vincentD 没有实际对比过。我目前没有加 fec,如果有差别的话,应该会在是否开启 fec 上有较大的差别。(另外,linode 的这个 vps 主要是我用来测试的,我自己平常用韩国的一些 vps。)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/413494

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX