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

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

  •  
  •   FishBear · 113 天前 · 1230 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       112 天前
    盲猜是用来富强的- - 之前也写过一个类似的工具,同时维持多个连接聚合一个连接。
    FishBear
        2
    FishBear  
    OP
       111 天前
    @iqoo 嗯 别的场景也可以使用
    iqoo
        3
    iqoo  
       111 天前
    @FishBear 可以尝试随机多种协议,有些运营商可能对某些协议限制比较宽松
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   865 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:12 · PVG 05:12 · LAX 13:12 · JFK 16:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.