V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
oyyd
V2EX  ›  分享创造

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

  •  1
     
  •   oyyd ·
    oyyd · 2017-12-10 14:37:19 +08:00 · 3314 次点击
    这是一个创建于 2544 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    Linode Tokyo 2, JP 机房的测试:

    tcp 代理

    tcp

    nysocks(kcp + libuv) fast

    nysocks fast mode

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

    前几个月看到了 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 的定位。但整个项目比我一开始预想的大了太多,精力和经验有限,目前还有非常多可以优化、改进的点。

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

    • 整个项目大量参考了 kcptun 和一些非常流行的代理工具,但实现上难以完全保持一直(工作量大)。
    • 另外,我知道 nysocks 这个名称和kneesocks接近。
    18 条回复    2017-12-11 19:04:22 +08:00
    suikator
        1
    suikator  
       2017-12-10 14:46:20 +08:00
    长宽除了 tcp 包基本都出不了境 用你这个能解决 udp 99%丢包的问题吗
    t123yh
        2
    t123yh  
       2017-12-10 15:06:08 +08:00 via Android   ❤️ 1
    @suikator udp2raw
    ccsexyz
        3
    ccsexyz  
       2017-12-10 15:17:07 +08:00
    我觉得对于代理类的程序,js 的开发速度不一定能超过 c++
    123s
        4
    123s  
       2017-12-10 15:28:37 +08:00 via Android
    厉害了
    oyyd
        5
    oyyd  
    OP
       2017-12-10 15:41:10 +08:00   ❤️ 1
    @suikator 丢包过大的情况当然无解
    zuosiruan
        6
    zuosiruan  
       2017-12-10 15:45:05 +08:00 via Android
    牛逼🐮
    oyyd
        7
    oyyd  
    OP
       2017-12-10 15:46:54 +08:00
    @ccsexyz 我对 c/cpp 的经验不足。但抛开核心部分,像是日志,daemon,CLI 工具这些工具,用脚本写确实足够快,性能也不是问题。
    qfdk
        8
    qfdk  
       2017-12-10 16:25:51 +08:00 via iPhone
    先尝后买了
    silicaite
        9
    silicaite  
       2017-12-10 19:41:05 +08:00
    看起来不错哟....
    gbin
        10
    gbin  
       2017-12-10 19:56:43 +08:00 via Android
    厉害了,能智能分流不?
    oyyd
        11
    oyyd  
    OP
       2017-12-10 20:21:34 +08:00
    @gbin 分流具体指的是?
    zj299792458
        12
    zj299792458  
       2017-12-10 20:41:06 +08:00 via iPhone
    @oyyd 估计他说的是类似 PAC 这种服务
    bao3
        13
    bao3  
       2017-12-11 09:29:38 +08:00 via iPhone
    @gbin #10 分流这种事,操作系统层面就解决了,不必用额外的软件
    gbin
        14
    gbin  
       2017-12-11 13:45:25 +08:00
    @oyyd 分流就是 #12 说的 PAC。
    @bao3 感谢指导,我现在通过 proxifier 可以实现想要的分流。请问一下 Linux 基于操作系统层面分流具体是怎么做?或者 Google 关键词?
    oyyd
        15
    oyyd  
    OP
       2017-12-11 14:31:03 +08:00
    @gbin nysocks 里面默认开启了一个 pac 服务(默认开在 8090 端口),数据是 gfwlist 的一个副本
    gbin
        16
    gbin  
       2017-12-11 14:41:52 +08:00 via Android
    @oyyd tks.
    vincentD
        17
    vincentD  
       2017-12-11 14:58:03 +08:00
    @oyyd 楼主,和你是相同的 Linode,tokyo2 jp 线路,目前是用的 kcptun 加速,这个速度会更快吗?
    oyyd
        18
    oyyd  
    OP
       2017-12-11 19:04:22 +08:00
    @vincentD 没有实际对比过。我目前没有加 fec,如果有差别的话,应该会在是否开启 fec 上有较大的差别。(另外,linode 的这个 vps 主要是我用来测试的,我自己平常用韩国的一些 vps。)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:05 · PVG 05:05 · LAX 13:05 · JFK 16:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.