Недавно мне довелось проводить собеседование с соискателями на должность инженера-программиста в нашу компанию. Обязательным условием приема на работу было - хорошее знание и понимания основ функционирования локальных вычислительных сетей (ЛВС). По итогам собеседования я поразился тому, что ребята, которые совсем недавно закончили ВУЗы города по техническим специальностям, плохо понимают, что такое маска подсети. В этом посте я проведу небольшую работу над их ошибками.
Практически все на вопрос: “Что такое маска подсети?“, бодро выдавали общее определение, мол маска подсети - это битовая маска, которая в результате применения побитовой конъюнкции к IP-адресу позволяет определить адрес сети. И тут же терялись когда я задавал вопрос: “Почему адрес 192.168.111.64 не может быть адресом хоста при маске 255.255.255.192?“.
Чтобы хоть немного прояснить этот вопрос, давайте разберемся - из каких частей состоит адресное пространство любой подсети:
- Адрес подсети;
- Адреса хостов в подсети;
- Широковещательный адрес (Broadcast).
Это адрес который используется для организации маршрутизации между несколькими подсетями. При получении IP-адреса хоста маршрутизатор накладывает на него маску и определяет адрес подсети, затем по этому адресу определяется адрес шлюза на который нужно отправить пакет.
Это набор IP-адресов, которые могут быть выданы хостам. Чтобы подсчитать количество адресов, нужно от общего количества адресов подсети отнять два адреса. При обмене пакетами между хостами в одной подсети маршрутизатор и шлюз не нужны.
Это адрес который не присвоен ни одному хосту в подсети. Данный адрес используется для отправки широковещательных пакетов, которые предназначены каждому хосту подсети.
Здесь нужно понимать, что широковещательный адрес необязательно должен иметь на конце цифру 255 (например, 192.168.111.255), а адрес сети 0 (например, 192.168.111.0). Это заблуждение связано с тем, что в большинстве примеров, которые приводятся в различных учебных материалах, выбирается самая простая маска подсети - 255.255.255.0 (речь идет о сетях класса “С” естественно), и в данном случае broadcast действительно будет иметь на конце цифру 255, а адрес сети заканчиваться на 0. Но для других масок адрес подсети и broadcast могут принимать другие значения, например для ранее приведенного вопроса адрес подсети - 192.168.111.64, а широковещательный адрес - 192.168.111.127.
Конечно, в голове применять побитовые вычисления может не каждый, но для сетей класса “С” эта задача вполне выполнима. Если же эти вычисления ну никак не даются, то аналогичные результаты можно получить аналитическим путем. Например, 256-192 = 64 (здесь 192 - это последняя тетрада маски подсети) следовательно в каждой подсети всего 64 адреса из которых 62 адреса могут быть присвоены хостам, а 2 будут использоваться для широковещательных пакетов и адреса подсети. Отсюда IP-адреса 192.168.111.0, 192.168.111.64, 192.168.111.128, 192.168.111.192 будут адресами подсетей (в качестве адреса подсети всегда используется первый ip-адрес подсети). Очевидно, что раз максимальное количество IP-адресов в сетях класса “C” равно 256, то можно получить только 4 подсети.
Чтобы окончательно внести ясность в этот вопрос, привожу ответ, который я ожидал услышать от соискателей: при указанной маске адрес 192.168.111.64 - является адресом подсети и использоваться для адреса хоста не может.
Есть еще один вопрос, на который так же очень часто давали неверный ответ: “Какой размер у самой маленькой подсети?“. Здесь многие называли цифру - 3. Так же некоторые считали, что в такой сети может быть 2 адреса. Правильный ответ - 4. Почему? Давайте разберемся.
У маски подсети существует два наиболее часто используемые формы записи:
- десятичный вид ( 255.255.255.192 );
- двоичный вид( 11111111.11111111.11111111.11000000 ).
Данный вид записи наверное знаком каждому, поэтому никаких дополнительных пояснений не требует.
Здесь я немного искажаю действительность, потому что на практике используют запись следующего вида: 192.168.111.0/26, где 192.168.111.0 - адрес подсети, а /26 - количество единиц в двоичном представлении маски.
В двоичном виде маска подсети всегда(!) как правило представляет собой единицы идущие подряд слева направо. Т.е. масок вида 11111111.11111111.11111111.11001100 не бывает. При таком разбиении существует всего 8 возможных окончаний для масок в сетях класса “C” ( для упрощения дальнейшего изложения, я буду использовать только последнюю тетраду маски). Очевидно, что маска 11111111 определяет “пустую” подсеть, поэтому использовать ее бессмысленно, маска 11111110 определять подсеть из двух адресов, один из которых - адрес подсети, другой - широковещательный адрес. Создавать такую подсеть так же не имеет никакого смысла. Следующая возможная маска - 11111100 определяет сеть из 4-х адресов, два из которых используются под адрес сети и boradcast, а два могут быть адресами хоста. Обычно в такой подсети один адрес - это адрес шлюза (gateway), а другой адрес хоста.
При ответе на этот вопрос нужно было понимать особенности построения масок подсетей и сказать, что минимальная подсеть может иметь 4-е адреса.
Возможно, некоторые подумают, что программисту подобные детали знать совсем не обязательно, ведь как правило вопросы связанные с организацией сетей решают системные администраторы. Но на мой взгляд, подобная точка зрения не совсем верна, программист должен уметь выражать свои мысли на языке понятном системному администратору. А то знаете ли, глупо просить сетку из одного адреса для тестирования и возмущаться, когда вместо одного адреса выдается целых четыре. Если вы не согласны со мной, то смело выражайте свое мнение в комментариях!
Статья предназначена для размещения на блоге www.codeart.ru

