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

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

1.3 Junior🔥 81 комментариев
#Другое

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Маска подсети

Маска подсети (subnet mask) — это 32-битное число в IPv4, которое определяет, какая часть IP-адреса относится к сетевому адресу, а какая — к адресу хоста в этой сети. Она используется для разделения IP-адресов на сетевые подсети и является фундаментальным понятием в компьютерных сетях.

Как работает маска подсети

Маска подсети состоит из последовательности единиц (1), за которыми следует последовательность нулей (0). Единицы обозначают сетевую часть адреса, нули — хостовую часть.

Пример маски подсети:

  • Десятичный формат: 255.255.255.0
  • Двоичный формат: 11111111.11111111.11111111.00000000
  • CIDR нотация: /24

Применение маски подсети

Для определения сетевого адреса выполняется поразрядная конъюнкция (AND) между IP-адресом и маской подсети:

public class SubnetMaskExample {
    public static void main(String[] args) {
        // IP-адрес: 192.168.1.130
        // Маска подсети: 255.255.255.0 (/24)
        
        String ipAddress = "192.168.1.130";
        String subnetMask = "255.255.255.0";
        
        // Результат операции AND:
        // 192.168.1.130 AND 255.255.255.0 = 192.168.1.0
        // Это сетевой адрес подсети
        
        byte[] ip = {(byte)192, (byte)168, 1, (byte)130};
        byte[] mask = {(byte)255, (byte)255, (byte)255, 0};
        byte[] network = new byte[4];
        
        for (int i = 0; i < 4; i++) {
            network[i] = (byte)(ip[i] & mask[i]);
        }
        
        System.out.println("IP: " + ipToString(ip));
        System.out.println("Маска: " + ipToString(mask));
        System.out.println("Сетевой адрес: " + ipToString(network));
    }
    
    static String ipToString(byte[] bytes) {
        return String.format("%d.%d.%d.%d",
            bytes[0] & 0xFF, bytes[1] & 0xFF,
            bytes[2] & 0xFF, bytes[3] & 0xFF);
    }
}

Стандартные маски подсети

CIDRМаскаХостов в сетиИспользование
/24255.255.255.0254Локальная сеть (LAN)
/25255.255.255.128126Подсети
/26255.255.255.19262Маленькие подсети
/30255.255.255.2522Связь маршрутизаторов
/16255.255.0.065534Большие сети
/8255.0.0.016777214Огромные сети

Вычисление количества адресов

Количество адресов в подсети вычисляется по формуле:

  • Адресов в сети = 2^(32 - CIDR)
  • Адресов хостов = 2^(32 - CIDR) - 2 (вычитаем сетевой и широковещательный адреса)

Пример:

  • Маска /24: 2^(32-24) = 2^8 = 256 адресов, из них 254 для хостов
  • Маска /30: 2^(32-30) = 2^2 = 4 адреса, из них 2 для хостов

Практическое применение в Java сетевых приложениях

import java.net.InetAddress;

public class NetworkCalculations {
    public static boolean isInSubnet(String ipAddress, String subnetCIDR) 
            throws Exception {
        String[] parts = subnetCIDR.split("/");
        String networkAddress = parts[0];
        int prefixLength = Integer.parseInt(parts[1]);
        
        // Преобразуем IP-адреса в 32-битные целые числа
        int ip = ipToInt(InetAddress.getByName(ipAddress));
        int network = ipToInt(InetAddress.getByName(networkAddress));
        
        // Создаём маску подсети
        int mask = (0xFFFFFFFF << (32 - prefixLength));
        
        // Проверяем, находится ли IP в подсети
        return (ip & mask) == (network & mask);
    }
    
    private static int ipToInt(InetAddress addr) {
        byte[] octets = addr.getAddress();
        int result = 0;
        for (byte octet : octets) {
            result = (result << 8) | (octet & 0xFF);
        }
        return result;
    }
    
    public static void main(String[] args) throws Exception {
        // Проверяем, находится ли 192.168.1.100 в подсети 192.168.1.0/24
        boolean inSubnet = isInSubnet("192.168.1.100", "192.168.1.0/24");
        System.out.println("IP в подсети: " + inSubnet); // true
        
        inSubnet = isInSubnet("192.168.2.100", "192.168.1.0/24");
        System.out.println("IP в подсети: " + inSubnet); // false
    }
}

Почему маска подсети важна для Java-разработчиков

Хотя Java-разработчики редко работают напрямую с масками подсетей, их понимание критично для:

  • Конфигурирования микросервисных архитектур в Docker/Kubernetes
  • Сетевой безопасности и настройки firewall правил
  • Отладки сетевых проблем в распределённых приложениях
  • Работы с облачными сервисами (AWS, Azure), где управление VPC требует знания подсетей
  • Развёртывания приложений в корпоративных сетях с несколькими подсетями

Маска подсети — это основной инструмент для логической организации IP-адресов и обеспечения правильной маршрутизации пакетов в компьютерных сетях.