Варианты управления пропускной способностью в общем интернет-соединении

13

Предпосылка:

Сельское местоположение, не так много вариантов для высокоскоростного подключения к Интернету. Самым быстрым на сегодняшний день является спутниковый Интернет, но он дорогой (как оборудование, так и месячная стоимость, и имеет недостатки по времени ожидания), поэтому многие домохозяйства хотели бы поделиться им.

Само по себе это просто: настройте маршрутизатор с подсетью для каждого домашнего хозяйства (VLAN или физические порты), заблокируйте трафик между ними и настройте модем для маршрутизации в эти подсети или настройте двойной NAT.

Проблема:

То, как обычно работает TCP, означает, что каждое TCP-соединение будет более или менее получать 1 / n доступной пропускной способности, где n - количество соединений. Поэтому, если одно домохозяйство / пользователь создает много соединений, они получат большую долю от общего количества соединений. Это не особенно справедливо - с насыщенной связью каждая семья должна получить равную долю. С другой стороны, когда никто не использует соединение, должна быть возможность использовать полную пропускную способность.

Например, скажем, есть 4 домохозяйства, использующие соединение со скоростью 12 Мбит / с. Если один из них загружает / передает / что-то еще, он должен иметь возможность использовать все 12 Мбит / с (или достаточно близко). Если 2 домохозяйства используют соединение, они должны получать 6 Мбит / с каждое, независимо от того, загружает ли одно домохозяйство 1 файл, а другое 11. (без какого-либо управления пропускной способностью каждый файл будет загружаться со скоростью примерно 1 Мбит / с в этом случае) 3 домохозяйства. получить 4Mbit / s каждый и так далее.

Что я разработал до сих пор:

Лучшее место для реализации подобной политики (для нисходящего потока) было бы на другом конце узкого канала, т. Е. У провайдера. Очевидно, что в этом случае это невозможно, поэтому было бы хорошо иметь возможность как-то приблизиться к нему. Но как? Существуют ли готовые маршрутизаторы, которые поддерживают что-то подобное? Могу ли я настроить Linux или BSD box для этого? Это не должно быть пуленепробиваемым - ненадлежащее поведение TCP-сервера или агрессивная служба UDP могут предположительно обойти все, что я могу сделать на своем конце - но это должно работать для общего случая большей части трафика, состоящего из большого количества RFC-совместимых TCP соединения.

Чтобы было ясно, я не говорю о приоритезации определенных приложений, а скорее о совокупном трафике к / от определенных устройств Ethernet или диапазонов IP-адресов. Предоставление некоторому трафику более высокого приоритета, чем другому трафику, кажется хорошо поддерживаемым, но ситуация менее ясна при попытке равномерно распределить пропускную способность для классов трафика.

В Интернете есть много плохо написанной / бездумно отрыгнутой / иным образом неинформированной информации о формировании трафика. Документация по аппаратному обеспечению маршрутизатора ужасно неопределенная, поэтому я, кажется, бегаю кругами.

Насколько я понимаю, способ заставить TCP вести себя таким образом - по сути моделировать немного более узкий канал, чем он есть на самом деле, и искусственно отбрасывать пакеты, чтобы заставить его отступить. Поэтому я думаю, что было бы довольно просто дать каждому ровно 3 Мбит / с в приведенном выше примере, искусственно отбрасывая любые дополнительные пакеты. Это на самом деле не использует соединение эффективно, так как большую часть времени есть запасная емкость.

Есть ли способ сделать то, что я спрашиваю? Я что-то не так делаю? Я (или, скорее, домохозяйства в вопросах) желаю потратить деньги на это - будь то стандартный маршрутизатор / устройство по умеренной цене или универсальный комплект для запуска дистрибутива Linux или BSD.

pmdj
источник

Ответы:

4

Если бы я должен был что-то построить для решения этой проблемы, я бы настроил это:

Здесь мы собираемся взять ваш пример 4 компьютеров с одной ссылкой. Сеть будет иметь такую ​​форму:

