Ограничение трафика
Цели:
- Приоритизация потоков
- Честное распределение пропускной способности
- Резервирование канала
- Имитация reallife сети
- …
Задачи:
- Классификация потоков
- Bandwidth: очереди и работа с ними
- Учёт специфики протоколов
Строго говоря, это отдельные задачи.
Замечание: незачем ограничивать уже полученный трафик ⇒ на отправку.
PF
Базовая статья: PF: Packet Queueing and Prioritization
PriQ
- Линейная структура: общая труба → очереди с приоритетами
- Строгая приоритизация (+RR в рамках одного приоритета)
Пример:
Root Queue (2Mbps) Queue A (priority 1) Queue B (priority 2) Queue C (priority 3) Queue D (priority 3)
Области применения: emergency-трафик, обслуживающий трафик на загруженных каналах (например, пустые TCP ACK при скачивании; см. пояснения в конце раздела «Assigning Traffic to a Queue»
CBQ
Иерархические очереди. Аналогия: река с притоками («водная система»)
- BW очереди = ∑ BW подочередей
- borrow
- приоритет (только на случай нехватки родительского BW)
RED и ECN
TCP: саморегуляция путём выбрасывания пакета.
Проблема: переполнение очереди ⇒ рестарт почти всех TCP-соединений
Решение: выбрасывать пакеты заранее: чем полнее очередь, тем больше вероятность потери пакета
Проблема: ограничение трафика путём увеличения трафика?
Протокол ECN
Задание в /etc/pf.conf
Описание очередей:
altq on fxp0 cbq bandwidth 2Mb queue { std, ssh, ftp } queue std bandwidth 50% cbq(default) queue ssh bandwidth 25% { ssh_login, ssh_bulk } queue ssh_login bandwidth 25% priority 4 cbq(ecn) queue ssh_bulk bandwidth 75% cbq(ecn) queue ftp bandwidth 500Kb cbq(borrow red) … pass out on $oif from any to any tcp queue std pass out on $oif from any to any port 22 queue(ssh_bulk, ssh_login) pass out on $oif from any to any port 20 queue ftp
HFSC
Базовая статья: Hierarchical Fair Service Curve (HFSC). Quality of Service for FreeBSD and OpenBSD Иерархические очереди плюс:
- разделение обещанного (realtime) и допустимого (upperlimit) трафика
- задание кривой пропускания (скажем, чем дольше передача, тем ниже BPS)
- без приоритизации вообще
Linux TC (первая попытка)
Базовая статья Linux Advanced Routing & Traffic Control HOWTO
- Разделение МЭ и управления очередями.
- Модульный принцип:
Множество модулей: например, NetEm — аналог DummyNet для BSD; используется на интерфейсном уровне
Дублирование функций (см. tc-htb(8): «HTB is meant as a more understandable and intuitive replacement for the CBQ qdisc in Linux»
Ещё модули (далеко не все!): http://lartc.org/manpages