Linux fq_codel 中的单独流程是什么?
What is a separate flow in Linux fq_codel?
我正在设置概念验证以限制终端(客户端)的入口流量:
eth0 -> ifb0 -> htb -> filter by ip -> htb rate -> fq_codel+ecn
我有 2 个源 ips 用于我想要限制的特定程序。有问题的程序打开了一堆 tcp 连接(下载,因此入口节流),我想限制它使用的总入口带宽(完成)并在连接到相同 ip 地址(这个问题)之间进行公平调度。
最后有 1 个附加费率的存储桶和 1 个 fq_codel
实例。
我可以正常使用,但我有一些问题:
- codel 肯定每个协议都有单独的队列(tcp vs udp)?
- codel 是否有每个源 ip 的单独队列?
- codel 是否对每个 tcp 连接有单独的队列?
- 我是否必须手动 separate/tag 流?
根据互联网研究流 ID 是 "hash of 5-tuple",问题是,数据包的哪些元素是 5 元组的一部分?是否包括源端口和目标端口?
似乎源端口和目标端口都包括在内,至少在默认情况下是这样:
http://lxr.free-electrons.com/source/net/core/flow_dissector.c#L655
655 /**
656 * __skb_get_hash: calculate a flow hash
657 * @skb: sk_buff to calculate flow hash from
658 *
659 * This function calculates a flow hash based on src/dst addresses
660 * and src/dst port numbers. Sets hash in skb to non-zero hash value
661 * on success, zero indicates no valid hash. Also, sets l4_hash in skb
662 * if hash is a canonical 4-tuple hash over transport ports.
663 */
664 void __skb_get_hash(struct sk_buff *skb)
根据 http://mdh.diva-portal.org/smash/get/diva2:754020/FULLTEXT01.pdf(某人的博士论文):
The flows are separated by hashing a 5-tuple value from the packet
(default is src/dest port/ip and protocol) together with a random
number
除了default位,很清楚
我正在设置概念验证以限制终端(客户端)的入口流量:
eth0 -> ifb0 -> htb -> filter by ip -> htb rate -> fq_codel+ecn
我有 2 个源 ips 用于我想要限制的特定程序。有问题的程序打开了一堆 tcp 连接(下载,因此入口节流),我想限制它使用的总入口带宽(完成)并在连接到相同 ip 地址(这个问题)之间进行公平调度。
最后有 1 个附加费率的存储桶和 1 个 fq_codel
实例。
我可以正常使用,但我有一些问题:
- codel 肯定每个协议都有单独的队列(tcp vs udp)?
- codel 是否有每个源 ip 的单独队列?
- codel 是否对每个 tcp 连接有单独的队列?
- 我是否必须手动 separate/tag 流?
根据互联网研究流 ID 是 "hash of 5-tuple",问题是,数据包的哪些元素是 5 元组的一部分?是否包括源端口和目标端口?
似乎源端口和目标端口都包括在内,至少在默认情况下是这样:
http://lxr.free-electrons.com/source/net/core/flow_dissector.c#L655
655 /**
656 * __skb_get_hash: calculate a flow hash
657 * @skb: sk_buff to calculate flow hash from
658 *
659 * This function calculates a flow hash based on src/dst addresses
660 * and src/dst port numbers. Sets hash in skb to non-zero hash value
661 * on success, zero indicates no valid hash. Also, sets l4_hash in skb
662 * if hash is a canonical 4-tuple hash over transport ports.
663 */
664 void __skb_get_hash(struct sk_buff *skb)
根据 http://mdh.diva-portal.org/smash/get/diva2:754020/FULLTEXT01.pdf(某人的博士论文):
The flows are separated by hashing a 5-tuple value from the packet (default is src/dest port/ip and protocol) together with a random number
除了default位,很清楚