IP-адрес: четыре байта
IP-адрес компьютера в сети — 32-битное двоичное число. Его записывают четырьмя байтами (числами от 0 до 255) через точки: 192.168.14.37. Каждое число — это 8 бит.
Адрес состоит из двух частей: номер сети (левая часть) и номер узла (правая часть). Все компьютеры одной сети имеют одинаковый номер сети.
Пример. $200 = 128 + 64 + 8 = 11001000_2$. Чтобы получить двоичную запись байта, разложите число на степени двойки: 128, 64, 32, 16, 8, 4, 2, 1.
Проверь себя. Запишите число 200 в двоичной системе (8 разрядов).
Ответ: 11001000
Маска подсети и адрес сети
11111111.11111111.11110000.00000000.Адрес сети получают поразрядной конъюнкцией: IP-адрес ∧ маска. Там, где в маске 1, биты адреса сохраняются, там, где 0, — обнуляются.
| 3-й байт | |
|---|---|
| IP: 191 | 10111111 |
| Маска: 240 | 11110000 |
| Адрес сети: 176 | 10110000 |
Сколько адресов в сети
Если в маске $k$ единиц (префикс /k), то под номер узла остаётся $32-k$ бит, а всего адресов в сети $2^{32-k}$. Два адреса особые: адрес сети (все биты узла — нули) и широковещательный (все биты узла — единицы). Компьютерам достаются $2^{32-k}-2$ адресов.
| Маска | Префикс | Бит узла | Адресов для узлов |
|---|---|---|---|
| 255.255.255.0 | /24 | 8 | 254 |
| 255.255.255.192 | /26 | 6 | 62 |
| 255.255.255.240 | /28 | 4 | 14 |
| 255.255.240.0 | /20 | 12 | 4094 |
Проверь себя. Сколько IP-адресов можно выдать узлам сети с маской 255.255.255.192?
Ответ: 62
ЕГЭ-13: типовые задачи и Python
Три постоянных сюжета задания 13: (1) по IP и маске найти адрес сети или один из его байтов; (2) по IP и адресу сети найти подходящие маски (наибольшее или наименьшее значение байта, число масок); (3) подсчитать адреса сети с заданным свойством (например, чётное число единиц).
Пример. Узел 98.162.71.123, адрес сети 98.162.64.0. Третий байт: IP 71 = 01000111, сеть 64 = 01000000. Маска должна обнулять три младших бита (в IP они единицы, а в сети нули) и сохранять шестой бит. Значит, третий байт маски — от 11000000 = 192 до 11111000 = 248.
import ipaddress
net = ipaddress.ip_network('192.168.32.160/27')
print(net.num_addresses) # 32
n = 0
for ip in net:
if bin(int(ip)).count('1') % 2 == 0: # чётное число единиц
n += 1
print(n) # 16