Что такое октеты в IP-адресе?

«Что такое октеты в IP-адресе?» — вопрос из категории Сети, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Октет в контексте IP-адресации — это группа из 8 битов (1 байт). IPv4-адрес, имеющий длину 32 бита, традиционно представляется в виде четырёх десятичных октетов, разделённых точками (dot-decimal notation), например, 192.168.1.1.

Детали:

  • Каждый октет может принимать значения от 0 до 255 (поскольку 2⁸ = 256).
  • Такое представление было выбрано для удобства чтения и запоминания человеком, в отличие от работы с одним 32-битным числом.
  • В сетевом программировании на C/C++ IP-адрес часто хранится в бинарном виде (например, в структуре in_addr), но для конфигурации и вывода преобразуется в строку с октетами.

Пример работы с октетами в C++:

#include <iostream>
#include <arpa/inet.h> // для inet_pton, inet_ntop

int main() {
    // IPv4-адрес как 32-битное целое число в сетевом порядке байт (big-endian)
    in_addr_t ip_binary;
    // Преобразование строки с октетами в бинарный формат
    inet_pton(AF_INET, "10.20.30.40", &ip_binary);

    // Доступ к отдельным октетам через побитовые операции
    unsigned char *octets = (unsigned char*)&ip_binary;
    // Порядок октетов в памяти зависит от endianness. 
    // После inet_pton октеты в сетевом порядке (big-endian):
    // octets[0] = 10, octets[1] = 20, octets[2] = 30, octets[3] = 40

    std::cout << "Октеты адреса: ";
    for(int i = 0; i < 4; ++i) {
        std::cout << (int)octets[i]; // Приведение к int для вывода числа, а не символа
        if(i < 3) std::cout << '.';
    }
    std::cout << std::endl;

    // Манипуляции с октетами (например, изменение третьего октета)
    octets[2] = 100; // Меняем 30 на 100

    // Обратное преобразование в строку
    char ip_str[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &ip_binary, ip_str, INET_ADDRSTRLEN);
    std::cout << "Новый адрес: " << ip_str << std::endl; // Выведет: 10.20.100.40

    return 0;
}

Октеты являются фундаментальным понятием для работы с IP-адресами, масками подсетей (которые также состоят из 4 октетов) и для понимания принципов разбиения сети на подсети (subnetting).