求助, Mac 里怎么使用 Nodejs 或其他方法限制上传下载速度?

求助, Mac 里怎么使用 Nodejs 或其他方法限制上传下载速度?

Linux 里习惯用 wondershaper, 到 OS X 里不知道怎么办了, 按网上的敲了

sudo ipfw pipe 1 config bw 2000kbyte/s

没有一点效果, 下载速度仍然占满局域网,

请问有技巧可用不?

2 回复

在Mac(OS X)中,限制上传或下载速度可以通过多种方法实现,包括使用ipfw(IPv4防火墙)或者使用Node.js编写一个简单的代理服务器来实现。这里我将介绍如何使用Node.js的方法。

使用Node.js限制上传下载速度

你可以使用Node.js结合一些库来创建一个HTTP服务器或代理服务器,并在其中实现速度限制的功能。一个常用的库是http-proxy-middleware,它可以帮助你设置代理规则。另外,我们还需要一个可以限制速度的库,例如throttle

步骤 1: 安装必要的Node.js包

首先,确保你的系统上已经安装了Node.js。然后,在你的项目目录中初始化一个新的Node.js项目:

npm init -y

接着,安装http-proxy-middlewarethrottle包:

npm install http-proxy-middleware throttle

步骤 2: 编写Node.js脚本

接下来,编写一个简单的Node.js脚本来启动一个代理服务器,并配置上传/下载速度限制:

const http = require('http');
const { createProxyMiddleware } = require('http-proxy-middleware');
const Throttle = require('throttle');

const server = http.createServer((req, res) => {
    const proxy = createProxyMiddleware(req, res, {
        target: 'http://your-target-server.com', // 目标服务器地址
        changeOrigin: true,
        onProxyReq(proxyReq, req, res) {
            // 限制上传速度
            const throttleUpload = new Throttle(5 * 1024); // 限制为5KB/s
            proxyReq.pipe(throttleUpload).pipe(proxyReq);
        },
        onProxyRes(proxyRes, req, res) {
            // 限制下载速度
            const throttleDownload = new Throttle(5 * 1024); // 限制为5KB/s
            proxyRes.pipe(throttleDownload).pipe(res);
        }
    });

    proxy(req, res);
});

server.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
});

在这个例子中,我们创建了一个简单的HTTP服务器,它通过http-proxy-middleware将请求代理到指定的目标服务器。同时,我们使用throttle库来限制上传和下载的速度。

总结

这种方法的优点是你可以在不修改现有应用的情况下轻松地添加速度限制功能。缺点是它可能对性能有一些影响,特别是在高流量情况下。如果你需要更复杂的网络管理功能,可能需要考虑使用专门的网络管理工具或操作系统级别的解决方案。


在Mac中,你可以使用ipfwpfctl(较新的替代品)来限制网络速度。以下是一个使用pfctl的方法,因为它在现代版本的macOS中更为常用。

首先,确保你的系统支持pfctl。可以通过检查/etc/pf.conf文件是否存在来确认这一点。

使用 pfctl 限制网络速度

  1. 创建一个PF配置文件

    /etc/pf.anchors/目录下创建一个自定义的锚点文件,例如/etc/pf.anchors/local

    # /etc/pf.anchors/local
    block drop all
    pass in quick proto tcp from any to any port 80 keep state
    pass out quick proto tcp from any to any port 80 keep state
    
  2. 创建一个规则文件

    /etc/pf.conf文件中添加你的规则。如果你的文件不存在,可以创建一个新的。

    # /etc/pf.conf
    scrub-anchor "local/*"
    nat-anchor "local/*"
    rdr-anchor "local/*"
    dummynet-anchor "local/*"
    anchor "local/*"
    
    load anchor "local" from "/etc/pf.anchors/local"
    
  3. 设置限速规则

    /etc/pf.anchors/local中添加限速规则:

    # /etc/pf.anchors/local
    dummynet out on en0 all limit src-ip 192.168.1.0/24 bandwidth 500Kbit/s queue 50
    

    这个规则将限制从192.168.1.0/24子网到en0接口的所有出站流量的速度为500Kbit/s,并设置队列大小为50。

  4. 启用并加载PF

    打开终端并输入以下命令以启动并加载PF配置:

    sudo pfctl -f /etc/pf.conf -e
    
  5. 验证状态

    检查PF是否正在运行:

    sudo pfctl -s info
    

使用Node.js限制上传/下载速度

如果你希望在应用层通过Node.js来实现限速,可以使用throttle库来限制HTTP请求的速率。以下是一个简单的示例:

const http = require('http');
const throttle = require('throttle');

const server = http.createServer((req, res) => {
    const url = new URL(req.url, 'http://localhost:3000');
    const fileStream = fs.createReadStream(url.pathname);

    // 限制下载速度为 500 Kbps
    const throttledStream = throttle(fileStream, 500 * 1024); 

    res.writeHead(200, { 'Content-Type': 'application/octet-stream' });
    throttledStream.pipe(res);
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个例子中,我们使用了throttle库来限制下载速度为500Kbps。你需要先安装throttle库:

npm install throttle

以上是两种不同的方法,一种是在系统级别使用pfctl来限制所有流量的速度,另一种是在应用层面通过Node.js来限制特定应用的流量速度。

回到顶部