如何设置每个客户端的通用networking限制+ TCP确认的优先级

以下情况:

  • networkingA通过慢速连接连接到networkingB.
  • networkingA中的不同主机想要向networkingB中的主机发送stream量
  • networkingB中的主机向networkingA发送命令

该怎么办:

  • 允许networkingA中的主机发送平均0.3 MBit / s和最大0.5MBit / s的数据。 我想使用令牌桶。
  • 发送TCP确认,优先级从A到B.来自networkingB的命令将与TCP一起发送。 我不想阻止命令传输,那么使用洞牌的客户端就可以阻止A-> B的数据传输。

网关路由器是具有两个接口的Linux系统。 我发现我可以使用tc来configurationstream量整形。

我的命令:

sudo tc qdisc add dev eth0 handle 1: root tbf rate 300000 burst 500000 latency 1ms 

iperf的速度testing给了我265千比特/秒的结果。

问:如何设置正确的tc规则来限制每个客户端的stream量和优先级TCP ACK?

会有这么多要求妥善回答,以及这么多可能的暗示,我只是做一些假设,并提出一个解决scheme,你可以稍后修改。

您可以使用TCP标志和conntrack(在Linux内核中的连接机器)来查找哪些连接是B到A的TCP连接。 然后,您可以使用CONNMARK目标在连接机器上标记它们。 通过这种方式,使用-j CONNMARK --restore-mark目标,当此连接中的数据包在A到B的方向上时,它将被标记为100。

TC方面,我使用htb作为一个有类的QDISC。 如果stream量过大,HTB类将丢弃数据包。 fq_codel被用作队列。 fq_codel确实在每个类中组织队列。

根htb qdisc发送没有在类1:1000中标记的数据包。 标记的包将以1:100进行。 tc filter用于识别标记的100个数据包,并将它们发送到1:100类。

tc class用于设置限制带宽。

以下代码假设您的最大带宽是1Mb / s,您的networkingB接口是eth0,您的Anetworking是eth1,而您的层是以太网。

 # Spread connmark to mark iptables -t mangle -A POSTROUTING -o eth0 -j CONNMARK --restore-mark # New TCP connections from B to A : connmark 100 iptables -t mangle -A POSTROUTING -o eth1 -p tcp --syn -m state --state NEW -j CONNMARK --set-mark 100 # Interface : eth0, qdisc : htb, default leaf : 1000 tc qdisc add dev eth0 root handle 1:0 htb default 1000 # Interface eth0, parent branch node : 1:0, branch id : 1:10 tc class add dev eth0 parent 1:0 classid 1:10 htb rate 1000kbit ceil 1000kbit # CLASS - B to A TCP branch tc class add dev eth0 parent 1:10 classid 1:100 htb rate 700kbit ceil 1000kbit burst 5k prio 0 linklayer ethernet # QDISC - Queue tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel # FILTER - Filter tc filter add dev eth0 parent 1:0 protocol ip prio 0 handle 100 fw flowid 1:100 # CLASS - Default branch tc class add dev eth0 parent 1:10 classid 1:200 htb rate 300kbit ceil 500kbit burst 5k prio 7 linklayer ethernet # QDISC - default branch queue tc qdisc add dev eth0 parent 1:1000 handle 1010: fq_codel 

我可能不像B想要的那么清楚,问我任何你不明白的事情。