Что такое отдельный поток в 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)