К содержанию

Подтема 4 из 6

Неизвестная маска

Как найти маску, если известны адрес узла и адрес сети, и когда два узла оказываются в одной сети.

Маска по адресу сети

Обратная задача: известны узел 172.20.77.140 и адрес его сети 172.20.76.0, а маска — нет. Какой она может быть?

Маску восстанавливают по битам: где единица адреса сохранилась, в маске 1, где пропала — 0, а совпавшие нули маску не определяют. Это то же равенство «адрес сети = адрес И маска», только неизвестна маска:

АдресСетьБит маски
11только 1 — единицу надо сохранить
10только 0 — единицу надо обнулить
000 или 1 — «И» с нулём всегда 0
01невозможно — «И» не делает из нуля единицу

Первые два октета совпадают, сравниваем третий: 77 = 01001101, 76 = 01001100. Шестой бит — единица в обоих: маска должна дойти хотя бы до него, это 16 + 6 = 22 единицы. Восьмой бит — 1 у адреса и 0 у сети: здесь в маске ноль. Седьмой бит — ноль в обоих, он может быть и сетевым, и узловым.

Адрес 172.20.77.140 и адрес сети 172.20.76.0 по битам. Бит в рамке — ноль и там, и там, поэтому граница маски может стоять до него или после: подходят /22 и /23.

Все подходящие маски

Подходящие длины маски образуют отрезок L ≤ p ≤ C: L — позиция последней единицы адреса сети, C — сколько первых битов адреса и адреса сети совпадают. У нас L = 22, C = 23: маски /22 (третий байт 252) и /23 (254). Какую из них назвать, решает вопрос задачи. Выбери вопрос:

наименьший третий байт
252самая короткая маска /22
наибольший третий байт
254самая длинная маска /23
больше всего единиц
23
меньше всего нулей
9
больше всего адресов
1024самая короткая маска оставляет больше свободных битов
сколько масок
2
Вручную

Найди первый октет, где адрес и сеть различаются, запиши оба октета битами. L — до последней единицы сети включительно, C — до первого различия. Совпадение целых октетов ещё не значит 255 в маске: 192 И 192 = 192 при октете маски 192.

Python

Длин маски всего 33 — от 0 до 32, поэтому программа перебирает их все () и оставляет те, где адрес сети совпал с заданным (). Пройди по шагам длины от 21 до 24:

from ipaddress import ip_address, ip_network expected = ip_address('172.20.76.0')found = []for p in range(21, 25):    net = ip_network(f'172.20.77.140/{p}', strict=False)    if net.network_address == expected:        found.append(p)print(found)
[22, 23]
from ipaddress import ip_address, ip_networkexpected = ip_address('172.20.76.0')found = []for p in range(33):    net = ip_network(f'172.20.77.140/{p}', strict=False)    if net.network_address == expected:        found.append(p)print(found)print(ip_network(f'0.0.0.0/{min(found)}').netmask)
[22, 23] 255.255.252.0

Ответ берут из списка: — длины, 32 - p — нули, len — сколько масок. Октет маски — str(mask).split('.')[2] ( 2 — третья часть).

Два узла

Узлы 172.20.77.140 и 172.20.79.200 находятся в одной сети. Какая у неё самая длинная маска?

При общей маске два адреса в одной сети, пока граница маски не заходит дальше их совпадающих начальных битов. Третьи октеты: 77 = 01001101, 79 = 01001111 — совпадают первые шесть битов, всего C = 16 + 6 = 22. При p ≤ 22 сети одинаковы, при p ≥ 23 — разные.

Адреса 172.20.77.140 и 172.20.79.200 по битам: первые 22 бита одинаковы, 23-й различается. Пока граница маски левее черты, сетевые части совпадают.
Вручную

Самая длинная общая маска — /22, это и есть маска задачи темы. Самая короткая маска, при которой узлы уже в разных сетях, — /23. Дальше первого различия сравнивать не нужно: сетевая часть уже разная.

Python

Строим обе сети для каждой длины и сравниваем их:

from ipaddress import ip_networksame = []for p in range(33):    a = ip_network(f'172.20.77.140/{p}', strict=False)    b = ip_network(f'172.20.79.200/{p}', strict=False)    if a == b:        same.append(p)print(max(same))
22

Для разных сетей ищут первую длину, где сети различаются, и останавливают цикл ():

from ipaddress import ip_network for p in range(20, 33):    a = ip_network(f'172.20.77.140/{p}', strict=False)    b = ip_network(f'172.20.79.200/{p}', strict=False)    if a.network_address != b.network_address:        breakprint(p)
23
Тонкости:узел на краю сети

Узел не может совпадать с адресом сети или широковещательным адресом, поэтому самая длинная маска иногда на бит короче C. У узлов 172.20.72.0 и 172.20.79.200 совпадают 21 бит, но при /21 адрес 172.20.72.0 — сам адрес сети:

Узел 172.20.72.0 и маска /21: все 11 битов его части узла — нули. При такой маске он и есть адрес сети, поэтому компьютеру этот адрес не назначают.

Поэтому программа проверяет и края сети ( ends, ):

