自动TCP连接慢化(整形)

我想自动调整对应于已经传输的数据的带宽需求的TCP连接。

总结如下:“第一个Mbit以全带宽传输,当它达到10Mbit时,它逐渐下降到带宽的1%,并停留在那里”。

一个例子比1k词更好:

bw ^ | . . 100% | ******** . | . * . | . * . | . * . 1% | . .******** +----------------------------> Data transfered. 1Mbit . . 10Mbit 

我知道一个完整的stream量整形将会更好,因为它会允许突发和使用剩余的带宽,但是这个想法是特别自动地限制大数据传输,而不需要进一步的configuration。

我将如何在Linux主机上实现这个

更新:这不是直接显而易见的,但是数据计量器(上传和下载)是双向的,因为我没有精确的下载或上传。

HTB qdisc实现了突发的概念,这是你想要的 – 它以全硬件速率发送到“突发”参数中指定的数据量。 为了逐渐减less,你需要嵌套HTB类,也许你不想太过分地做,因为它大大增加了设置的复杂性。 但是Linuxstream量整形引擎本身是无状态的,它只是作用于数据包,而不是连接。 单独使用tcfilter,您只能根据IP / TCP标头区分数据包。

因此,如果您需要根据连接进行不同的分类,最直接的方法可能是使用iptables“–connbytes”匹配和一个数据包标记(-j MARK target)将连接的数据包推入正确的队列(快速/慢速)

请参阅LARTC howto和/或全面的“开源带宽解决scheme”白皮书的带宽pipe理的罗嗦部分以获取更多信息。

此外,如果您需要塑造上游和下游,请查看虚拟IMQ界面的实施 – 专门为此devise的。

我受到了@ wabbit解决scheme的启发,并设法解决了这个问题。 我在我的个人wiki中对此解决scheme进行了博客: https : //giki.wiki/@nubela/Software-Engineering/Per-Connection-Throttling

这是我用一个实际的shell脚本解决这个问题的方法:

 #!/bin/sh dev=eth0 ip_port=3002 rate_limit=512kbit rate_ceil=1024kbit htb_class=10 max_byte=10485760 if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi if [ "$1" = "enable" ]; then echo "enabling rate limits" tc qdisc del dev $dev root > /dev/null 2>&1 tc qdisc add dev $dev root handle 1: htb tc class add dev $dev parent 1: classid 1:$htb_class htb rate $rate_limit ceil $rate_ceil tc filter add dev $dev parent 1: prio 0 protocol ip handle $htb_class fw flowid 1:$htb_class #iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -j MARK --set-mark $htb_class # small packet is probably interactive or flow control iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m length --length 0:500 -j RETURN # small packet connections: multi purpose (don't harm since not maxed out) iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m connbytes --connbytes 0:250 --connbytes-dir both --connbytes-mode avgpkt -j RETURN #after 10 megabyte a connection is considered a download iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m connbytes --connbytes $max_byte: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark $htb_class iptables -t mangle -A OUTPUT -j RETURN elif [ "$1" = "disable" ]; then echo "disabling rate limits" tc qdisc del dev $dev root > /dev/null 2>&1 iptables -t mangle -F iptables -t mangle -X elif [ "$1" = "show" ]; then tc qdisc show dev $dev tc class show dev $dev tc filter show dev $dev iptables -t mangle -vnL INPUT iptables -t mangle -vnL OUTPUT else echo "invalid arg $1" fi