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

95 天前
 FishBear

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 了)
1200 次点击
所在节点    分享创造
3 条回复
iqoo
94 天前
盲猜是用来富强的- - 之前也写过一个类似的工具,同时维持多个连接聚合一个连接。
FishBear
93 天前
@iqoo 嗯 别的场景也可以使用
iqoo
93 天前
@FishBear 可以尝试随机多种协议,有些运营商可能对某些协议限制比较宽松

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

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

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

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

© 2021 V2EX