← Назад к вопросам

Что такое маска подсети и как рассчитать количество хостов в сети?

1.6 Junior🔥 212 комментариев
#Сети и протоколы

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое маска подсети?

Маска подсети (subnet mask) — это 32-битное число, которое определяет, какая часть IP-адреса относится к адресу сети, а какая — к адресу хоста в этой сети. Она используется совместно с IP-адресом для разделения сети на подсети и эффективного управления сетевым трафиком. Маска подсети состоит из последовательности битов «1» (определяющих сетевую часть) и «0» (определяющих часть хоста). Например, для IPv4 маска 255.255.255.0 в бинарном виде выглядит как 11111111.11111111.11111111.00000000, означая, что первые 24 бита IP-адреса — это сетевой префикс, а оставшиеся 8 бит — адрес хоста.

Маска подсети играет ключевую роль в:

  • Сегментации сетей: Помогает разбить большую сеть на меньшие подсети для улучшения производительности и безопасности.
  • Маршрутизации: Позволяет маршрутизаторам определять, находится ли адрес назначения в локальной сети или его нужно переслать в другую сеть.
  • Управления IP-адресами: Экономно распределяет адресное пространство, уменьшая количество «пустых» адресов.

Как рассчитать количество хостов в сети?

Количество хостов в подсети зависит от количества бит, отведённых под адрес хоста в маске подсети. Расчёт проводится по формуле:

Формула для расчёта числа хостов

  1. Определите количество бит хоста в маске подсети. Это биты, установленные в «0» в маске. Например, для маски /24 (или 255.255.255.0) таких бит 8.
  2. Используйте формулу: Число хостов = 2^n - 2, где n — количество бит хоста.
    • Вычитание 2 связано с зарезервированными адресами: первый адрес в подсети (адрес сети) и последний (широковещательный адрес) не могут быть назначены хостам.

Примеры расчёта

  • Для маски /24 (8 бит хоста):
    2^8 - 2 = 256 - 2 = 254 доступных хоста
    
  • Для маски /26 (6 бит хоста):
    2^6 - 2 = 64 - 2 = 62 доступных хоста
    

Практический пример с IP-адресом

Допустим, у нас есть сеть 192.168.1.0 с маской 255.255.255.128 (или /25 в префиксной записи).

  1. Переводим маску в бинарный вид:

    255.255.255.128 = 11111111.11111111.11111111.10000000
    

    Здесь 25 бит для сети (единицы) и 7 бит для хоста (нули).

  2. Рассчитываем количество хостов:

    2^7 - 2 = 128 - 2 = 126 доступных хостов
    
  3. Определяем диапазон адресов:

    • Адрес сети: 192.168.1.0
    • Первый доступный хост: 192.168.1.1
    • Последний доступный хост: 192.168.1.126
    • Широковещательный адрес: 192.168.1.127

Код для автоматического расчёта (Python)

Для быстрого вычисления можно использовать Python:

def calculate_hosts(subnet_mask):
    # Преобразуем маску в количество бит хоста
    if subnet_mask.startswith('/'):
        cidr = int(subnet_mask[1:])
        host_bits = 32 - cidr
    else:
        # Для формата типа "255.255.255.0"
        octets = subnet_mask.split('.')
        binary_mask = ''.join([bin(int(octet))[2:].zfill(8) for octet in octets])
        host_bits = binary_mask.count('0')
    
    total_hosts = 2 ** host_bits
    usable_hosts = total_hosts - 2  # Исключаем адрес сети и широковещательный
    
    return {
        'host_bits': host_bits,
        'total_addresses': total_hosts,
        'usable_hosts': usable_hosts
    }

# Примеры использования
print(calculate_hosts('/24'))  # {'host_bits': 8, 'total_addresses': 256, 'usable_hosts': 254}
print(calculate_hosts('255.255.255.192'))  # {'host_bits': 6, 'total_addresses': 64, 'usable_hosts': 62}

Важные исключения и современные практики

  • Сети /31: Используются для point-to-point линков (например, между маршрутизаторами) и имеют 2^1 = 2 адреса, но по RFC 3021 оба адреса могут использоваться, без вычитания 2.
  • Сети /32: Один адрес, часто используется для loopback-интерфейсов.
  • IPv6: В IPv6 расчёт проще — обычно выделяются огромные подсети с 64 битами для хостов, и вычитание адресов не требуется в большинстве случаев.

Расчёт количества хостов — базовая, но критическая задача для DevOps-инженера при проектировании сетевой инфраструктуры, настройке облачных сред (AWS VPC, GCP Subnets) или контейнеризированных приложений.