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

10390
pmdj

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

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

Само по себе это просто: настройте маршрутизатор с подсетью для каждого домашнего хозяйства (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.

13

3 ответа на вопрос

4
mveroone

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

Здесь мы собираемся взять ваш пример 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 на всех хостах, чтобы ограничить их пропускную способность. Я персонально использую NetLimiter (не бесплатно)

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

OpenWRT does seem to support it, though I have never used it myself. You can take a look at the Network Traffic Control page on their website, and especially the second example: plain simple bandwidth sharing (aka traffic shaping) with HTB. This involves simple calls to qdisc, so any Linux box could do it.

Я заметил, что этот пример для стороны * upload *. В настоящее время я читаю свой путь через [Linux Advanced Routing & Traffic Control HOWTO] (http://www.lartc.org/howto/), который кажется несколько многообещающим и, надеюсь, позволит мне разобраться во всех этих `tc` правила. Формирователь трафика Linux, безусловно, выглядит многообещающе. pmdj 11 лет назад 0
0
ndemou

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

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

Пожалуйста, не размещайте один и тот же ответ на несколько вопросов. Если одна и та же информация действительно отвечает на оба вопроса, то один вопрос (обычно новый) следует закрыть как дубликат другого. Вы можете указать это, [проголосовав, чтобы закрыть его как дубликат] (https://superuser.com/help/privileges/close-questions) или, если у вас недостаточно репутации, [поднять флаг] ( https://superuser.com/help/privileges/flag-posts), чтобы указать, что это дубликат. В противном случае настройте свой ответ на этот вопрос, а не просто вставляйте один и тот же ответ в нескольких местах. DavidPostill 7 лет назад 1
@DavidPostill Я думал о голосовании, чтобы закрыть как дубликат, но колебался, потому что это 3-летний вопрос. Я даже искал meta.superuser и нашел соответствующий вопрос по адресу https://meta.superuser.com/questions/3524/how-can-we-take-care-of-our-old-duplicates. После прочтения мета я думаю, что ситуация сложная (у меня есть ответ на два старых вопроса с достаточным количеством обсуждений в каждом), и оставить краткий указатель ответа кажется, по крайней мере, «неплохо». Я открыт, чтобы услышать ваши мысли, хотя. ndemou 7 лет назад 0

Похожие вопросы