6.8. Перевод сетевой маски между системами точечно-десятичной, точечно-шестнадцатеричной или CIDR

Описание.  Кандидат BSDA должен знать как устроена адресация IPv4 и как конвертировать адреса и сетевые маски из одного формата в другой.

Комментарий

Кому-то это может показаться странным, но на экзамене CISCO CCNA требуется умение в уме, без помощи калькулятора, переводить десятичные числа в двоичные. Люди могут попытаться возразить: как же так, уж у администратора всегда под рукой есть, не только калькулятор, но целый компьютер! Что тут можно сказать, элементарные навыки устного счёта входят в необходимый багаж знаний каждого жителя современного мегаполиса, а перевод подсетей из одного формата в другой, входит в необходимые культурные навыки каждого администратора. Не уметь в уме перевести маску подсети ***/26 в 255.255.255.192, это всё равно что в театре в носу ковырять, простите.

Однако жить вообще без калькулятора так же глупо, как глупо не уметь обходиться без него. Тем, кому нужен подобный сервис можно порекомендовать порт ipcalc:

$ ipcalc 192.168.0.1/26
Address: 192.168.0.1   11000000.10101000.00000000.00 000001
Netmask: 255.255.255.192 = 26 11111111.11111111.11111111.11 000000
Wildcard: 0.0.0.63    00000000.00000000.00000000.00 111111
=>
Network: 192.168.0.0/26  11000000.10101000.00000000.00 000000
HostMin: 192.168.0.1   11000000.10101000.00000000.00 000001
HostMax: 192.168.0.62   11000000.10101000.00000000.00 111110
Broadcast: 192.168.0.63   11000000.10101000.00000000.00 111111
Hosts/Net: 62     Class C, Private Internet
  

В данном разделе я опишу что такое маска подсети, формат CIDR, а затем опишу удобные приёмы устного пересчёта десятичных чисел в двоичные.

6.8.1. Что такое маска подсети

При помощи маски подсети система роутинга определяет находится ли данный адрес IP в данной подсети. Для этого используется операция побитового сложения. Маска подсети обязана состоять из некоторого количества единиц идущих подряд и следом за ними нулей. Маска подсети однозначно определяет насколько много адресов может быть в данной сети. Адрес находится в нашей подсети, если после побитового сложения с маской подсети, он дал адрес подсети (или т.н. базовый IP-адрес).

Рассмотрим пример: Пусть у нас есть адреса 192.168.0.1 и 192.168.0.65, какой из них находится в подсети 192.168.0.0 с маской 255.255.255.192 (Или в нотации CIDR 192.168.0.0/26). Побитовое сложение: 1+1=1 (истина и истина = истина), 1+0=0+1=0, 0+0=0.

192.168.0.1  = 11000000.10101000.00000000.00000001
255.255.255.192 = 11111111.11111111.11111111.11000000
сумма   = 11000000.10101000.00000000.00000000 = 192.168.0.0

192.168.0.65 = 11000000.10101000.00000000.01000001
255.255.255.192 = 11111111.11111111.11111111.11000000
сумма   = 11000000.10101000.00000000.01000000 = 192.168.0.64
  

Как видно, адрес 192.168.0.65 при сложении с маской подсети дал другую подсеть, он находится в подсети 192.168.0.64/26.

6.8.2. Маска подсети в формате CIDR

Как видно, маска подсети обязана состоять из некоторого количества единиц и следующих за ними нулей. В десятичной записи, маска подсети должна состоять из 0 и более байтов 255, и следующего за ними байта 0, либо 128 (1000 0000), либо 192 (1100 0000), либо 224, либо 240, либо 248, 252 (1111 1100). Бит 254 невозможен, так как в этом случае не останется адресов ни для одного хоста (в такой сети будет возможно только два адреса, при этом один будет соостветствовать адресу сети, а другой широковещательному адресу).

Таким образом, интересна не сама маска, а её длина. В нотации CIRD указывается сколько бит занимает маска подсети. Например, маска 255.255.255.192 занимает 8+8+8+2 бита и равна 26. Записывают её через дробь с адресом подсети: 192.168.0.0/26. Следующая подсеть с такой же маской — 192.168.0.64/26. Если адрес сети заканчивается на нули, то иногда их не указывают. Ряд приложений может понять запись 192.168/26, дополнив недостающие байты нулями, другие могут и не понять. (И вообще, запись CIDR, понимают далеко не все программы, увы.)

6.8.3. Перевод десятичных чисел в двоичные

Операции устного сложения и вычитания даются человеку легче, чем операции умножения и деления, поэтому не стоит пытаться последовательно делить десятичное число на степени двойки, вычисляя остатки. Лучше сразу вычитать из числа степени двойки. Конечно вы можете избрать любой удобный для вас алгоритм, я делаю это так:

Пусть надо представить в двоичном формате число 170.

Для начала нам понадобится таблица степеней двойки:

2021222324252627
1248163264128

Теперь мы будем последовательно сравнивать наше число со степенями двойки, если число больше либо равно степени, мы записываем единицу, и вычитаем из числа степень двойки, если меньше, записываем ноль и идём дальше:

170>128 ⇒ 1 170-128=42
 42<64 ⇒ 0
 42>32 ⇒ 1  42-32=10
 10<16 ⇒ 0
 10>8 ⇒ 1  10-8=2
 2<4 ⇒ 0 
 2=2 ⇒ 1  2-2=0
 0<1 ⇒ 0

Итого: 170 = 10101010
  

Обратное преобразование делается ещё проще: надо просто сложить те степени двойки, которым соответствуют единицы в двоичном числе.


Обновлено: 12.03.2015