共享互联网连接的带宽管理选项

共享互联网连接的带宽管理选项

前提:

农村地区,高带宽互联网连接选项不多。目前最快的是卫星互联网,但价格昂贵(设备和月费均昂贵,并且存在延迟问题),因此多个家庭愿意共享它。

这本身很简单 - 为每个家庭设置一个带有子网的路由器(VLAN 或物理端口),阻止它们之间的流量,并配置调制解调器以路由到这些子网或设置双 NAT。

问题:

TCP 的正常工作方式意味着每个 TCP 连接将或多或少地获得可用带宽的 1/n,其中 n 是连接数。因此,如果一个家庭/用户创建大量连接,他们将获得更大份额的整体连接。这不太公平——在饱和的链接中,每个家庭应该获得平等的份额。另一方面,当没有其他人使用连接时,应该能够使用全部带宽。

例如,假设有 4 户人家共享 12Mbit/s 的下行连接。如果其中一户人家正在下载/流媒体/其他什么,他们应该能够使用完整的 12Mbit/s(或足够接近)。如果 2 户人家正在使用该连接,他们每户应该获得 6Mbit/s,无论其中一户人家下载 1 个文件而另一户人家下载 11 个文件。(没有任何带宽管理,在这种情况下每个文件的下载速度大约为 1Mbit/s)3 户人家每户获得 4Mbit/s,依此类推。

我目前的工作成果如下:

实施此类策略的最佳位置(对于下游)是在窄管道的另一端,即 ISP。显然,在这种情况下这是不可能的,因此最好能够以某种方式近似它。但是怎么做呢?是否有现成的路由器支持这样的功能?我可以配置 Linux 或 BSD 机箱来执行此操作吗?它不必是万无一失的 - 行为不当的 TCP 服务器或激进的 UDP 服务可能会绕过我这边可以执行的任何操作 - 但它应该适用于大多数流量由大量符合 RFC 的 TCP 连接组成的常见情况。

明确地说,我不是讨论优先处理特定应用程序,而是汇总往返于特定以太网设备或 IP 地址范围的流量。为某些流量赋予比其他流量更高的优先级似乎得到了很好的支持,但在尝试平等地为流量类别分配带宽时,情况就不那么明确了。

网络上有很多关于流量整形的写得不好/不加思索地重复/不了解的信息。路由器硬件的文档非常不具体,所以我似乎在原地打转。

据我所知,让 TCP 以这种方式运行的方法是模拟一个比实际可用的管道略窄的管道,并人为地丢弃数据包以使其后退。所以我认为,在上述示例中,通过人为丢弃任何额外的数据包,为每个人提供 3Mbit/s 的速度是相当简单的。这实际上并没有有效地利用连接,因为大多数时候都有空闲容量。

有没有办法实现我所要求的功能?我的做法是否错误?我(或者说问题中的家庭)愿意为此花钱 - 无论是价格适中的现成路由器/设备还是运行 Linux 或 BSD 发行版的通用机箱。

答案1

如果我要构建一些东西来解决这个问题,我会进行如下设置:

我们这里以 4 台计算机共享一个链接为例。网络形状如下:

{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops

假设您在 LAN2 中使用静态 IP 寻址:

Linux Box 192.168.1.1
Home 1    192.168.1.11
Home 2    192.168.1.12
Home 3    192.168.1.13
Home 4    192.168.1.14

我首先会编写一个小脚本,通过 ping 客户端并将结果写入某处来检测哪些客户端处于启动状态。“这留给读者练习”计算连接的主机总数(1-4)

请务必处理无主机在线的情况。

将总带宽除以连接的主机数。(1 为 12Mb,2 为 6Mb,3 为 4Mb,4 为 3Mb)

接下来使用 tc 和 HTB 算法来限制 WAN 端设备上每个地址的带宽。首先,创建根类:

DEV="eth0"
TC="/sbin/tc"
TOT_BW=12
$TC qdisc add dev $DEV root handle 1: htb default 99

然后,为每个“客户”添加一个类(这里例如有 3 个客户)

NB_CLT=3
CLT_BW=$(($TOT_BW/$NB_CLT))mbit
for i in seq $NB_CLT
do
    $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500
    $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \
     match ip dst 192.168.1.1$i/32 \
     match ip src [Router IP in LAN1]/32
done

(以上脚本完全未经测试,且存在输入错误)

现在,您仍然必须正确编写脚本,使其每分钟运行一次,并在每次新主机启动或关闭时更新存储桶/过滤器。

我希望这能为您指明正确的方向,祝你好运。

替代解决方案

在所有主机上安装本地 QoS 软件来限制其带宽。我个人使用 NetLimiter(非免费)

答案2

OpenWRT 似乎支持它,尽管我自己从未使用过它。你可以看看网络流量控制他们网站上的页面,尤其是第二个例子:使用 HTB 进行简单的带宽共享(又称流量整形)。这涉及对 qdisc 的简单调用,因此任何 Linux 机器都可以做到。

答案3

中描述的设置https://superuser.com/a/1210164/257859确实如此:

[...] 队列将有限的 BW 均匀地分配给所有 LAN 客户端(准确地说是 LAN IP)。

相关内容