Что такое отдельный поток в Linux fq_codel?
Я создаю доказательство концепции дросселирования входящего трафика на терминале (клиенте):
eth0 -> ifb0 -> htb -> filter by ip -> htb rate -> fq_codel+ecn
У меня есть 2 источника ips для конкретной программы, которую я хочу активировать. Эта программа открывает кучу tcp-подключений (загружает, таким образом, проникает дроссель), и я бы хотел, чтобы оба ограничивали общую пропускную способность, которую он использует (выполнял), и имеют справедливое планирование между соединениями с одним и тем же IP-адресом (этот вопрос).
В конце есть 1 ведро со скоростью и 1 fq_codel
.
У меня есть работа, но у меня есть несколько вопросов:
- Конечно, кодер имеет отдельную очередь для протокола (tcp vs udp)?
- Есть ли в коделе отдельные очереди на исходный ip?
- Есть ли в коделе отдельная очередь для подключения tcp?
- Нужно ли вручную отделять/терять потоки?
В интернет-анализе поток потока данных "хэш 5-кортежей", вопрос в том, какие элементы пакета являются частями 5-кортежа? Включены ли как исходный, так и конечный порты?
Ответы
Ответ 1
Per http://mdh.diva-portal.org/smash/get/diva2:754020/FULLTEXT01.pdf (кандидатская диссертация):
Потоки разделяются путем хэширования значения 5-кортежей из пакета (по умолчанию это src/dest port/ip и protocol) вместе со случайным Число
Помимо бит по умолчанию, он очищается.
Ответ 2
Кажется, что и исходный, и конечный порты включены, по крайней мере, по умолчанию:
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)