====== Управление исходящим трафиком через обратную связь ======
Механизм обратной связи — дополнение к [[dpi:dpi_options:opt_bandwidth_mgmt:bandwidth_conf|HTB-полисеру абонента]]. Он ограничивает входящий трафик абонента не напрямую, а через сокращение исходящего.
===== Зачем это нужно =====
Ограничивать входящий трафик напрямую неэффективно с точки зрения экономии полосы: к моменту отбрасывания пакеты уже получены из интернет-канала оператора. Отброшенные пакеты отправитель передаёт повторно, и это создаёт лишнюю нагрузку на канал. TCP и часть UDP-протоколов со своим механизмом congestion control со временем подстраиваются под ограничение, но лишний трафик по каналу всё равно проходит.
Большинство прикладных протоколов работают по принципу «запрос — ответ»: абонент отправляет запрос (исходящий трафик) и получает ответ (входящий). Если сокращать полосу для запросов, уменьшается и объём ответов. Такой подход позволяет дополнительно сэкономить до 10% полосы канала оператора по сравнению с обычным полисингом.
===== Как это работает =====
В HTB-профиль абонента добавляется параметр ''htb_inbound_bw'':
htb_inbound_bw=rate <порог> ceil <максимум>
- Пока входящий трафик абонента ниже порога ''htb_inbound_bw rate'', исходящий трафик ограничен как обычно — значением ''ceil'' в ''htb_root''.
- Когда входящий трафик превышает порог, верхняя граница исходящего трафика (''htb_root ceil'') начинает уменьшаться.
- Величина уменьшения пропорциональна превышению: процент превышения считается по интервалу между ''htb_inbound_bw rate'' и ''htb_inbound_bw ceil'', и на тот же процент сокращается исходящий трафик.
- Исходящий трафик никогда не ограничивается сильнее, чем ''htb_root rate''.
- При уменьшении ''htb_root ceil'' классы трафика перераспределяют полосу между собой в соответствии со своими ''rate'' и ''ceil''.
===== Пример: тариф 10 Мбит/с с обратной связью =====
За основу возьмём пример 1 из раздела [[dpi:dpi_options:opt_bandwidth_mgmt:bandwidth_conf|]]: тариф 10 Мбит/с, торренты выделены в класс cs7 и ограничены 3 Мбит/с.
Добавим параметр ''htb_inbound_bw'' и зададим для корневых классов ''rate'' и ''ceil'':
# Обратная связь: порог 9 Мбит/с, максимум 10 Мбит/с входящего трафика
htb_inbound_bw=rate 9mbit ceil 10mbit
# Входящий трафик (к абоненту)
htb_inbound_root=rate 2mbit ceil 10mbit
htb_inbound_class0=rate 8bit ceil 10mbit
htb_inbound_class1=rate 8bit ceil 10mbit
htb_inbound_class2=rate 8bit ceil 10mbit
htb_inbound_class3=rate 8bit ceil 10mbit
htb_inbound_class4=rate 8bit ceil 10mbit
htb_inbound_class5=rate 8bit ceil 10mbit
htb_inbound_class6=rate 8bit ceil 10mbit
htb_inbound_class7=rate 1mbit ceil 3mbit
# Исходящий трафик (от абонента): ceil уменьшается до rate при превышении порога
htb_root=rate 2mbit ceil 10mbit
htb_class0=rate 8bit ceil 10mbit
htb_class1=rate 8bit ceil 10mbit
htb_class2=rate 8bit ceil 10mbit
htb_class3=rate 8bit ceil 10mbit
htb_class4=rate 8bit ceil 10mbit
htb_class5=rate 8bit ceil 10mbit
htb_class6=rate 8bit ceil 10mbit
htb_class7=rate 1mbit ceil 3mbit
В этом примере:
* пока входящий трафик абонента не превышает 9 Мбит/с, исходящий может занимать до 10 Мбит/с;
* при входящем трафике от 9 до 10 Мбит/с верхняя граница исходящего пропорционально снижается;
* исходящий трафик не ограничивается сильнее, чем до 2 Мбит/с (''htb_root rate'').
* Как и в любом HTB-профиле, необходимо описать все 8 классов.
* Сумма ''rate'' по классам должна быть меньше ''rate'' корневого класса.
Для полисинга общего и виртуального канала аналогичный механизм настраивается иначе, через ''ceil'' корневых классов: [[dpi:dpi_options:opt_shaping:shaping_settings|]].