from ipaddress import ip_address, ip_networka = ip_address('172.20.72.0')b = ip_address('172.20.79.200')best = 0for p in range(33):    net = ip_network(f'{a}/{p}', strict=False)    ends = (net.network_address, net.broadcast_address)    if b in net and a not in ends and b not in ends:        best = pprint(best)
20

Итого

  • По битам1 сохранилась — 1; пропала — 0; два нуля — любой
  • L ≤ p ≤ Cот последней единицы сети до первого различия
  • Перебор33 длины; ip_network(f'{ip}/{p}', strict=False)
  • Два узлаодна сеть при p ≤ C, разные — при p > C
  • Краяузел не может быть адресом сети или широковещательным

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Бит узла равен 1, а тот же бит адреса сети — 0. Каким должен быть бит маски?
ОтветСкрыть ответ
Ответ
0: единицу адреса нужно обнулить.
Вопрос 2
И бит узла, и бит адреса сети равны 0. Что можно сказать о бите маски?
ОтветСкрыть ответ
Ответ
Ничего: «И» с нулём даёт ноль при любом бите маски.
Вопрос 3
Для узла 74.219.187.66 адрес сети 74.219.176.0. Чему равен третий байт маски?
ОтветСкрыть ответ
Ответ
240: 187 = 10111011, 176 = 10110000 — четвёртый бит сохранил единицу, пятый её потерял, поэтому маска 11110000.
Вопрос 4
Узлы 10.30.52.1 и 10.30.55.250 при общей маске. При какой самой длинной маске они ещё в одной сети?
ОтветСкрыть ответ
Ответ
/22: 52 = 00110100 и 55 = 00110111 совпадают в шести битах, 16 + 6 = 22.
Вопрос 5
Почему узлы 172.20.72.0 и 172.20.79.200 не могут быть в общей сети /21, хотя их первые 21 бит совпадают?
ОтветСкрыть ответ
Ответ
При /21 адрес 172.20.72.0 — сам адрес сети, а его компьютеру не назначают. Самая длинная общая маска — /20.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Третий байт маски

Для узла с IP-адресом 74.219.187.66 адрес сети равен 74.219.176.0. Чему равен третий слева байт маски? Ответ запиши в виде десятичного числа.

Введите число.

Наименьший последний байт маски

Для узла с IP-адресом 85.112.43.200 адрес сети равен 85.112.43.192. Чему равно наименьшее возможное значение последнего байта маски?

Введите число.

Наибольшее число единиц маски

Для узла с IP-адресом 131.70.215.9 адрес сети равен 131.70.208.0. Каково наибольшее возможное количество единиц в маске?

Введите число.

Наименьшее число нулей маски

Для того же узла 131.70.215.9 и сети 131.70.208.0 найди наименьшее возможное количество нулей в маске.

Введите число.

Сколько масок возможно

Для узла с IP-адресом 200.15.77.130 адрес сети равен 200.15.77.128. Для скольких различных значений маски это возможно?

Введите число.

Наибольшее число единиц

Для узла с IP-адресом 141.97.58.197 адрес сети равен 141.97.58.192. Каково наибольшее возможное количество единиц в разрядах маски?

Введите число.

Наибольшее количество адресов

Для того же узла 141.97.58.197 и сети 141.97.58.192 найди наибольшее возможное количество адресов в этой сети.

Введите число.

Самая длинная общая маска

Даны узлы 10.30.52.1 и 10.30.55.250. Сколько единиц в самой длинной общей маске, при которой они ещё находятся в одной сети?

Введите число.

Наибольшее число единиц маски для двух узлов

Узлы с IP-адресами 90.14.200.33 и 90.14.203.140 находятся в одной сети. Чему равно наибольшее возможное количество единиц в маске этой сети?

Введите число.

Наименьшее количество адресов общей сети

Для тех же узлов 90.14.200.33 и 90.14.203.140 найди наименьшее возможное количество адресов в сети, которой они оба принадлежат.

Введите число.

Разные сети: наименьшее число единиц

Узлы с IP-адресами 156.71.33.90 и 156.71.33.120 находятся в разных сетях с одинаковой маской. Чему равно наименьшее возможное количество единиц в маске?

Введите число.

Узел на краю сети

Узлы с IP-адресами 61.5.96.0 и 61.5.111.7 находятся в одной сети. Чему равно наибольшее возможное количество единиц в маске? Будь внимателен к первому адресу.

Введите число.

Третий байт маски общей сети

Узлы с IP-адресами 18.240.130.5 и 18.240.141.77 находятся в одной сети. Укажи наибольшее возможное значение третьего слева байта маски этой сети.

Введите число.

Третий байт маски разных сетей

Узлы с IP-адресами 205.66.157.48 и 205.66.149.230 находятся в разных сетях, маски которых одинаковы. Укажи наименьшее возможное значение третьего слева байта этой маски. Ответ запиши в виде десятичного числа.

Введите число.

Второй байт маски

Два узла, находящиеся в одной сети, имеют IP-адреса 77.180.12.9 и 77.184.250.4. Укажи наибольшее возможное значение второго слева байта маски сети. Ответ запиши в виде десятичного числа.

Введите число.