Ограничение скорости входящего трафика

12

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

Есть ли связь между медленным запуском TCP и ограничивающим скорость входящим трафиком? Можно ли использовать методы, описанные при медленном запуске, для искусственного ограничения скорости отправки пакетов отправителем?

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


Обновление: ответы до сих пор дали хороший обзор вопросов, которые я задавал, но я все еще не знаю, как менеджеры загрузки могут ограничивать входящий трафик, и, в частности, можно ли реализовать подобную стратегию на Linux-шлюз.

Ричард Келлер
источник
Free Download Manager, вероятно, использует свои собственные серверы загрузки, а торрент-клиенты в основном ограничивают количество подключений, которые они используют. Кроме того, вы смотрели на «QOS»?
DutchUncle
3
Большинство менеджеров загрузки просто ограничивают скорость отправки ACK, тем самым замедляя поток данных.
Крис С

Ответы:

12

Менеджеры закачек, скорее всего, работают так, как описано в документе « Ручеек» .

Процесс, использующий сокеты BSD, может выполнять свое собственное ограничение скорости. Для ограничения восходящего потока приложение может сделать это, просто ограничив скорость передачи данных в сокет. Точно так же для нижестоящего ограничения приложение может ограничить скорость данных, которые оно читает из сокета. Однако причина, по которой это работает, не сразу очевидна. Когда приложение игнорирует чтение некоторых данных из сокета, его буферы приема сокета заполняются. Это, в свою очередь, приведет к тому, что принимающий TCP будет объявлять меньшее окно получателя (rwnd), создавая обратное давление на базовое TCP-соединение, ограничивая тем самым его поток данных. В конечном итоге этот эффект «просачивания» достигает сквозного ограничения скорости. В зависимости от буферизации на всех уровнях сетевого стека этот эффект может занять некоторое время для распространения.

Если вы время от времени необходимы ограничение по скорости одной программы в системе UNIX, простое решение струйка . Реальное формирование трафика, как вы выполняете на шлюзе, может быть сделано с помощью tc. Это описано в главе 9. Дисциплины очереди для управления полосой пропускания в Linux Advanced Houting и Traffic Control HOWTO.

Sciurus
источник
Отличный ответ, именно то, что я искал. Спасибо, щедрость идет к тебе.
Ричард Келлер
4

В случае модема 56k по сравнению с линией DSl 4 Мбит / с, (как правило) нет никакой разницы в скорости, это просто разница в скорости канала.

Причина, по которой трудно сформировать входящий трафик, заключается в том, что в среде передачи нет буфера. Вы либо принимаете входящие биты, либо они теряются. Для трафика, который собирается покинуть интерфейс, вы можете буферизовать и переупорядочивать пакеты столько, сколько хотите (или, по крайней мере, до доступной буферной памяти в устройстве).

Для протоколов, у которых есть слой поверх TCP (я не знаю, имеет ли это место для торрентов), это было бы просто вопросом расстановки запросов на получение дополнительных данных. В противном случае приложение должно будет обмениваться данными с ОС, чтобы задерживать ACK-пакеты. Большинство протоколов, основанных на UDP, по необходимости должны иметь логику ACK / resend в протоколе, специфичном для приложения, поэтому в этот момент их граничит с тривиальным темпом.

Одним из возможных путей может быть формирование трафика из Интернета на стороне LAN вашего DSL-маршрутизатора, поскольку в этот момент вы будете формировать выходной порт.

Vatine
источник
3

Я не могу ответить, почему вы не нашли каких-либо решений, которые бы позволяли формировать входящие данные (и не знали ничего из головы), но относительно того, как отправитель знает, как быстро получатель может получать данные:

Базовый дизайн TCP / IP заключается в том, что для каждого пакета, отправляемого источником в пункт назначения, он должен ждать, пока адресат ответит (с ACKпакетом), сообщая, что он получил пакет.

Таким образом, если у вас есть отправитель 4 Мбит / с и получатель 56 Кбит / с, то отправитель должен сидеть и ждать между отправкой пакетов, чтобы получатель ответил на каждый пакет (Есть некоторые технические детали, чтобы уменьшить эти издержки, но предпосылка все еще держится на абстрактном уровень).

Так что же происходит, если отправитель уже отправляет данные со скоростью 56 Кбит / с, а затем пытается отправить немного больше?

Пакет теряется. (Ну, потенциально в очереди в буфере коммутатора, но когда он заполняется, пакет теряется). Поскольку пакет потерян, получатель никогда не получит его и, следовательно, никогда не отправит ACKпакет. Поскольку отправитель никогда не получает этот ACKпакет (потому что он никогда не был отправлен, но он также может быть потерян или может произойти сбой в сети), отправителю необходимо повторно отправить дополнительный пакет. Он сидит и пытается переслать пакет, пока он не пройдет и ACKответ не вернется к нему.

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

Дарт Андроид
источник
1

Вы можете сделать это с помощью интерфейса ifb.

С помощью интерфейса ifb вы можете направить входной поток eth0 (или любой другой) к выходу в ifb0 (например) и применить там правила ограничения.

Проверьте этот URL-адрес Linux Foundation: http://www.linuxfoundation.org/collaborate/workgroups/networking/ifb

И это сценарии, которые ограничивают входящие и исходящие события: https://github.com/rfrail3/misc/blob/master/tc/traffic-control.sh

Рикардо Хрупкий
источник
0

Проверьте чудеса: http://lartc.org/wondershaper/

Что касается входящего трафика:

This is slightly trickier as we can't really influence how fast the internet
ships us data. We can however drop packets that are coming in too fast,
which causes TCP/IP to slow down to just the rate we want. Because we don't
want to drop traffic unnecessarily, we configure a 'burst' size we allow at
higher speed.

Now, once we have done this, we have eliminated the downstream queue totally
(except for short bursts), and gain the ability to manage the upstream queue
with all the power Linux offers.
dmourati
источник
-2

использовать UFW (несложная противопожарная стена) http://ubuntuforums.org/showthread.php?t=1260812

Этот поток показывает простой пример, по умолчанию IP-адреса с 6 попаданиями в течение 30 секунд запрещены:

sudo ufw limit ssh/tcp

Также более «продвинутая» команда с указанными значениями времени и количества посещений.

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

TonsOfFun111
источник
1
Это действительно не имеет ничего общего с вопросом.
3моло