Подтема 3 из 6
Количество адресов и номер узла
Сколько адресов в сети, какую маску выбрать под нужное число компьютеров и какой номер у узла.
Количество адресов
Сколько адресов в сети задачи темы и сколько из них можно назначить компьютерам?
h свободных битов дают 2ʰ адресов; без адреса сети и широковещательного — 2ʰ − 2. Каждый свободный бит — 0 или 1, и каждый новый бит удваивает число вариантов. В нашей сети h = 10: 2¹⁰ = 1024 адреса, компьютерам — 1022.
Проверка через октеты: третий октет пробегает четыре значения 76–79, при каждом последний октет — 256 значений: 4 · 256 = 1024. Каждая лишняя единица маски уменьшает сеть вдвое: /23 — 512 адресов, /24 — 256.
from ipaddress import ip_networkfor p in [22, 23, 24]: net = ip_network(f'172.20.77.140/{p}', strict=False) print(p, 32 - p, net.num_addresses, net.num_addresses - 2)Вычитать два можно только из всех адресов сети. Если адреса считают по дополнительному условию, специальные адреса проверяют отдельно (подтема 5).
Сеть под компьютеры
Маску под число компьютеров подбирают по наименьшему h, при котором 2ʰ − 2 не меньше нужного. Для 1000 компьютеров: 2⁹ − 2 = 510 мало, 2¹⁰ − 2 = 1022 хватает. Значит, h = 10, p = 22 — маска нашей сети. В сети ровно 1000 адресов быть не может: размер сети — всегда степень двойки.
Программа увеличивает h, пока адресов ещё мало ():
need = 1000h = 0while 2 ** h - 2 < need: h += 1print(h, 32 - h)Тонкости:деление на подсети
Сеть /24 делят на подсети /26: граница сдвигается на 2 бита, 2² = 4 подсети по 2⁶ = 64 адреса, 4 · 64 = 256. Из числа подсетей два не вычитают — «минус два» относится к адресам внутри сети.
Номер узла
Какой порядковый номер у компьютера 172.20.77.140 в его сети?
Номер узла — его расстояние от адреса сети: номер = I − N. У адреса сети номер 0, у следующего — 1 и так далее. I и N — адреса узла и сети как целые числа.
(77 − 76) · 256 + 140 = 396: между соседними значениями третьего октета последний проходит все 256 значений. Обратно: узел с номером 650 = 2 · 256 + 138 — это 172.20.78.138.
from ipaddress import ip_address, ip_networkaddress = ip_address('172.20.77.140')net = ip_network('172.20.77.140/22', strict=False)print(int(address) - int(net.network_address))print(net.network_address + 650)Единицу здесь не добавляют: номер — расстояние, а не количество адресов от начала до узла.
Итого
- Все адреса2ʰ, h = 32 − p
- Компьютеры2ʰ − 2: без адреса сети и широковещательного
- Под N компьютеровнаименьшее h с 2ʰ − 2 ≥ N
- Номер узлаI − N;
int(address) - int(net.network_address)
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Адреса компьютеров при маске /21
Сколько адресов можно назначить компьютерам в сети с маской 255.255.248.0?
Введите число.
Подсказка
Адреса компьютеров — все адреса без адреса сети и широковещательного.
Решение
248 = 11111000, единиц в маске 8 + 8 + 5 = 21, свободных битов 11. Всего адресов 2¹¹ = 2048, компьютерам — 2048 − 2 = 2046.
Решение программой
from ipaddress import ip_address, ip_network net = ip_network('0.0.0.0/255.255.248.0')print(net.num_addresses - 2)Ответ: 2046
Адреса для компьютеров
Сколько адресов можно назначить компьютерам в сети с маской 255.255.255.240?
Введите число.
Подсказка
Адрес сети и широковещательный компьютерам не назначают.
Решение
240 = 11110000, свободных битов 4: адресов 2⁴ = 16, компьютерам — 16 − 2 = 14.
Решение программой
from ipaddress import ip_address, ip_network print(ip_network('0.0.0.0/255.255.255.240').num_addresses - 2)Ответ: 14
Адреса сети /19
Сколько всего адресов в сети с маской /19?
Введите число.
Подсказка
Количество адресов — 2 в степени числа свободных битов.
Решение
Свободных битов 32 − 19 = 13, адресов 2¹³ = 8192.
Решение программой
from ipaddress import ip_address, ip_network print(ip_network('0.0.0.0/19').num_addresses)Ответ: 8192
Адреса компьютеров при маске /25
Для некоторой подсети используется маска 255.255.255.128. Сколько различных адресов компьютеров допускает эта маска, если адрес сети и широковещательный адрес не используют?
Введите число.
Подсказка
Сначала все адреса, потом без двух специальных.
Решение
Маска 255.255.255.128 оставляет 7 свободных битов: 2⁷ = 128 адресов, без двух специальных — 126.
Решение программой
from ipaddress import ip_address, ip_network print(ip_network('0.0.0.0/255.255.255.128').num_addresses - 2)Ответ: 126
Сеть на 1000 компьютеров
Нужно разместить не менее 1000 компьютеров, два специальных адреса использовать нельзя. Найди маску самой маленькой подходящей сети.
Введите маску: четыре числа через точку.
Подсказка
Подбери наименьшее число свободных битов, при котором 2ʰ − 2 не меньше 1000.
Решение
Нужно наименьшее h с 2ʰ − 2 ≥ 1000: при h = 9 получается 510 — мало, при h = 10 — 1022. Длина маски 32 − 10 = 22, маска 255.255.252.0.
Решение программой
from ipaddress import ip_address, ip_network h = 1while 2 ** h - 2 < 1000: h += 1print(ip_network(f'0.0.0.0/{32 - h}').netmask)Ответ: 255.255.252.0
Подсети /26 в сети /24
Сеть /24 делят на подсети /26. Сколько получится подсетей?
Введите число.
Подсказка
Сколько битов добавилось к сетевой части?
Решение
Граница сдвигается на 26 − 24 = 2 бита, у двух битов 2² = 4 комбинации — четыре подсети по 64 адреса.
Решение программой
print(2 ** (26 - 24))Ответ: 4
Номер узла
Какой номер у узла 192.168.4.207 в сети с маской /27?
Введите число.
Подсказка
Номер узла — расстояние от адреса сети.
Решение
Маска /27 — блоки по 32 в последнем октете, 207 лежит в блоке 192–223. Адрес сети 192.168.4.192, номер узла — расстояние от него: 207 − 192 = 15.
Решение программой
from ipaddress import ip_address, ip_network net = ip_network('192.168.4.207/27', strict=False)node = ip_address('192.168.4.207')print(int(node) - int(net.network_address))Ответ: 15
Номер узла в нескольких октетах
Какой номер у узла 10.5.142.77 в сети с маской /21?
Введите число.
Подсказка
Часть узла занимает больше одного октета: третий октет даёт целые сотни по 256.
Решение
Третий октет маски 248, блок 8: 142 лежит в блоке 136–143, адрес сети 10.5.136.0. Номер — (142 − 136) · 256 + 77 = 1613: между соседними значениями третьего октета последний проходит все 256 значений.
Решение программой
from ipaddress import ip_address, ip_network net = ip_network('10.5.142.77/21', strict=False)node = ip_address('10.5.142.77')print(int(node) - int(net.network_address))Ответ: 1613
Порядковый номер компьютера
Маска сети 255.255.240.0, IP-адрес компьютера в сети 118.64.201.90. Чему равен порядковый номер компьютера в сети?
Введите число.
Подсказка
Номер — расстояние от адреса сети, третий октет весит 256.
Решение
Третий октет маски 240, блок 16: 201 лежит в блоке 192–207, адрес сети 118.64.192.0. Номер (201 − 192) · 256 + 90 = 2394.
Решение программой
from ipaddress import ip_address, ip_network net = ip_network('118.64.201.90/255.255.240.0', strict=False)node = ip_address('118.64.201.90')print(int(node) - int(net.network_address))Ответ: 2394
Узел с номером 1000
В сети 10.40.16.0/20 найди адрес узла с номером 1000.
Введите IP-адрес: четыре числа через точку.
Подсказка
Разложи номер на целые 256 и остаток.
Решение
1000 = 3 · 256 + 232: к третьему октету адреса сети прибавляем 3, последний октет — 232. Получаем 10.40.19.232.
Решение программой
from ipaddress import ip_address, ip_network print(ip_network('10.40.16.0/20')[1000])Ответ: 10.40.19.232