TLDR; nysocks是基于kcp提供的 nodejs 上的 SOCKS5 代理工具,对丢包的网络环境有较好的效果。
Linode Tokyo 2, JP 机房的测试:
tcp 代理
nysocks(kcp + libuv) fast
前几个月看到了 kcp 和 kcptun,觉得很有意思。起初我判断如果要做一个代理工具的话,整体性能不会是最终瓶颈。于是便想用熟悉的 node (纯 js )一边学习 kcp,一边重新写一个代理工具。但最终在性能这块,实际上还是达不到可用的程度,主要有两点:
果然过于底层的应用对脚本来说还是太严苛了。于是我便考虑用 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 的定位。但整个项目比我一开始预想的大了太多,精力和经验有限,目前还有非常多可以优化、改进的点。
希望能对有需求的同学和需要类似实现参考的同学一点微小的帮助。
1
suikator 2017-12-10 14:46:20 +08:00
长宽除了 tcp 包基本都出不了境 用你这个能解决 udp 99%丢包的问题吗
|
3
ccsexyz 2017-12-10 15:17:07 +08:00
我觉得对于代理类的程序,js 的开发速度不一定能超过 c++
|
4
123s 2017-12-10 15:28:37 +08:00 via Android
厉害了
|
6
zuosiruan 2017-12-10 15:45:05 +08:00 via Android
牛逼🐮
|
7
oyyd OP @ccsexyz 我对 c/cpp 的经验不足。但抛开核心部分,像是日志,daemon,CLI 工具这些工具,用脚本写确实足够快,性能也不是问题。
|
8
qfdk 2017-12-10 16:25:51 +08:00 via iPhone
先尝后买了
|
9
silicaite 2017-12-10 19:41:05 +08:00
看起来不错哟....
|
10
gbin 2017-12-10 19:56:43 +08:00 via Android
厉害了,能智能分流不?
|
12
zj299792458 2017-12-10 20:41:06 +08:00 via iPhone
@oyyd 估计他说的是类似 PAC 这种服务
|
14
gbin 2017-12-11 13:45:25 +08:00
|
15
oyyd OP @gbin nysocks 里面默认开启了一个 pac 服务(默认开在 8090 端口),数据是 gfwlist 的一个副本
|