Коротко о маршрутизации



Теперь коротко о маршрутизации.

У каждого ip-пакета есть заголовок, в котором указан адрес отправителя (откуда) и адрес получателя (куда летит пакет).

Для примера рассмотрим сеть 192.168.1.0/24. Такая запись является общепринятой для обозначения адресного пространства подсети. Значит она то, что интерфейсы, лежащие в этой подсети будут иметь маску подсети 255.255.255.0 (24 бита). Т.е от 192.168.1.1 до 192.168.1.254. 255 зарезервирован для широковещательной рассылки пакетов в рамках подсети.

Вот наш пример: комп с адресом 192.168.1.1 отправил пакет компьютеру 192.168.1.2. Поскольку адрес назначения находится в той же подсети, что и интерфейс отправителя, в качестве шлюза используется сам интерфейс отправителя. Грубо говоря пакет выпуливается в сеть с надеждой, что его поймает нужный хост. (пока рассматриваем только IP-маршрутизацию, arp не берем). Приведем для наглядности фрагмент таблицы маршрутизации:


C:\ netstat -nr   (можно использовать команду route print)

Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
          0.0.0.0          0.0.0.0     192.168.1.11     192.168.1.1        1
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1        1
      192.168.1.0    255.255.255.0      192.168.1.1     192.168.1.1       20
      192.168.1.1  255.255.255.255        127.0.0.1       127.0.0.1       20
Основной шлюз:        192.168.1.11

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


192.168.1.0 255.255.255.0       192.168.1.1     192.168.1.1        20

Первым делом определена сеть назначения 192.168.1.0. Можно было бы назвать ее диапазоном адресов, в который входит адрес назначения. Определен адрес шлюза, т.е. в данном случае собственно наш интерфейс 192.168.1.1. Так же определен интерфейс, через который мы будем пулять пакет (интерфейсов у хоста может быть несколько). Метрика обозначает приоритет маршрута. В случае если до адреса назначения можно добраться только одним маршрутом на метрику можно особого внимания не обращать. И так, резюмируя всё сказанное получаем что пакет посмотрев на таблицу маршрутизации точно знает, что он долетит за один шаг до адресата и отправляется в путь. Тут всё просто.

Рассмотрим теперь случай, когда адрес назначения находится вне подсети, т.е. принадлежит диапазону, отличному от того, в котором находится наш интерфейс. Предположим, что в нашем сегменте есть еще маршрутизатор, который знает про подсеть 172.16.1.0/24, можно еще определить ее диапазоном 172.16.1.0 с маской 255.255.255.0. Предположим, адрес данного маршрутизатора 192.168.1.172. Адрес должен быть обязательно из той подсети, в которой находится наш интерфейс.

Чтобы пакет,отправленный по адресу 172.16.1.1 достиг адресата придется добавить в нашу таблицу маршрутизации дополнительный маршрут в подсеть с номером 172.16.1.0/24. Выглядит он вот так:



     172.16.1.0    255.255.255.0    192.168.1.172     192.168.1.1

Сама команда в винде выглядит так:
route add 172.16.1.0 mask 255.255.255.0 192.168.1.172 

В результате таблица примет вид:
Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
          0.0.0.0          0.0.0.0     192.168.1.11     192.168.1.1        1
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1        1
      192.168.1.0    255.255.255.0      192.168.1.1     192.168.1.1       20
      192.168.1.1  255.255.255.255        127.0.0.1       127.0.0.1       20
       172.16.1.0    255.255.255.0    192.168.1.172     192.168.1.1        1
Основной шлюз:        192.168.1.11
После перезагрузки добавленный таким образом маршут из таблицы исчезнет. Чтобы он в ней сохранился надо добавить опцию -p к команде.
 route add -p 172.16.1.0 mask 255.255.255.0 192.168.1.172

Это минимальные действия, достаточные для того, чтобы пакет, следующий по адресу 172.16.1.1 был отправлен. Пакет посмотрит перед выходом на таблицу и поймет, что ему для достижения адресата нужно отправляться к маршрутизатору 192.168.1.172. То же самое необходимо и ответному пакету, летящему с интерфейса 172.16.1.1 по адресу 192.168.1.1. Он должен свериться со своей таблицей маршрутизации и отыскать там маршрут в сеть, в которой находится интерфейс 192.168.1.1. Если такого там не окажется, то...

Собственно да, а если маршрута до сети назначения нет в таблице? Вот тут на помощь нам приходит default gateway или шлюз по умолчанию. Это адрес, по которому отправляются все пакеты, маршрут к адресатам которых отсутствует в таблице маршрутизации. Проще говоря, не знаешь куда лететь - направляйся к шлюзу по умолчанию (он же основной шлюз в нашей таблице). Для него даже маршрут специальный придумали. Вот он:



0.0.0.0          0.0.0.0     192.168.1.11     192.168.1.1        1.

Самый первый в таблице.

Т.е. предполагается, шлюз поумолчанию знает где искомая сеть или по крайней мере пошлет туда, где подскажут. Например к следующему маршрутизатору, который у него указан как default gateway. И так до тех пор пока у пакета не истечет время жизни, уменьшающееся на единицу при прохождении через очередной маршрутизатор. Для оптимизации сего процесса были придуманы умные вещи типа протоколов динамической маршрутизации, коммутаторов третьего уровня (L3)... Но на этом сейчас пожалуй остановлюсь. Разве что хотелось бы добавить пару слов о том, что такое маска подсети и зачем она существует. Существует она всего лишь для того, чтобы была возможность в таблице маршрутизации указывать подсеть просто номером, а не перечислять каждый хост с индивидуальным маршрутом до него. Определяется номер подсети по механизму побитового логического умножения ip-адреса и маски подсети.

255.255.255.0 маска 
192.168.1.1   ip-адрес
-------------
192.168.1.0   номер подсети

Произошло следующее: 32 бита маски выстроились против 32-х бит адреса и поразрядно перемножились. Помним, что единица получается только при перемножении двух единиц. Во всех остальных случаях получается ноль. Вот и получили в десятичном представлении результат 192.168.1.0.

На этом всё. Если есть какие-то замечания-дополнения-уточнения пишите письма:)

С уважением, Морозов Алексей.
24.12.2008



www.leo-fender.narod.ru

Рейтинг@Mail.ru