限制的不是带宽,而是 linux 中每秒的数据包数

Limit not bandwith, but packets per second in linux

子问题 #1

tc 及其所有 qdisc 是限制带宽的完美方法,但是 Linux 中有什么方法可以限制输出数据包的 pps 吗?

我为什么要问呢

通常您只考虑一种资源 - 带宽(每秒字节数),但是当某些应用程序开始生成大量小数据包时(例如对不同站点的 http GET 请求,其中包含相对较少的字节数) ) 然后可能 pps 将是资源。

子问题 #2

所以,我想将所有流量分成两组 - A 组具有小 pps 和带宽(高优先级),B 组具有大 pps 和低优先级。然后我想限制摘要(来自两个组)输出 pps,优先考虑来自组 A 的数据包。

P.S。当然,我想在这两个组之间共享公共频道。所以我不能只限制B,因为当A根本不使用通道时,B必须使用100%。

可能吗?怎么样?

好的,这是对这个问题的决定。 你可以这样使用iptables

sudo iptables -I OUTPUT 1  -m owner --uid-owner debian-tor -j NFQUEUE --queue-num 1
sudo iptables -A OUTPUT                                    -j NFQUEUE --queue-num 0

这会将所有 Tor 流量重定向到队列号 1,并将所有其他流量重定向到队列号 0。

下一步是编写 user-space 应用程序,它将从队列中读取数据包并发出判决 - 接受或丢弃。

Here is 对如何构建此类应用程序的出色描述

并且整个应用程序的 here is implementation of this app. Main partTScheduler::operator()

TVerdictAction Action;
   if(QueueNum != TorClass) {
      Action = TVerdictAction::Accept;
   } else {
      Action = CurrentRate > d->OverallRate ? TVerdictAction::Drop : TVerdictAction::Accept;
   }