IP-адрес, маска и подсеть
Почему маска выделяет сеть, откуда берутся крайние адреса и как свободные биты определяют размер подсети и число единиц.
IPv4-адрес — адрес сетевого интерфейса, через который устройство подключается к сети. В задачах он выглядит как четыре числа через точки, но работа маски становится понятной в двоичной записи. Маска задаёт границу: слева находится общая часть адресов подсети, справа — биты, которые меняются внутри неё.
Четыре октета и 32 бита
Бит принимает значение 0 или 1. Октет — группа из восьми битов. IPv4-адрес состоит из четырёх октетов, всего из 4\cdot8=32 битов. В привычной записи каждый октет заменён десятичным числом. Наибольшая двоичная запись октета — 11111111_2. Её значение получается сложением весов всех восьми разрядов: 128+64+32+16 и 8+4+2+1, всего 240+15=255.
Поэтому числа между точками лежат от 0 до 255 включительно. Точки разделяют октеты, но не обозначают границу сети. Например, у числа 76 двоичная запись 1001100_2; внутри адреса она дополняется слева нулём до 01001100_2. Значение не меняется, а все октеты занимают ровно восемь позиций.
Маска и общий префикс
В рассматриваемой бесклассовой адресации единицы маски идут подряд от старших разрядов, затем следуют нули. Биты адреса под единицами маски составляют сетевую часть. Это общий префикс адресов подсети. Биты под нулями маски составляют узловую часть.
Пусть p — число единиц маски, а h — число её нулей. Всего разрядов 32, поэтому p+h=32 и h=32-p. Запись /28 означает 28 единиц маски, то есть четыре свободных узловых бита. Такая маска — 255.255.255.240.
| Часть маски | Её биты |
|---|---|
| Каждый из первых трёх октетов | \mathtt{11111111} |
| Четвёртый октет | \mathtt{1111}\mid\mathtt{0000} |
Черта показывает границу внутри последнего октета. Она не обязана совпадать с точкой. Правило общего префикса и запись его длины определены в RFC 4632, раздел 3.1 ↗.
Почему побитовое И находит сеть
Побитовое И, или поразрядная конъюнкция, применяется отдельно к каждой паре битов на одинаковых позициях. Единица получается, только если оба исходных бита равны 1.
| Бит маски | Что происходит с битом адреса |
|---|---|
| 1 | 0\land1=0,\quad1\land1=1: бит сохраняется |
| 0 | 0\land0=0,\quad1\land0=0: бит обнуляется |
Пусть A — адрес узла, M — маска, N — адрес сети. Тогда N=A\land M. В результате остаётся общий префикс, а узловая часть заполняется нулями. Именно этот наименьший адрес используется для обозначения всей подсети.
Учебный пример: адрес 192.168.1.76 и маска 255.255.255.240. В последнем октете адреса записано 01001100_2, в маске — 11110000_2. Побитовое И сохраняет первые четыре бита и обнуляет остальные: получается 01000000_2=64. Адрес сети — 192.168.1.64. У любого адреса этой подсети первые 28 битов совпадают; последние четыре перебирают все варианты.
Размер подсети и крайние адреса
При h свободных битах каждый из них имеет два значения. Независимый выбор даёт 2^h адресов. Узловая часть как двоичное число меняется от 0 до 2^h-1 включительно. Если считать целый IP-адрес одним 32-битным числом, диапазон имеет вид:
N\le A\le N+2^h-1.
У левого края все узловые биты равны нулю — это адрес сети. У правого все они равны единице — это широковещательный адрес обычной подсети, адрес обращения ко всем её узлам. Обозначим его B; тогда B=N+2^h-1.
В учебном примере h=4, всего 2^4=16 адресов. Последний октет меняется от 64 до 64+16-1=79. Единица вычитается потому, что адрес с нулевой узловой частью уже является первым из шестнадцати.
| Назначение | Учебный пример |
|---|---|
| Адрес сети | 192.168.1.64 |
| Первый адрес компьютера | 192.168.1.65 |
| Последний адрес компьютера | 192.168.1.78 |
| Широковещательный адрес | 192.168.1.79 |
Строки об адресах компьютеров предполагают обычную подсеть с h\ge2, в которой два крайних адреса не назначаются узлам. Тогда первый доступный адрес равен N+1, последний — B-1, их количество — 2^h-2.
Вопрос о числе всех IP-адресов подсети не требует вычитать два. Адрес сети и широковещательный адрес остаются элементами диапазона, даже когда их запрещено назначать компьютерам. Дополнительное условие, например на число единиц, проверяется и для них.
Единицы постоянной и переменной частей
Пусть c — число единиц общего префикса. Оно одинаково для всех адресов подсети. Если в узловой части некоторого адреса j единиц, то во всём адресе их c+j. Нулевые разряды не добавляют единиц, но определяют позиции, где единицы могут появиться.
Например, при трёх свободных битах ровно одна единица встречается в трёх окончаниях: \mathtt{001},\ \mathtt{010},\ \mathtt{100}. Ноль единиц даёт одно окончание, \mathtt{000}. Число окончаний с заданным числом единиц зависит от выбора их позиций.
Число способов выбрать j позиций из h обозначается \binom{h}{j} и называется числом сочетаний. После выбора позиций в них ставятся единицы, а в остальных — нули. Поэтому адресов с c+j единицами ровно \binom{h}{j}.
Для делимости числа единиц на положительное целое k выбираются те значения j от 0 до h, при которых (c+j)\bmod k=0. Здесь \bmod означает остаток от деления. Количества адресов для этих значений складываются. Для условия «не кратно» можно вычесть полученную сумму из 2^h.
Например, при c=15 и h=3 число 15+j кратно 4 только при j=1. Таких адресов три: единица занимает одну из трёх позиций. Не кратных 4 — 2^3-3=5. Это тот же подсчёт, что перебор восьми окончаний, но сгруппированный по числу единиц.
Применение в заданиях
Почему для последнего компьютера нужен адрес перед широковещательным, а при подсчёте по числу единиц оба края могут войти в ответ? Как получить сеть, если маска заканчивается посреди октета?
Эти вопросы разобраны в статье «Задание №10. Адрес сети, узлы и подсчёт IP-адресов».