Статья Автор: Деникина Н.В., Деникин А.В.

Адрес, маска и поразрядное И

Для чего нужна маска

Пакет пришёл на роутер. Роутер должен ответить на один вопрос: этот адрес живёт в моей сети или его надо гнать дальше.

IP-адрес — четыре байта, то есть 32 бита. Маска тоже 32 бита, но устроена жёстко: сначала подряд единицы, потом подряд нули. Там, где единицы кончились, адрес и разрезается: слева номер сети, справа номер узла.

2552552400маска11111111111111111111000000000000IP-адрес11100111001000001111111110000011адрес сети11100111001000001111000000000000адрес сети — 20 битномер узла — 12 битЕдиница маски сохраняет бит, ноль обнуляет.

Адрес сети

Адрес сети получается поразрядным И адреса узла и маски. Единица маски оставляет бит как есть, ноль обнуляет.

Считай только тот байт, где маска ломается. Байты маски бывают либо 255, либо 0, и лишь один — промежуточный. Байт под 255 переписывается без изменений, байт под 0 обнуляется. Работы ровно на один байт.

Какие числа вообще бывают в маске

255, 254, 252, 248, 240, 224, 192, 128 и 0. Больше никаких.


Разбор: найти адрес сети

IP-адрес узла 231.32.255.131, маска 255.255.240.0.

Шаг 1. Разложить маску по байтам

255 . 255 . 240 . 0. Первые два байта — сплошные единицы, последний — сплошные нули, ломается третий.

Шаг 2. Крайние случаи бесплатны

Под 255 бит выживает: 231 и 32 переписываем без изменений. Под 0 гаснет всё: последний байт адреса сети равен нулю, что бы там ни стояло у узла.

Шаг 3. Разобрать спорный байт
1286432168421
узел 25511111111
маска 24011110000
сеть 24011110000

Слева от золотой черты маска держит единицы, и биты узла уцелели. Справа стоят нули маски, и всё погасло.

Шаг 4. Собрать ответ

Адрес сети 231.32.240.0. Единиц в маске 8 + 8 + 4 = 20, поэтому такую маску записывают ещё и как /20.


Та же задача программой

Данные из условия — двумя списками, дальше поразрядное И в цикле по байтам.



Что печатает программа
231
32
240
0

То же через ipaddress

В Python есть готовый модуль для адресов. Сеть создаётся строкой «адрес/маска», а strict=False разрешает подставить адрес любого узла, а не только адрес сети.

Что можно спросить у объекта сети
  • network_address — адрес сети
  • broadcast_address — широковещательный адрес
  • netmask — маска четырьмя байтами
  • prefixlen — сколько в маске единиц
  • num_addresses — сколько адресов в сети
  • for a in net — перебор всех адресов сети

Библиотека считает арифметику, но не отвечает на вопрос задания. Порядок остаётся тот же: сначала понять, где стоит граница, потом попросить машину посчитать.



Что печатает программа
231.32.240.0
255.255.240.0
20

Какое из чисел не может оказаться байтом маски?

IP-адрес узла 10.11.220.5, маска сети 255.255.192.0. Чему равен третий слева байт адреса сети?

Где теряют балл

  • Написали в маске 250 или 100. Единицы идут подряд слева, дырок не бывает.
  • Вычли маску вместо поразрядного И. Это разные операции.
  • Оставили последний байт от адреса узла, хотя маска там ноль.
  • Забыли strict=False — библиотека откажется строить сеть по адресу узла.
Печать