Я никогда не понимал, можно ли ограничить входящий трафик. Я понимаю, что не существует прямого метода, с помощью которого можно было бы контролировать скорость отправки пакетов удаленным сервером (если вы не контролируете обе конечные точки), но принимая во внимание это ограничение, как именно менеджеры загрузки позволяют мне успешно устанавливать ограничения скорости загрузки ?
Есть ли связь между медленным запуском TCP и ограничивающим скорость входящим трафиком? Можно ли использовать методы, описанные при медленном запуске, для искусственного ограничения скорости отправки пакетов отправителем?
В качестве дополнительного соображения следует отметить, что сервер, на котором я хотел бы реализовать формирование трафика, устанавливает само соединение PPPoE и действует как маршрутизатор для остальной части сети.
Обновление: ответы до сих пор дали хороший обзор вопросов, которые я задавал, но я все еще не знаю, как менеджеры загрузки могут ограничивать входящий трафик, и, в частности, можно ли реализовать подобную стратегию на Linux-шлюз.
источник
Ответы:
Менеджеры закачек, скорее всего, работают так, как описано в документе « Ручеек» .
Если вы время от времени необходимы ограничение по скорости одной программы в системе UNIX, простое решение струйка . Реальное формирование трафика, как вы выполняете на шлюзе, может быть сделано с помощью
tc
. Это описано в главе 9. Дисциплины очереди для управления полосой пропускания в Linux Advanced Houting и Traffic Control HOWTO.источник
В случае модема 56k по сравнению с линией DSl 4 Мбит / с, (как правило) нет никакой разницы в скорости, это просто разница в скорости канала.
Причина, по которой трудно сформировать входящий трафик, заключается в том, что в среде передачи нет буфера. Вы либо принимаете входящие биты, либо они теряются. Для трафика, который собирается покинуть интерфейс, вы можете буферизовать и переупорядочивать пакеты столько, сколько хотите (или, по крайней мере, до доступной буферной памяти в устройстве).
Для протоколов, у которых есть слой поверх TCP (я не знаю, имеет ли это место для торрентов), это было бы просто вопросом расстановки запросов на получение дополнительных данных. В противном случае приложение должно будет обмениваться данными с ОС, чтобы задерживать ACK-пакеты. Большинство протоколов, основанных на UDP, по необходимости должны иметь логику ACK / resend в протоколе, специфичном для приложения, поэтому в этот момент их граничит с тривиальным темпом.
Одним из возможных путей может быть формирование трафика из Интернета на стороне LAN вашего DSL-маршрутизатора, поскольку в этот момент вы будете формировать выходной порт.
источник
Я не могу ответить, почему вы не нашли каких-либо решений, которые бы позволяли формировать входящие данные (и не знали ничего из головы), но относительно того, как отправитель знает, как быстро получатель может получать данные:
Базовый дизайн TCP / IP заключается в том, что для каждого пакета, отправляемого источником в пункт назначения, он должен ждать, пока адресат ответит (с
ACK
пакетом), сообщая, что он получил пакет.Таким образом, если у вас есть отправитель 4 Мбит / с и получатель 56 Кбит / с, то отправитель должен сидеть и ждать между отправкой пакетов, чтобы получатель ответил на каждый пакет (Есть некоторые технические детали, чтобы уменьшить эти издержки, но предпосылка все еще держится на абстрактном уровень).
Так что же происходит, если отправитель уже отправляет данные со скоростью 56 Кбит / с, а затем пытается отправить немного больше?
Пакет теряется. (Ну, потенциально в очереди в буфере коммутатора, но когда он заполняется, пакет теряется). Поскольку пакет потерян, получатель никогда не получит его и, следовательно, никогда не отправит
ACK
пакет. Поскольку отправитель никогда не получает этотACK
пакет (потому что он никогда не был отправлен, но он также может быть потерян или может произойти сбой в сети), отправителю необходимо повторно отправить дополнительный пакет. Он сидит и пытается переслать пакет, пока он не пройдет иACK
ответ не вернется к нему.Итак, подведем итоги: после того, как отправитель исчерпал полосу пропускания получателя, он должен снова и снова останавливать и пересылать следующий пакет, пока не будет достаточно доступной полосы пропускания, чтобы он мог пройти. Это эффективно снижает скорость отправки до максимума, который может получить клиент. (И есть методы оптимизации, чтобы уменьшить количество повторных отправлений пакета в этом случае, когда отправитель в основном замедляется каждый раз, когда ему необходимо повторно отправить пакет, но это выходит за рамки этого упрощенного описания.
источник
Вы можете сделать это с помощью интерфейса 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
источник
Проверьте чудеса: http://lartc.org/wondershaper/
Что касается входящего трафика:
источник
использовать 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
источник