
В одном из комментариев к статье об ограничении полосы раздаваемого интернета был задан вопрос
Airport express с функцией airtunes, он же используется как роутер. Проблема в том, что если помимо аудиопотока какая-то прога начинает занимать канал (например, начинает синхронизироваться apple tv), то на музыку ширины не хватает, и она начинает прерываться. Может можно как-то заставить принудительно давать на нужный порт минимально необходимую скорость?
Попытаемся решить задачку.
Исходные данные:
Канал 802.11g (54 мегабита в сек в обе стороны в сумме в лётную погоду)
Необходимо выделить неприкосновенные 500 килобит в секунду
Номер порта: 3689
Решение номер раз, в лоб
Из всего канала выделим полосу, равную полной толщине минус необходимые 500 килобит и весь трафик, кроме airtunes, направим в трубу. Тогда музыкальный поток пойдет мимо трубы в оставшихся 500 килобитах.
Не забываем о sudo bash
ipfw add 5 set 1 pipe 10 tcp from any to any not 3689 via en1
ipfw add 5 set 1 pipe 10 udp from any to any via en1
ipfw pipe 10 config bw 50Mbit/s
Тут есть место для полевых испытаний. На практике необходимо будет поиграться с толщиной трубы, добиваясь достаточной-остаточной полосы для потока музыки. Кроме того, цифра 54 мегабита кажется утопической, 30 выглядит куда более правдоподобно. Полевые испытания помогут определить истину. А конфигурацию трубы можно менять на лету.
В терминах ipfw.conf вышеизложенное звучит как
add 5 set 1 pipe 10 tcp from any to any not 3689 via en1
add 5 set 1 pipe 10 udp from any to any via en1
pipe 10 config bw 50Mbit/s
Нам пришлось создать два правила, одно для tcp с указанием порта и одно для udp, т.к. для udp понятия порт не существует и указание номера порта без указания протокола неявно подразумевает tcp. Доля icmp мала настолько, что недостойна отдельного правила.
Мы поместили оба правила в один набор с номером 1 (set 1), поэтому временно остановить и возобновить процесс урезания можно командамиipfw set disable 1
ipfw set enable 1
а удалить все правила (а все они имеют одинаковый номер 5)
ipfw delete 5
ipfw pipe delete 10
В очередь, сукины дети...
Недостаток первого метода заметен невооруженным взглядом - даже когда музыка не нужна, полоса под неё выделяется. Попробуем другой способ, основанный на очередях и их весовых коэффициентах.
Для этого создадим ту же трубу 10, но на этот раз на всю толщину канала.
ipfw pipe 10 config bw 30Mbit/s
Теперь разделим трубу на очереди с разными приоритетами. Одну - с максимальным весом (100), другую - с минимальным (1).
ipfw queue 1 config pipe 10 weight 100
ipfw queue 2 config pipe 10 weight 1
Направим музыкальный поток в VIP очередь, остальное - во второстепенную.
ipfw add 5 set 1 queue 1 tcp from any to any 3689 via en1
ipfw add 5 set 1 queue 2 tcp from any to any not 3689 via en1
ipfw add 5 set 1 queue 2 udp from any to any via en1
Весовой коэффициент - это не процент, их сумма не обязательно должна равняться 100. Потоки очередей распределяются согласно весам, больше вес - больше внимания. В распределении участвуют только непустые очереди, таким образом в тишине очередь 2 получит всю трубу, не смотря на минимальный вес.
В приведенном рецепте есть и место для экспериментов на практике.
Ой.

6 коммент.:
весьма занятно! по-моему второе решение куда понятнее первого. или оно пожирает больше ресурсов процессора?
а не рассскажешь про механизмы QoS в DD-WRT (там несколько непонятных аббревиатур, и толком не объясняют чем один отличается от другого)
Ничего не знаю про DD-WRT, нужно смотреть на сайте-родине прошивки
Оромное спасибо за подробный ответ! Сейчас буду экспериментировать:)
там есть некие packet schedulers которые называются HTB и HTFC, и все равно вроде как приходится указывать ширину аплинка и даунлинка (работает первый метод?)
to redddis:
это из области линукса. Это там iptables и политики шейпинга, указанные и всякие CBQ в придачу
вся эта бадяга целиком называтся netfilter: можно загуглить и найти подробные доки на русском
к примеру - http://www.opennet.ru/base/net/adsl_bandwidth.txt.html
есть еще и софтина которая все то же умеет но через GUI http://www.hanynet.com/waterroof/
Отправить комментарий