Е
9 мин чтенияIP-адресмаскасетимаршрутизациязадание 13КЕГЭ

Компьютерные сети: IP-адреса, маски и маршрутизация

IP-адрес и маска, адрес сети и широковещательный адрес, число узлов, подбор маски, таблицы маршрутизации — задание 13.

Открываем тему…

IP-адрес и маска подсети

IPv4-адрес — это 32 бита, записанные четырьмя байтами (числами от 0 до 255) через точку. Маска сети — тоже 32-битное число: сначала идут единицы, затем нули (например, 255.255.240.0 = 11111111.11111111.11110000.00000000). Единицы маски выделяют сетевую часть адреса, нули — номер узла внутри сети. Число единиц в маске называют длиной префикса и пишут «/p».

адрес сети=IP & маска,Nадресов=232−p,Nузлов=232−p−2\text{адрес сети}=\text{IP}\ \&\ \text{маска},\qquad N_{\text{адресов}}=2^{32-p},\qquad N_{\text{узлов}}=2^{32-p}-2
Поразрядная конъюнкция даёт адрес сети; два адреса (сети и широковещательный) узлам не назначаются.
  • Широковещательный адрес: в адресе сети все биты узловой части заменяются единицами.
  • Допустимые значения байта маски: 0, 128, 192, 224, 240, 248, 252, 254, 255 (соответственно 0…8 единиц). Байты, стоящие правее байта со значением меньше 255, равны 0.
  • Два узла принадлежат одной сети, если у них совпадают результаты операции «IP & маска».
  • Для перевода байта в двоичную систему помните степени двойки: 128, 64, 32, 16, 8, 4, 2, 1.
ПримерАдрес сети по IP и маске
Узел имеет IP-адрес 172.16.45.200, маска сети 255.255.255.224. Найдите адрес сети.
Решение
Первые три байта маски равны 255, поэтому они не изменяются: 172.16.45. Последний байт: 200 = 11001000₂, 224 = 11100000₂; поразрядное «И»: 11001000 & 11100000 = 11000000₂ = 192. Адрес сети: 172.16.45.192.
ПримерЧисло узлов в сети
Сколько IP-адресов можно назначить узлам сети с маской 255.255.254.0?
Решение
254 = 11111110₂ — в третьем байте один нулевой бит, в четвёртом байте — восемь. Всего нулей 9, адресов 2⁹ = 512. Вычитаем адрес сети и широковещательный адрес: 512 − 2 = 510.
ПримерШироковещательный адрес
Узел 10.20.37.14, маска 255.255.252.0. Найдите адрес сети и широковещательный адрес.
Решение
252 = 11111100₂, 37 = 00100101₂. Третий байт адреса сети: 00100101 & 11111100 = 00100100₂ = 36, четвёртый байт: 0. Адрес сети: 10.20.36.0. В широковещательном адресе узловая часть (последние два бита третьего байта и весь четвёртый байт) состоит из единиц: 00100111₂ = 39 и 255. Ответ: 10.20.36.0 и 10.20.39.255.
ПримерНаибольшая маска для двух узлов
Узлы 111.81.208.27 и 111.81.215.1 принадлежат одной сети. Каково наибольшее возможное количество единиц в маске?
Решение
Адреса принадлежат одной сети, если совпадают сетевые части. Чтобы маска была наибольшей, сетевой частью должен быть самый длинный общий двоичный префикс адресов. Первые два байта (111.81) совпадают — 16 бит. Третьи байты: 208 = 11010000₂ и 215 = 11010111₂. Общий префикс — 11010 (5 бит), шестой бит различается. Всего 16 + 5 = 21 единица (маска 255.255.248.0).

Таблицы маршрутизации

Маршрутизатор выбирает запись таблицы, адрес сети которой совпадает с адресом назначения «по маске» этой записи; если подходят несколько записей, выбирается запись с самой длинной маской (самым большим префиксом). Запись 0.0.0.0/0 — маршрут по умолчанию, ей соответствует любой адрес.

ПримерВыбор маршрута
В таблице маршрутизации есть записи: 192.168.5.0/24 → интерфейс A; 192.168.0.0/16 → интерфейс B; 0.0.0.0/0 → шлюз C. Куда будут отправлены пакеты на адреса 192.168.5.77, 192.168.9.1 и 8.8.8.8?
Решение
192.168.5.77 подходит всем трём записям, самая длинная маска — /24, значит интерфейс A. 192.168.9.1 не попадает в сеть 192.168.5.0/24, но попадает в 192.168.0.0/16 (первые 16 бит совпадают) — интерфейс B. 8.8.8.8 подходит только записи по умолчанию — шлюз C.
ПримерМодуль ipaddress в Python
Как проверить расчёты с помощью программы?
Решение
import ipaddress net = ipaddress.ip_network('172.16.45.200/27', strict=False) print(net.network_address, net.broadcast_address, net.num_addresses) # 172.16.45.192 172.16.45.223 32 Подбор масок по условию — перебор длины префикса p от 0 до 32: ip = int(ipaddress.ip_address('142.108.212.150')) net = int(ipaddress.ip_address('142.108.192.0')) for p in range(33): mask = (0xFFFFFFFF << (32 - p)) & 0xFFFFFFFF if ip & mask == net: print(p)