根据Linux 高级路由和流量控制 HOWTO 的这一部分,我无法tc
限制计算机的网络速度。
路由器是摩托罗拉 SurfBoard 调制解调器,具有一些路由功能和防火墙。我想限制流量的机器是192.168.0.5,脚本也是从192.168.0.5运行的。
这是我对上面链接中的命令的改编/etc/NetworkManager/dispatcher.d/
:
#!/bin/sh -eu
# clear any previous queuing disciplines (qdisc)
tc qdisc del dev wlan0 root 2>/dev/null ||:
# add a cbq qdisc; see `man tc-cbq' for details
if [ $2 = up ]; then
# set to a 3mbit interface for more precise calculations
tc qdisc add dev wlan0 root handle 1: cbq avpkt 1000 \
bandwidth 3mbit
# leave 30KB (240kbps) to other machines in the network
tc class add dev wlan0 parent 1: classid 1:1 cbq \
rate 2832kbit allot 1500 prio 5 bounded isolated
# redirect all traffic on 192.168.0.5 to the previous class
tc filter add dev wlan0 parent 1: protocol ip prio 16 \
u32 match ip dst 192.168.0.5 flowid 1:1
# change the hashing algorithm every 10s to avoid collisions
tc qdisc add dev wlan0 parent 1:1 sfq perturb 10
fi
Run Code Online (Sandbox Code Playgroud)
问题是我尝试将2832kbit设置为非常小的测试值(如16kbit),但我仍然可以高速浏览网页。问题不在NetworkManager
,因为我正在手动测试脚本。
编辑:我发现通过更改dst 192.168.0.5
为src 192.168.0.5
,上传速度受到了可靠的限制,但我仍然没有想出如何使下载速度起作用,这对我来说是最重要的。
您无法限制目标计算机上的传入流量,因为它已经到达。
为了正确地做你想做的事,你需要把它tc
放到你的网关上。这可能不适合您,但这是方法。
入口流量只能受到监管,因为它会丢弃超过速度限制的数据包。这是低效的,因为您现在需要更多带宽才能再次接收相同的数据包。这有点粗略,因为 TCP 旨在通过在数据包丢失时减慢速度来处理流量丢失,但随着 TCP 扩展,您最终会不断变慢和变快,正如您最近的评论显示您正在经历的那样。
然而,有一种方法可以通过将“中间功能块设备”推入您的网络路径,使您的系统成为自身的网关。我建议阅读它,然后尝试进行入站速率限制。
请参阅Gentoo 站点上有关 INGRESS / EGRESS 整形/监管的“理论”讨论。