最近,我正在将大文件上传到网站,这次上传占用了整个带宽,并使我的网络瘫痪。因此,我实现了每秒分块 1MB 的块,并且它工作正常,但现在我在想我是否可以使用流量控制来实现相同的效果并获得更好的结果。
我的问题是:流量控制是否如此智能,可以区分 www 浏览和 www 批量上传/下载大文件。
tc qdisc add dev imq0 root handle 1:0 htb default 666
tc class add dev imq0 parent 1:0 classid 1:1 htb rate 90000kbit ceil 90000kbit
tc class add dev imq0 parent 1:1 classid 1:888 htb rate 10000kbit ceil 40000kbit prio 0 # browse www traffic
tc class add dev imq0 parent 1:1 classid 1:666 htb rate 10000kbit ceil 40000kbit prio 1 # bulk www traffic
tc filter add dev imq0 protocol ip parent 1:1 prio 2 u32 match ip tos 0x08 0xff flowid 1:666 # bulk www traffic
tc filter add dev imq0 protocol ip parent 1:0 prio 2 u32 match ip sport 80 0xffff flowid 1:888 # http
tc filter add dev imq0 protocol ip parent 1:0 prio 2 u32 match ip sport 443 0xffff flowid 1:888 # https
这样的事情会起作用吗?(现在无法检查。)
答案1
您的解决方案依赖于 Web 浏览器的行为来相应地设置 IP ToS 字段。这仅在受信任的环境中才可依赖。
我可以轻松地在我的计算机上编写 mangle 规则,将所有 ToS 压缩为某个单一值,而您的 TC 规则将无法区分我的批量浏览。
此外,我不能确定所有浏览器和其他 http(s) 软件是否始终对相同的事物使用相同的 ToS。有很多这样的软件:wget 和其他下载器;网站镜像(wget 也可以做到这一点,但有专门的软件),它们不仅下载一些大文件,还下载所有页面必需品;许多浏览器,包括 Firefox、lynx、links、ie、edge、基于 chrome 的浏览器 - 它们都使用不同的引擎,可以显示不同的网络行为;与 REST 相关的内容,它们只是通过 http 来回发送小消息。在网络世界中,还有 Websocket 解决方案,它与您所了解的 http 完全不同。
因此,只有在您严格控制网络的情况下,依赖 ToS 才有用。
一般情况下,区别在于浏览使用短时间突发流量,而下载会填满通道容量。您可以设置相当低的平均 HTB 速度,这将对应于平均浏览和下载速度,同时保持桶大小(突发大小)足够大以容纳完整的网页。然后网页浏览将体验到快速(因为桶很大),但由于页面提取很少,因此有足够的时间为下一页补充桶。另一方面,下载将耗尽桶,并且不会有空闲时间来补充它,速度会达到您的限制。
答案2
许多流行的上传工具都提供了一种机制来限制传输所允许消耗的带宽量。
如果您要rsync
上传大文件,请使用以下--bwlimit
开关:
rsync --bwlimit=125k ...
如果您只是使用scp
,请使用-l
开关:
scp -l 125k ...
如果您使用wpu
,它也能识别-l
开关(也--limit-rate=
):
wput -l 125k ...
或者
wput --limit-rate=125k ...
如果您正在使用其他程序,请查阅man
您选择的上传器的页面,看看它是否提供类似的功能。