{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops

Допустим, вы используете статическую IP-адресацию в LAN2:

Linux Box 192.168.1.1
Home 1    192.168.1.11
Home 2    192.168.1.12
Home 3    192.168.1.13
Home 4    192.168.1.14

Сначала я написал бы небольшой скрипт, чтобы определить, какие клиенты работают, проверяя их и записывая результат где-нибудь. «Это оставлено в качестве упражнения для читателя». Рассчитайте общее количество подключенных хостов (1-4).

Обязательно разберитесь со случаем отсутствия хостов онлайн.

Разделите общую полосу пропускания, но количество подключенных хостов. (12 МБ для 1, 6 МБ для 2, 4 МБ для 3, 3 МБ для 4)

Затем используйте tc с алгоритмом HTB, чтобы ограничить пропускную способность каждого адреса на устройстве на стороне WAN. Сначала создайте корневой класс:

DEV="eth0"
TC="/sbin/tc"
TOT_BW=12
$TC qdisc add dev $DEV root handle 1: htb default 99

Затем добавьте класс для каждого «клиента» (здесь, например, 3 клиента)

NB_CLT=3
CLT_BW=$(($TOT_BW/$NB_CLT))mbit
for i in seq $NB_CLT
do
    $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500
    $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \
     match ip dst 192.168.1.1$i/32 \
     match ip src [Router IP in LAN1]/32
done

(приведенный выше скрипт полностью не протестирован и НЕ печатает без ошибок)

Теперь вам все еще нужно правильно написать скрипт, который будет запускаться каждую минуту, и обновлять блоки / фильтры каждый раз, когда новый хост поднимается или опускается.

Я надеюсь, что это укажет вам правильное направление, удачи.

Альтернативное решение

Установите локальное программное обеспечение QoS на всех хостах, чтобы ограничить их пропускную способность. Я Personnaly использовать NetLimiter (не бесплатно)

mveroone
источник
Проблема с моим подходом заключается в том, что каждый работающий хост уменьшает пропускную способность другого, даже если они не используют всю свою долю. Но разработать что-то, что заставляет делиться только тогда, когда спрос высок ... сложно.
Mveroone
2

OpenWRT, кажется, поддерживает это, хотя я никогда не использовал это непосредственно. Вы можете взглянуть на страницу управления сетевым трафиком на их веб-сайте, и особенно на второй пример: простое простое разделение полосы пропускания (иначе говоря, формирование трафика) с HTB . Это включает в себя простые вызовы qdisc, так что любой Linux-бокс может это сделать.

user2313067
источник
Я заметил, что этот пример для загрузки . В настоящее время я читаю свой путь по HOWTO по Advanced Routing & Traffic Control в Linux, который кажется довольно многообещающим и, надеюсь, позволит мне разобраться во всех этих tcправилах. Формирователь трафика Linux, безусловно, выглядит многообещающе.
pmdj
0

Настройка, описанная в /superuser//a/1210164/257859, делает именно это:

[...] очереди распределяют этот ограниченный BW равномерно между всеми клиентами LAN (точнее, IP-адресами LAN).

ndemou
источник
1
Пожалуйста, не размещайте один и тот же ответ на несколько вопросов. Если одна и та же информация действительно отвечает на оба вопроса, то один вопрос (обычно более новый) следует закрыть как дубликат другого. Вы можете указать это путем голосования, чтобы закрыть его как дубликат или, если у вас недостаточно репутации для этого, поднять флаг, чтобы указать, что это дубликат. В противном случае настройте свой ответ на этот вопрос, а не просто вставляйте один и тот же ответ в нескольких местах.
Дэвид Постилл
@DavidPostill Я думал о голосовании, чтобы закрыть как дубликат, но колебался, потому что это 3-летний вопрос. Я даже искал meta.superuser и нашел соответствующий вопрос на meta.superuser.com/questions/3524/… . После прочтения мета я думаю, что ситуация сложная (у меня есть ответ на два старых вопроса с достаточным количеством обсуждений в каждом), и оставить краткий указатель ответа кажется, по крайней мере, «неплохо». Я открыт, чтобы услышать ваши мысли, хотя.
ndemou