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

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

Адрес и маска компьютера

Чтобы пакет данных нашел адресата, у каждого устройства в сети должен быть свой уникальный номер — IP-адрес. Он состоит из 32 бит и записывается в виде четырех чисел от 0 до 255 через точку (например, 192.168.1.1). Важно, чтобы в одной сети не было двух устройств с одинаковым адресом, иначе возникнет ошибка

IP-адрес не монолитен: слева в нём заложен номер сети, а справа — номер устройства в этой сети. Где именно проходит эта граница, сам адрес не определяет — её задаёт маска подсети.

Маска тоже состоит из 32 бит и имеет строгую структуру: сначала идут единицы, а затем — нули. Там, где единицы заканчиваются, и проходит граница. Роутеру этого достаточно, чтобы понять: адрес назначения находится в его сети или пакет нужно отправить дальше

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

Адрес сети

Что это такое

Это общая часть адресов всех узлов сети, а на месте номера узла нули.

Компьютеру такой адрес не назначают: он обозначает не машину, а всю сеть целиком.

«Узлы в одной сети» и «у узлов совпал адрес сети» — одно и то же.

Как его получить

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

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

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

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

Адреса трёх узлов одной сети совпадают в первых трёх байтах и различаются последним. Адрес сети повторяет общую часть, а на месте номера узла стоит ноль. Общая часть — номер сети Номер узла Узел 1 192.168.10. 5 Узел 2 192.168.10. 37 Узел 3 192.168.10. 200 Адрес сети 192.168.10. 0 На месте номера узла — нули Компьютеру такой адрес не назначают — он обозначает всю сеть целиком

Условие

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

Маска — это трафарет

Запиши адрес и маску в двоичном виде, одно под другим. Дальше маска работает как трафарет с прорезями: где в ней единица — окошко открыто, бит адреса виден и переходит в ответ без изменений. Где ноль — окошко заклеено, на его месте в ответе ноль. Это и есть поразрядное И.

Главное, что нужно увидеть: маска режет адрес не по точкам, а по битам. Точки — просто разделители для человека, граница сети спокойно проходит посередине байта. Здесь она проходит после 20-го бита, то есть внутри третьего байта.

Адрес узла 231.32.255.131 и маска 255.255.240.0 в двоичном виде по 32 бита. Первые 20 бит маски — единицы, они сохраняют биты узла; остальные 12 обнуляют их. Результат — адрес сети 231.32.240.0, то есть /20. 20 бит — номер сети 12 бит — номер узла узел 231 1 1 1 0 0 1 1 1 32 0 0 1 0 0 0 0 0 255 1 1 1 1 1 1 1 1 131 1 0 0 0 0 0 1 1 маска 255 1 1 1 1 1 1 1 1 255 1 1 1 1 1 1 1 1 240 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 сеть 231 1 1 1 0 0 1 1 1 32 0 0 1 0 0 0 0 0 240 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 Слева от черты биты узла сохраняются, справа обнуляются 231.32.240.0 — адрес сети; единиц в маске 20, поэтому /20
Шаг 1. Найти байт, где маска ломается

255 . 255 . 240 . 0. Байт 255 — это восемь единиц подряд, байт 0 — восемь нулей. В любой правильной маске сначала идут только 255, потом ровно одно промежуточное число, потом только нули. Здесь промежуточный байт третий, и это 240. Считать придётся только его.

Шаг 2. Крайние байты выписываются сразу

Под 255 трафарет открыт полностью, байт проходит насквозь: 231 и 32 просто переписываем. Под 0 трафарет заклеен полностью, байт гаснет целиком, каким бы он ни был: последний байт адреса сети равен 0. Число 131 на ответ не влияет вообще, на него можно не смотреть.

Шаг 3. Разобрать спорный байт

Байт узла 255 — это 11111111. Байт маски 240 — это 11110000. Накладываем трафарет: первые четыре окошка открыты, оттуда бежит 1111; остальные четыре заклеены, там 0000. Вместе 11110000 — это 240.

Проверка без двоичной записи, если забыл таблицу степеней двойки: шаг = 256 − 240 = 16. Ответ — ближайшее снизу число, кратное шагу: 255 ÷ 16 = 15 целых, 15 × 16 = 240. Сошлось.

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

Адрес сети 231.32.240.0. Первые два байта пришли из адреса узла, третий посчитали, четвёртый обнулился.

Единиц в маске 8 + 8 + 4 = 20, поэтому ту же маску записывают короче: /20, а всю запись целиком — 231.32.240.0/20. На картинке эти 20 единиц — ровно то, что слева от золотой черты.

Проверь, что понял

Узел 231.32.241.9 в той же сети? Смотрим только третий байт: 241 = 11110001, под трафаретом 11110000 остаётся 11110000 = 240. Адрес сети тот же, значит да, в той же.

А узел 231.32.239.9? 239 = 11101111, под трафаретом остаётся 11100000 = 224. Адрес сети 231.32.224.0 — другой, значит это уже соседняя сеть, хотя в десятичной записи числа 239 и 240 стоят рядом.


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

Запишем данные из условия в два списка, дальше выполним поразрядное И (в Питоне операция &) в цикле по байтам отдельно.



Что печатает программа
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 — библиотека откажется строить сеть по адресу узла.
Печать