Что такое маска подсети в компьютерных сетях?

Ответ

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

Принцип работы:

  1. Представлена 32-битным числом (для IPv4), где последовательные единицы (1) обозначают сетевую часть, а нули (0) — хостовую.
  2. Применяется побитовая операция AND между IP-адресом и маской для получения адреса сети.

Пример:

  • IP-адрес: 192.168.1.10 (в двоичном виде: 11000000.10101000.00000001.00001010)
  • Маска: 255.255.255.0 (в двоичном виде: 11111111.11111111.11111111.00000000)
  • Адрес сети = IP & Маска = 192.168.1.0

Практическое применение в Java (определение принадлежности к сети):

import java.net.InetAddress;
import java.net.UnknownHostException;

public class SubnetChecker {
    public static boolean isInSameSubnet(String ip1, String ip2, String subnetMask) 
            throws UnknownHostException {
        InetAddress a1 = InetAddress.getByName(ip1);
        InetAddress a2 = InetAddress.getByName(ip2);
        InetAddress mask = InetAddress.getByName(subnetMask);

        byte[] b1 = a1.getAddress();
        byte[] b2 = a2.getAddress();
        byte[] m = mask.getAddress();

        for (int i = 0; i < b1.length; i++) {
            if ((b1[i] & m[i]) != (b2[i] & m[i])) {
                return false; // Адреса в разных подсетях
            }
        }
        return true; // Адреса в одной подсети
    }

    public static void main(String[] args) throws UnknownHostException {
        System.out.println(isInSameSubnet("192.168.1.10", "192.168.1.20", "255.255.255.0")); // true
        System.out.println(isInSameSubnet("192.168.1.10", "192.168.2.10", "255.255.255.0")); // false
    }
}

Зачем это нужно? Маски подсети позволяют эффективно делить большие сети на меньшие (подсети) для улучшения маршрутизации, безопасности и управления.

Ответ 18+ 🔞

А, маска подсети, ёпта! Ну это ж классика, блядь, как "Муму" у Тургенева, только без утопления собаки, но с тем же трагическим максимализмом, сука!

Представь себе, что IP-адрес — это, блядь, адрес дома. Ну, типа, "улица Ленина, дом 10, квартира 5". Так вот, маска подсети — это такая, блядь, хитрая жопа, которая говорит: "Слушай, чувак, а давай мы тут на хуй забьём на квартиры и будем смотреть только на улицу и дом!". Или наоборот: "А давай мы будем смотреть на каждый горшок с цветком на балконе!".

Как эта падла работает, блядь:

  1. Это просто 32 бита (для нашего старого доброго IPv4), где сплошные единички (1) кричат: "ЭТО СЕТЬ, БЛЯДЬ, ТУТ НЕ ЛЕЗЬ!", а нулики (0) шепчут: "А тут уже хост, можно похавать, тут наши ребята".
  2. Чтобы выяснить, кто в какой сети, надо наложить эту маску на IP через операцию AND. Это как умножить, но только для битов, сука. Если оба бита единицы — будет единица. Всё остальное — ноль, в рот меня чих-пых!

Пример, чтобы не обосраться:

  • Адрес узла: 192.168.1.10 (внутри: 11000000.10101000.00000001.00001010)
  • Маска: 255.255.255.0 (внутри: 11111111.11111111.11111111.00000000)
  • Адрес сети = IP & Маска = 192.168.1.0

Видишь? Маска 255.255.255.0 сказала: "Первые три октета — это святое, это сеть, а последний октет — это уже ваши разборки, похуй". Вот и получилась сеть 192.168.1.0.

А вот как это на Java проверить, чтобы не быть, как Герасим, немым и тупым:

import java.net.InetAddress;
import java.net.UnknownHostException;

public class SubnetChecker {
    public static boolean isInSameSubnet(String ip1, String ip2, String subnetMask)
            throws UnknownHostException {
        InetAddress a1 = InetAddress.getByName(ip1);
        InetAddress a2 = InetAddress.getByName(ip2);
        InetAddress mask = InetAddress.getByName(subnetMask);

        byte[] b1 = a1.getAddress();
        byte[] b2 = a2.getAddress();
        byte[] m = mask.getAddress();

        for (int i = 0; i < b1.length; i++) {
            if ((b1[i] & m[i]) != (b2[i] & m[i])) {
                return false; // Адреса в разных подсетях, пиздец, не пущаем!
            }
        }
        return true; // Адреса в одной подсети, проходи, братан
    }

    public static void main(String[] args) throws UnknownHostException {
        System.out.println(isInSameSubnet("192.168.1.10", "192.168.1.20", "255.255.255.0")); // true
        System.out.println(isInSameSubnet("192.168.1.10", "192.168.2.10", "255.255.255.0")); // false
    }
}

А нахуя это всё, спрашивается? Да чтобы порядок был, блядь! Чтобы не было, как в той басне: все пиздуют по одной большой сети, друг другу пакеты мешают, безопасность — хуй, а трафик — как говно в проруби. Маска позволяет разбить эту толпу на аккуратные дворы-подсети. Для маршрутизации (чтобы знать, куда слать), для безопасности (чтобы чужие не лезли) и для управления, чтобы не было, блядь, бардака. Вот и вся философия, ебать мои старые костыли!