全新实现的 mTCP(nodejs) 使用多条 tcp 连接来提高 tcp 连接速度 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
FishBear
V2EX    分享创造

全新实现的 mTCP(nodejs) 使用多条 tcp 连接来提高 tcp 连接速度

  •  
  •   FishBear 2024-08-20 17:59:57 +08:00 1727 次点击
    这是一个创建于 416 天前的主题,其中的信息可能已经有所发展或是发生改变。

    link:https://github.com/FishOrBear/mTCP2

    概述

    mTCP 将多个 tcp 连接聚合成一个 tcp 连接,从而提高单 tcp 的速度.(在某些网络环境下有用,例如单 tcp 连接被 qos,而远端的服务端没有 qos,则可以使用).

    原理

     .---- 桥 1 ----. / \ 服务器 A --- mpclient -------桥 2 ------ mpserver --- 服务器 B \ / `---- 桥 3 ----` ref:https://github.com/greensea/mptunnel/blob/master/README.zh_CN.md 

    使用场景

    你必须要有一个服务器,然后你到那个服务器的速度单 tcp 有限制,但是那个服务器的单 tcp 没有限制.

    为什么写这个

    现有的要么不能满足我的需求,要么部署太麻烦了.

    特点

    1. 代码简单,核心 mTCP.js 代码包含注释只有 300 多行.
    2. 使用双工流实现了背压,合理控制了内存,并且连接能正常回收,不会内存泄漏.
    3. mtcp 内部自己接管连接池,不需要外部库,没有 node_modules,不需要 npm i
    4. mtcp 可以独立作为外部库使用,使用起来就和 net.Socket 一样.
    5. 因为增强了单线程的速度,所以在多线程 tcp 下,可能因为竞争关系,多线程的性能可能有略微下降.
    6. 如果连接因为网络问题被关闭,那么会自动使用另一个流.
    7. 可以使用多个出口地址(或者入口地址),实现多宽带聚合(或者备份).
    8. 可以简单修改代码,实现上下行流量分离,端口分离.

    使用

    1. 服务端(请编辑 remote.js 修改你的配置端口)
    node remote.js 
    1. 客户端(请编辑 client.js 修改你的配置端口)
    node client.js 

    常见问题

    1. 使用 jemalloc 避免 nodejs 内存碎片
    apt-get install -y libjemalloc-dev RUN echo "/usr/lib/x86_64-linux-gnu/libjemalloc.so.2" >> /etc/ld.so.preload 
    1. 使用 pm2 守护进程
    //mtcp.config.js module.exports = { /** * Application configuration section * http://pm2.keymetrics.io/docs/usage/application-declaration/ */ apps: [ { name: 'mtcp', script: './remote.js', args: "", autorestart: true, cron_restart: '0 6 * * *',//每天 6 点重启 watch: ["./"], // max_memory_restart: "300M", error_file: "./logs/mtcp_err.log", out_file: "./logs/mtp_out.log", time: true, log_date_format: "YYYY-MM-DD HH:mm Z", env: { "NODE_ENV": "production" } // node_args: ["--max_old_space_size=128", "--max_semi_space_size=4"], }, ] }; 

    性能测试

    没有 mTCP 单线程 tcp 20m/s 有 mTCP 情况下 连接数:5 20Mb/s ,164Mbps 93Mb/s ,745Mbps 36Mb/s ,293Mbps 44Mb/s ,358Mbps 54Mb/s ,435Mbps 62Mb/s ,499Mbps 68Mb/s ,546Mbps 66Mb/s ,531Mbps 61Mb/s ,489Mbps 86Mb/s ,689Mbps 106Mb/s ,853Mbps 38Mb/s ,305Mbps 13Mb/s ,106Mbps 28Mb/s ,226Mbps 连接数:4 15Mb/s ,121Mbps 67Mb/s ,537Mbps 72Mb/s ,583Mbps 75Mb/s ,602Mbps 61Mb/s ,495Mbps 60Mb/s ,480Mbps 79Mb/s ,635Mbps 76Mb/s ,614Mbps 62Mb/s ,500Mbps 49Mb/s ,396Mbps 62Mb/s ,499Mbps 26Mb/s ,211Mbps 连接数:3 14Mb/s ,114Mbps 54Mb/s ,432Mbps 56Mb/s ,450Mbps 56Mb/s ,448Mbps 59Mb/s ,472Mbps 56Mb/s ,453Mbps 56Mb/s ,451Mbps 56Mb/s ,452Mbps 59Mb/s ,479Mbps 55Mb/s ,440Mbps 62Mb/s ,497Mbps 32Mb/s ,262Mbps 58Mb/s ,468Mbps 56Mb/s ,450Mbps 

    参考(类似项目)

    1. https://github.com/wsmlby/mtcp (有问题,连接池太多,内存问题,出错)
    2. mptcp(不能加速)
    3. https://github.com/mtcp-stack/mtcp (部署好复杂)
    4. https://github.com/greensea/mptunnel (udp,udp 明显不大好 现在运营商 qos 了)
    3 条回复    2024-08-22 14:22:49 +08:00
    iqoo
        1
    iqoo  
       2024-08-21 15:01:18 +08:00
    盲猜是用来富强的- - 之前也写过一个类似的工具,同时维持多个连接聚合一个连接。
    FishBear
        2
    FishBear  
    OP
       2024-08-22 14:20:25 +08:00
    @iqoo 嗯 别的场景也可以使用
    iqoo
        3
    iqoo  
       2024-08-22 14:22:49 +08:00
    @FishBear 可以尝试随机多种协议,有些运营商可能对某些协议限制比较宽松
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2623 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:19 PVG 23:19 LAX 08:19 JFK 11:19
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86