Лучшие комментарии
Imp
Гость
Вы говорите что минимально возможной подсетью является подсеть из 4 адресов (2 на хосты и 2 служебных)
Допустим, что мы хотим сделать так, чтобы хост с другим хостом общались через маршрутизатор. Ничто не мешает задать маску в 32 бита. Вот вам и подсеть на 1 адрес.
Но при этом не получиться просто задать маршрутизатор. Придётся задавать интерфейс через который ходить на маршрутизатор и уже потом указывать маршрут.
Umma
Гость
Очень спорные моменты есть.
——-
Очевидно, что маска 11111111 определяет “пустую” подсеть, поэтому использовать ее бессмысленно, маска 11111110 определять подсеть из двух адресов, один из которых - адрес подсети, другой - широковещательный адрес. Создавать такую подсеть так же не имеет никакого смысла.——-
Маска /32 используется ОЧЕНЬ часто. Все (почти) PPP соединения (модем, PPPoE, PPtP) - работают с маской /32. В маршрутизаторах лупбеки с маской /32 используются для специальных целей. Как для целей “хитрой” маршрутизации, так и для управления. Очень распространенная идея - лупбеки управления роутером делать с маской /32 и пихать их в динамическую маршрутизацию. Это дает доступность адреса при доступности хотя бы одного маршрута до роутера.
Маску /31 тоже можно использовать на PtP линках. Например, серийный линк между двумя роутерами. Конечно, не все оборудование это умеет. Тем не менее, и маска /31 имеет право на жизнь.
Фёдор Самородов
Гость
Евгений прав. Прерывающихся (non-continuous) масок подсети нет и быть не может.
Пример, который привёл Игорь - это не маска подсети, это нечто другое. И Гугл правильно называет это network mask, а не subnet mask. Потому что эти самые non-continuous network masks не решают тех задач, для которых собственно и были придуманы маски подсетей.
Non-continuous network masks - всего лишь экзотический способ группировки IP-адресов, не более того.
Umma
Гость
Фёдор Самородов: Network Mask и Subnet mask - это одно и тоже. Всего лишь вопрос терминологии. Это маска, которая отделяет биты сети от битов хоста.
На курсах CISCO нам говорили, что “дырявые” маски - существуют. И CISCO их нормаль поддерживает. Более того, Вам привели пример, как это может использоваться.
http://www.tcpipguide.com/free/t_IPSubnetMasksNotationandSubnetCalculations-4.htm
———
RFC 950 actually specified that when splitting the bits in the host ID for subnet ID and host ID, it was possible to split it in more than one place! In the example above, we could, instead of splitting the 16 bits into 5 bits for subnet ID and 11 for host ID, have done it as 2 bits for the subnet ID, then 4 bits for the host ID, then 3 more bits for the subnet ID and finally 7 more bits for host ID. This would be represented by the subnet mask pattern “11000011 10000000” for those sixteen bits (following the sixteen ones for the network ID).
Why do this instead of just dividing as 5 bits for subnet ID followed by 11 bits for host ID as we did before? I have no idea. J In fact, most other people had no idea either. Trying to subnet this way makes assigning addresses extremely confusing. For this reason, while it was technically legal, the use of non-contiguous subnet masking was not recommended, and not done in practice.
Given that non-contiguous masks are not used, and today’s computers are more efficient, the alternative method of expressing masks with just a single number is now often used. Instead of specifying “IP address of 154.71.150.42 with subnet mask of 255.255.248.0”, we can just say “154.71.150.42/21”. This is sometimes called slash notation or CIDR notation. It is more commonly used in variable-length masking (VLSM) environments, and as the second name implies, is also the standard for specifying classless addresses under the CIDR addressing scheme. However, it is also sometimes seen in regular subnetting discussions.
Фёдор Самородов
Гость
Умма, если желаете использовать терминологию Циски, пожалуйста. Давайте спросим, что по этому поводу думает Циска. А Циска считает (пишет в документации, учебниках и в руководствах), что:
Маска подсети - это то, что Циска называет Subnet Mask. Она используется для выделения подсетей.
А “дырявые маски” Циска называет Wildcard Mask (чувствуете семантические намёки? :-))). Wildcard Mask тоже может использоваться для группировки IP-адресов, но такая группа адресов не обладает признаками подсети. Да, где-то может быть такой экзотический способ может быть удобен (например, на файрволлах, где нужно выделить из всего трафика какую-то его часть и к этой части применить какое-то правило). Но для деления сети на подсети “дырявые маски” не подходят.
Попробуйте ввести такую дырявую маску где-нибудь в настройках на Циске. В тех местах, где настраивается подсеть, Циска этого сделать не позволит.
bg
Гость
Да, вот и попадись такому специалисту при “соискании”.
Дело в том, афтар, что верный ответ на вопрос “Какой размер у самой маленькой подсети?”, всё таки, 2!
Маска /31 (или …254) является исключением, описанным в RFC3021, для двух-хостовых соединений, которым не нужны шлюзы и броадкасты.
Учите матчасть, сударь.
http://www.faqs.org/rfcs/rfc3021.html