В простейшем случае задача регулировки трафика формулируется так: через наш шлюз проходит информационный поток A величной V(A) . Мы хотим ограничить этот поток каким-нибудь значением Vmax . То есть, грубо говоря, сделать так, чтобы все, что выходит за пределы зачения Vmax попросту уничтожалось [2].
Каждому потоку назначается специальный буфер, работающий по принципу очереди. Буфер наполняется с той скоростью, с какой в него поступают данные ( Vin ), а опустошается со скоростью, не превышающей заданную ( Vout ). В том случае, если Vin находится в допустимых пределах, поток проходит через буфер в полном объеме. Если же буфер наполняется быстрее чем опустошается, может наступить такой момент, когда он будет полностью заполнен и вновь поступающие данные будут попросту уничтожаться.
Можно не только ограничивать трафик, но и вносить, например, задержку в него, или уничтожать пакеты с заданной вероятностью. Как правило, это делается для решения каких-либо экспериментаторских задач, но иногда может быть полезно и в чисто практических целях.
Средства, которые управляют трафиком подобным образом, называют трафик-шейперами (traffic-shaper), формирователями или регулировщиками трафика.
В состав ядра FreeBSD входит модуль dummynet, который позволяет эмулировать канал связи, обладающий
ограниченой полосой пропускания;
задержкой распространения;
вероятностью потери пакета;
очередью пакетов заданного размера.
Этот модуль можно использовать в качестве трафик-шейпера.
Настройка трафик-шейпера на основе dummynet производится с помощью утилиты ipfw. Для того, чтобы направить какой-либо трафик через канал dummynet, нужно
Создать канал;
Указать, какой именно трафик должен быть в канал направлен;
Настроить канал на работу с заданными параметрами.
Два первых шага совмещаются в одном и выполняются командой ipfw add pipe. Например, команда
# ipfw add pipe 1 tcp from any to 192.168.15.1 out
создает канал 1 (pipe 1) и направляет через него весь tcp-трафик, отправленный не важно кем (from any) хосту 192.168.15.1 (to 192.168.15.1); при этом трафик должен быть исходящим (out).
Для того чтобы, настроить сам канал pipe, нужно дать команду ipfw pipe ... . Например, команда
# ipfw pipe 1 bw 10KB
ограничивает полосу пропускания канала pipe 1 значением 10 КБайт/с. Канал мог бы иметь и другие параметры, которые в этом случае должны были бы быть указаны как дополнительные аргументы команды парами параметр значение .
Для того чтобы ограничить поток даных, который передается из Интернета на машину в сети, нужно регулировать исходящий поток со шлюза на эту машину. |
В том случае, когда нужно ограничить скорость передачи информации из Интернета на хост, находящийся в локальной сети, следует изменять скорость исходящего потока. То есть скорость того потока, который уходит со шлюза на хост. Нельзя уменьшить скорость, с которой данные передаются из Интернета. Это вызывает вопрос: зачем унчитожать информацию, после того, как она уже попала в нашу сеть? Ведь она уже прошла по входящему каналу и уже заняла там какое-то место? Все действительно так, но в этом случае в силу вступают механизмы регулирования потока TCP, которые не позволят в следующий раз отправлять хосту информации больше, чем он способен принять.
Таблица 5. Параметры канала dummynet
bw |
Максимальная полоса пропускания канала. Может быть указана дополнительная единица измерения: MByte, KByte, Kbit, Mbit. По умолчанию, подразумевается, что полоса пропускания указана в Кбитах/с. |
delay |
Задержка распространения в мс. |
Просмотреть информацию о канале, можно с помощью команды
# ipfw pipe 1 list
00001: 80.000 Kbit/s 0 ms 50 sl. 1 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 tcp 192.168.15.199/80 192.168.15.254/52995 12365 15440683 0 0 1
Она выдает не только сведения о канале, но и о соединениях, которые проходят через этот канал.
[2] В действительности, задача управления трафиком значительно сложнее, но даже такая упрощенная формулировка является ползеной и позволяет решить множество практических задач.