Компьютерные сети
IP-адреса и маски сети
IP-адрес версии 4 — это 32 бита, записанные четырьмя числами от 0 до 255 через точки (по одному байту каждое): например, 192.168.12.77.
Маска сети
Маска показывает, какая часть адреса относится к сети, а какая — к узлу в сети. В двоичной записи маска всегда состоит из единиц, за которыми идут нули. Единиц — столько, сколько бит отведено под номер сети.
Допустимые значения «пограничного» байта маски:
| Двоичная запись | Число |
|---|---|
| 00000000 | 0 |
| 10000000 | 128 |
| 11000000 | 192 |
| 11100000 | 224 |
| 11110000 | 240 |
| 11111000 | 248 |
| 11111100 | 252 |
| 11111110 | 254 |
| 11111111 | 255 |
Маску можно записать и как длину префикса: 255.255.255.192 — это /26, то есть 26 единиц подряд (три байта по 8 и ещё 2 единицы).
Адрес сети
Адрес сети получается поразрядной конъюнкцией (побитовым «и») IP-адреса и маски. Делайте это отдельно для каждого байта: если байт маски равен 255, байт адреса сохраняется, если 0 — становится нулём, иначе считаем в двоичной системе.
Пример: IP 192.168.12.77, маска 255.255.255.192.
- Первые три байта: маска 255, значит остаются
192.168.12. - Четвёртый байт: 77 =
01001101, маска 192 =11000000. Конъюнкция:01000000= 64.
Адрес сети: 192.168.12.64.
Сколько адресов в сети
Если под узлы отведено h бит (число нулей в маске), то в сети 2^h адресов. Два из них служебные: адрес самой сети (все нули в узловой части) и широковещательный адрес (все единицы). Поэтому для узлов остаётся 2^h − 2 адресов.
- Маска
255.255.255.192(/26): h = 6, адресов 64, узлов 62. - Маска
255.255.254.0: четвёртый байт — 8 нулей, третий байт254=11111110— ещё один ноль, всего h = 9, адресов 512, узлов 510.
Задачи на подбор маски
Типичные формулировки: «найдите наименьшее/наибольшее возможное значение байта маски», «сколько существует масок, при которых два адреса принадлежат одной сети».
Алгоритм:
- Запишите адреса в двоичной системе (достаточно байтов, которые различаются).
- Два адреса принадлежат одной сети, если после наложения маски все байты совпадают. Значит, в тех разрядах, где биты адресов различаются, в маске должен стоять 0.
- Так как в маске за единицами идут только нули, число единиц в маске не больше числа совпадающих старших битов двух адресов. Всё, что короче, тоже подходит.
Пример: 192.168.12.77 и 192.168.12.100. Последние байты: 77 = 01001101 и 100 = 01100100. Совпадают два старших бита (01), на третьем различаются. Значит, длина префикса не больше 24 + 2 = 26, то есть самая «узкая» подходящая маска — 255.255.255.192.
Перебор на Python надёжнее рассуждений:
import ipaddress
# Адрес сети и число адресов
net = ipaddress.ip_network('192.168.12.77/255.255.255.192', strict=False)
print(net.network_address, net.num_addresses, net.prefixlen)
# 192.168.12.64 64 26
# Наибольшая длина префикса, при которой два адреса попадают в одну сеть
a, b = '192.168.12.77', '192.168.12.100'
for p in range(32, -1, -1):
n1 = ipaddress.ip_network(f'{a}/{p}', strict=False)
n2 = ipaddress.ip_network(f'{b}/{p}', strict=False)
if n1 == n2:
print(p, n1.netmask) # 26 255.255.255.192
breakТипичные ошибки
- Забывают вычесть 2 служебных адреса, когда спрашивают про число узлов.
- Считают маску вида
255.255.253.0: недопустимо, так как 253 =11111101— в маске после нуля снова единица. - Применяют конъюнкцию к десятичным числам, а не к двоичным записям байтов.