Что такое отдельный поток в 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?
- я должен вручную разделить / пометить потоки?
В соответствии с идентификатором потока интернет-исследований "хэш 5-кортежа", вопрос заключается в том, какие элементы пакета являются частью 5-кортежа? Включены ли порты источника и назначения?
2 ответа
По http://mdh.diva-portal.org/smash/get/diva2:754020/FULLTEXT01.pdf (чья-то кандидатская диссертация):
Потоки разделяются путем хеширования 5-значного кортежа из пакета (по умолчанию это src / dest port / ip и protocol) вместе со случайным числом
Помимо бита по умолчанию, это понятно.
Похоже, порты источника и назначения включены, по крайней мере по умолчанию:
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)