Прорешаем задачи по теме «IP-адресация», находящейся на стыке трёх тем: «Системы счисления», «Комбинаторика», «Логика».
Задача 4.6.1. В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и его маске. По заданным IP-адресу сети и маске определите адрес сети:
IP-адрес: 145.92.101.88. Маска: 255.255.224.0.
При записи ответа выберите из приведенных в таблице чисел четыре элемента IP-адреса и запишите в нужном порядке соответствующие им буквы без точек.
A
|
B
|
C
|
D
|
E
|
F
|
G
|
H
|
0
|
145
|
255
|
137
|
128
|
240
|
92
|
96
|
Пример. Пусть искомый адрес сети 192.168.128.0 и дана таблица
A
|
B
|
C
|
D
|
E
|
F
|
G
|
H
|
128
|
168
|
255
|
8
|
127
|
0
|
17
|
192
|
В этом случае правильный ответ будет HBAF.
Если вы забыли, что такое поразрядная конъюнкция, смотрите задачу 4.2.6.
Ошибка. Поскольку речь идет о поразрядной конъюнкции, надо делать её в двоичном виде. Но не торопитесь переводить все числа IP-адреса и маски в двоичный вид, делать поразрядную конъюнкцию и переводить обратно. Это слишком долго. Попробуйте догадаться сразу о некоторых значениях.
Надо сделать поразрядную конъюнкцию для следующих чисел:
IP-адрес
|
145
|
92
|
101
|
88
|
Маска
|
255
|
255
|
224
|
0
|
Адрес сети
|
???
|
???
|
???
|
???
|
Посмотрим последнюю колонку: в маске находится 0. На него отведен байт: 00000000.
Поразрядная конъюнкция – это логическое «И» («логическое умножение»). Нули в маске обнулят все биты числа 88:
IP-адрес
|
145
|
92
|
101
|
88
|
Маска
|
255
|
255
|
224
|
0
|
Адрес сети
|
???
|
???
|
???
|
0
|
Посмотрим число 255. Его двоичное представление 11111111 (если вы это не понимаете, смотрите задачу 1.2.7). Эти единицы пропустят всё число из IP-адреса полностью, так как единица, умноженная на любое число, даст нам на выходе это число:
IP-адрес
|
145
|
92
|
101
|
88
|
Маска
|
255
|
255
|
224
|
0
|
Адрес сети
|
145
|
92
|
???
|
0
|
А вот 101 и 240 надо переводить в двоичный вид. Сделаем это двумя способами.
Способ №1 – традиционный, каскадным делением:
101
|
2
|
|
|
|
|
|
1
|
50
|
2
|
|
|
|
|
|
0
|
25
|
2
|
|
|
|
|
|
1
|
12
|
2
|
|
|
|
|
|
0
|
6
|
2
|
|
|
|
|
|
0
|
3
|
2
|
|
|
|
|
|
1
|
1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
224
|
2
|
|
|
|
|
|
|
0
|
112
|
2
|
|
|
|
|
|
|
0
|
56
|
2
|
|
|
|
|
|
|
0
|
28
|
2
|
|
|
|
|
|
|
0
|
14
|
2
|
|
|
|
|
|
|
0
|
7
|
2
|
|
|
|
|
|
|
1
|
3
|
2
|
|
|
|
|
|
|
1
|
1
|
Применим поразрядную конъюнкцию к полученным числам:
01100101
11100000
01100000
Переведем результат в десятичный вид: 64 + 32 = 96.
IP-адрес
|
145
|
92
|
101
|
88
|
Маска
|
255
|
255
|
224
|
0
|
Адрес сети
|
145
|
92
|
96
|
0
|
Таким способом обучают решать эту задачу. Но есть способ быстрее.
Начнем переводить оба числа в двоичный вид одновременно, путем формирования суммы степеней двойки:
Первый шаг:
101 = 64 + …
-64
37
|
|
224 = 128 + 64 + …
-128
96
-64
32
|
Второй шаг:
101 = 64 + 32 + …
-64
37
-32
5
|
|
|
|
224 = 128 + 64 + 32
-128
96
-64
32
-32
0
|
После 32 остатки у числа 224 закончились. Нам нет необходимости переводить число 201 до конца!
Сравниваем полученные суммы и выбираем общие слагаемые:
64 + 32 = 96
Это и есть ответ. Мы не переводили оба числа полностью и даже не записывали их в двоичном виде.
Подобрать буквы из таблицы для ответа предлагаем читателю сделать самостоятельно.
У решенной задачи есть еще три модификации. Решим их.
Задача 4.6.2. IP-адрес: 145.92.101.88. Маска: 255.255.224.0. Найдите номер компьютера в подсети.
Теория. В IP-адресе компьютера зашиты два адреса – адрес подсети и номер компьютера в подсети. Адрес подсети мы научились находить в прошлой задаче путем поразрядной конъюнкции с маской. Очевидно, что, налагая маску на различные IP-адреса разных компьютеров в одной подсети, мы получим один и тот же адрес подсети. Часть маски подсети, в которой находятся единицы, пропускает биты из IP-адреса компьютера. Следовательно, биты в IP-адресе под единицами маски относятся к адресу подсети. А вот под нулями маски у разных компьютеров подсети могут скрываться разные значения битов. Следовательно, под нулями маски скрываются биты, которые относятся к номеру компьютера в сети.
Традиционный медленный способ.
Последнее число в IP-адресе (88) полностью относится к номеру компьютера, так как соответствующее число в маске – 0. Переведем его в двоичную систему:
88
|
2
|
|
|
|
|
|
0
|
44
|
2
|
|
|
|
|
|
0
|
22
|
2
|
|
|
|
|
|
0
|
11
|
2
|
|
|
|
|
|
1
|
5
|
2
|
|
|
|
|
|
1
|
2
|
2
|
|
|
|
|
|
0
|
1
|
Получится число 1011000
Первые два байта маски равны 255, следовательно, им соответствующие байты IP-адреса относятся к адресу подсети.
Остается посмотреть на биты числа 101, находящиеся под нулями числа 224 в двоичной системе. В двоичную системы мы эти числа уже переводили:
101 = 01100101
224 = 11100000
Берем число 101.
Остается соединить два двоичных числа и перевести в десятичный вид.
Ошибка. Если вы соединили 101 и 1011000 как 1011011000, то вы потеряли один бит. Ведь на 1011000 отводится 1 байт.
Продолжение хода решения.
Добавим недостающий бит и соединим числа:
10101011000 = 8 + 16 + 64 + 256 + 1024 = 1368
Быстрый способ.
Проанализируем сумму из медленного способа:
(8 + 16 + 64) + (256 + 1024)
Первая скобочка 8 + 16 + 64 = 88
Получается, что мы 88 перевели сначала в двоичную систему, а потом обратно в десятичную!
Вторая скобочка:
256 + 1024 = 256 * (1 + 4) = 256 * 5
Обратите внимание на одновременный перевод путем подбора степеней двойки из предыдущей задачи:
101 = 64 + 32 + …
-64
37
-32
5
|
|
224 = 128 + 64 + 32
-128
96
-64
32
-32
0
|
5 – это остаток, который мы так и не перевели в двоичный вид.
Быстрый способ решения заключается в том, чтобы взять непереведенный остаток от адреса, умножить его на 256 и прибавить число из IP-адреса под нулём:
256 * 5 + 88 = 1368.
Ответ: 1368.
Задача 4.6.3. Маска подсети: 255.255.224.0. Сколько различных адресов компьютеров теоретически допускает эта маска, если два адреса (адрес сети и широковещательный) не используют?
Используйте знания комбинаторики (задача 2.2.1).
Мы уже переводили эту маску в двоичный вид в задаче 4.5.1.
Из задачи 4.5.2 мы поняли, что порядковые номера компьютеров в подсети «прячутся» под нулями маски. Так как последний байт маски полностью нулевой, то там 8 битов на адрес компьютера. В числе 224 пять битов нулевые. Следовательно, порядковые номера компьютеров хранятся в 8 + 5 = 13 битах.
Из комбинаторной задачи 2.2.1 следует, что возможное количество номеров компьютеров равно:
213 = 8192
Так как два адреса не используют, то 8192 – 2 = 8190.
Ответ: 8190
Задача 4.6.4. Для узла с IP-адресом 145.92.101.88 адрес сети равен 145.92.96.0. Чему равно максимально возможное значение третьего слева байта маски? Ответ запишите в виде десятичного числа.
Речь идет об обратной операции для поразрядной конъюнкции из задачи 4.5.1.
IP-адрес
|
145
|
92
|
101
|
88
|
Маска
|
???
|
???
|
???
|
???
|
Адрес сети
|
145
|
92
|
96
|
0
|
Попробуем восстановить маску:
Поскольку в старших байтах числа совпадают, то значение маски – все единицы (в десятичном виде - 255), в младшем байте – 0, поэтому маска нулевая:
IP-адрес
|
145
|
92
|
101
|
88
|
Маска
|
255
|
255
|
???
|
0
|
Адрес сети
|
145
|
92
|
96
|
0
|
Для восстановления третьего бита маски нужно перевести соответствующие числа в двоичный вид (для этих чисел перевод мы уже делали в предыдущих задачах):
IP-адрес
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
Маска
|
|
|
|
|
|
|
|
|
Адрес сети
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
Там, где под единицами стоят единицы, надо поставить 1,
Там, где под единицами нули, надо поставить 0:
IP-адрес
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
Маска
|
|
1
|
1
|
|
|
0
|
|
0
|
Адрес сети
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
Теория. Маски делают так, чтобы в них не было нулей и единиц вперемешку (это привело бы к разрывам в нумерации компьютеров в подсети). Например, если бы маска была:
…010, то компьютеры имели бы номера:
0
1
4
5
Недопустимая маска: 11111010
Допустимая маска: 11111000
Продолжение хода решения.
Чтобы сохранить непрерывность номеров компьютеров в подсети, справа от нуля поставим нули, а слева от единицы - единицы:
IP-адрес
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
Маска
|
1
|
1
|
1
|
|
|
0
|
0
|
0
|
Адрес сети
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
(если бы у нас был еще неизвестный бит слева от 1, мы бы его заполнили 1)
А вот между 0 и 1 неопределенность:
IP-адрес
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
Маска
|
1
|
1
|
1
|
*
|
*
|
0
|
0
|
0
|
Адрес сети
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
Поскольку мы ищем максимальную маску, то заполним неопределенность 1:
IP-адрес
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
Маска
|
1
|
1
|
1
|
1
|
1
|
0
|
0
|
0
|
Адрес сети
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
Этот байт маски равен в десятичном виде 248.
Ответ: 248
Задача 4.6.5. Узлы с IP-адресами 98.162.78.139 и 98.162.78.154 находятся в разных сетях. Чему равно наименьшее количество возможных единиц в масках этих сетей?
Маска подсети имеет вид 1…10…0. Мы должны выбрать такое количество единиц в маске, чтобы при наложении её на два IP-адреса мы получили разные адреса сети. Поскольку левые три бита IP-адресов одинаковые, то при выборе количества единиц, меньших или равных 3*8=24 мы получим одинаковые адреса сети:
При маске 255.255.255.xxx
98.162. 78 .139
255.255.255. 0
|
|
98.162. 78 .154
255.255.255. 0
|
98.162. 78 . 0
|
=
|
98.162. 78 . 0
|
Следовательно, биты, соответствующие адресу сети, также находятся и в самом левом байте. Переведем левые байты IP-адресов в двоичный вид и заполним маску единицами так, чтобы мы получили различные адреса сетей:
IP-адрес 1
|
139
|
10001011
|
IP-адрес 2
|
154
|
10011010
|
Маска подсети:
|
|
11110000
|
Следовательно, минимальное количество единиц в маске равно 3 * 8 + 4 = 28.
Ответ: 28
Задача 4.6.6. Петя записал IP-адрес школьного сервера на листке бумаги и положил его в карман куртки. Петина мама случайно постирала куртку вместе с запиской. После стирки Петя обнаружил в кармане четыре обрывка с фрагментами IP-адреса. Эти фрагменты обозначены буквами А, Б, В и Г. Восстановите IP-адрес. В ответе укажите последовательность букв, обозначающих фрагменты, в порядке, соответствующем IP-адресу.
Из предыдущих задач мы знаем, что IP-адрес представляет собой четыре числа меньше или равных 255, соединенных точками. Попытайтесь совместить фрагменты, чтобы выполнялось это условие.
Если пытаться к фрагменту A справа дописать любой другой фрагмент, то ничего не получится, так как число 64…> 255. Слева от А может находиться любой из фрагментов, поэтому А находится в самом конце IP-адреса:
…A
Рассмотрим Г. Этот кусок не может находиться справа. Слева же он совместим с любым другим куском. Следовательно, IP адрес начинается с Г:
Г…А
Остается рассмотреть соединение Б c В. Единственно возможное соединение – БВ. Поэтому IP-адрес:
ГБВА
Ответ: ГБВА
Примечание. Вычислите количество всех возможных перестановок А, Б, В, Г. Если вы забыли, как это делается, то повторите задачу 2.2.2.
Количество перестановок = 1 * 2 * 3 * 4 = 24. Это достаточно много, поэтому надо как-то сократить перебор. При решении задачи мы определили, какие фрагменты могут стоять только в начале, а какие – в конце. Это сужает поиск.