Варіанти управління пропускною здатністю на спільному інтернет-з'єднанні


13

Приміщення:

Розташування в сільській місцевості, не так багато варіантів для високосмугового підключення до Інтернету. Найшвидший на сьогоднішній день - супутниковий Інтернет, але він дорогий (як обладнання, так і щомісячна вартість та має недоліки), тому кілька домогосподарств хотіли б поділитися ним.

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

Проблема:

Те, як зазвичай працює TCP, означає, що кожне TCP-з'єднання отримає більш-менш 1 / n наявної пропускної здатності, де n - кількість з'єднань. Отже, якщо одне домогосподарство / користувач створить безліч зв’язків, вони отримають більшу частку в загальному зв’язку. Це не особливо справедливо - при насиченому зв’язку кожне домогосподарство повинно отримувати рівну частку. З іншого боку, коли ніхто більше не використовує з'єднання, слід мати можливість використовувати повну пропускну здатність.

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

Що я до цього часу працював:

Найкраще місце для здійснення такої політики (для нижньої течії) було б на іншому кінці вузької труби, тобто у провайдера. Очевидно, що в цьому випадку це неможливо, тож було б добре якось наблизити його. Але як? Чи є маршрутизатори, які підтримують щось подібне? Чи можна налаштувати поле Linux або BSD для цього? Це не повинно бути кулезахисним - недоброзичливий TCP-сервер або агресивна служба UDP може, мабуть, обійти все, що я можу зробити в своєму кінці, - але це повинно працювати для загального випадку більшості трафіку, що складається з безлічі сумісних з RFC TCP-з'єднання.

Щоб було зрозуміло, я не говорю про пріоритетність конкретних додатків, а про агрегацію трафіку до / від конкретних пристроїв Ethernet або діапазону IP-адрес. Надання деякому трафіку більш високого пріоритету, ніж інший трафік, здається, добре підтримується, але ситуація менш зрозуміла, коли намагаються однаково розподілити пропускну здатність для класів трафіку.

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

Як я розумію, спосіб змусити TCP поводитись таким чином - це фактично імітувати трохи вужчу трубу, ніж це дійсно доступно, і штучно скидати пакети, щоб відмовитись. Тому я думаю, що було б досить просто дати всім рівно 3 Мбіт / с у наведеному вище прикладі, штучно скинувши зайві пакети. Це дійсно не ефективно використовує з'єднання, оскільки більшість часу є запасна ємність.

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

Відповіді:


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)

Не забудьте розглянути справи про відсутність хостів в Інтернеті.

Розділіть загальну пропускну здатність, але кількість підключених хостів. (12Mb для 1, 6Mb для 2, 4Mb для 3, 3Mb для 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

2

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


Я помічаю, що цей приклад стосується завантаження . В даний час я читаю свій шлях через розширений режим маршрутизації та управління трафіком Linux, який здається дещо перспективним, і, сподіваюся, дозволяю мені зрозуміти всі ці tcправила. Формування трафіку Linux, безумовно, виглядає перспективно.
pmdj

0

Установка, описана в /superuser//a/1210164/257859, робить саме так:

[...] черги розподіляють це обмеження BW рівномірно між усіма клієнтами локальної мережі (точні локальні IP-адреси).


1
Будь ласка, не публікуйте однакову відповідь на кілька запитань. Якщо однакова інформація дійсно відповідає на обидва запитання, то одне питання (як правило, нове) має бути закрите як дублікат іншого. Ви можете вказати це, проголосувавши, щоб закрити його як дублікат або, якщо у вас недостатньо репутації для цього, підняти прапор, щоб вказати, що це дублікат. В іншому випадку підгадуйте свою відповідь на це питання і не просто вставляйте однакову відповідь у декілька місць.
DavidPostill

@DavidPostill Я думав про те, щоб голосування було закрите як дублікат, але вагався, тому що це трирічне питання. Я навіть шукав meta.superuser і знайшов відповідне питання на meta.superuser.com/questions/3524/… . Прочитавши мета, я думаю, що ситуація складна (у мене є відповідь на два старі питання з достатньою дискусією в кожному), а залишення короткої відповіді на вказівник здається принаймні "непоганою". Я відкритий, щоб почути твої думки.
ndemou
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.