Что такое модель OSI?

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

Ответ

Модель OSI (Open Systems Interconnection) — это эталонная модель, описывающая 7 уровней взаимодействия в сетях. Она стандартизирует коммуникацию между различными системами, где каждый уровень выполняет строго определённую функцию, предоставляя сервисы уровню выше и используя сервисы уровня ниже.

Семь уровней модели OSI:

  1. Физический (Physical) — передача битовых потоков по физической среде (медный кабель, оптоволокно, радиоволны).
  2. Канальный (Data Link) — формирование кадров (frames), управление доступом к среде (MAC), обнаружение и коррекция ошибок (например, Ethernet).
  3. Сетевой (Network) — логическая адресация (IP-адреса) и маршрутизация пакетов между сетями (протоколы IP, ICMP).
  4. Транспортный (Transport) — обеспечение сквозной надёжности, управление потоком и сегментация данных (TCP — надёжный, UDP — ненадёжный).
  5. Сеансовый (Session) — установление, управление и завершение сеансов связи между приложениями.
  6. Представления (Presentation) — преобразование данных (шифрование, сжатие, кодирование) в форму, понятную прикладному уровню.
  7. Прикладной (Application) — интерфейс для сетевых сервисов, с которыми взаимодействует пользователь (HTTP, FTP, SMTP).

Пример в контексте сетевого программирования на C/C++: При создании TCP-клиента мы напрямую работаем с сокетами, которые абстрагируют работу транспортного (4) и сетевого (3) уровней.

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() {
    // Создание сокета (уровень 4 - транспортный, выбор TCP)
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET; // Уровень 3 - сетевой (IPv4)
    server_addr.sin_port = htons(80); // Уровень 4 - транспортный (порт)
    inet_pton(AF_INET, "93.184.216.34", &server_addr.sin_addr); // Уровень 3 - IP-адрес

    // Установление соединения (уровень 4 - транспортный, handshake TCP)
    connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));

    // Отправка HTTP-запроса (уровень 7 - прикладной, протокол HTTP)
    const char *msg = "GET / HTTP/1.1rnHost: example.comrnrn";
    send(sockfd, msg, strlen(msg), 0);
    // ...
}

Модель OSI помогает понять, как данные инкапсулируются: HTTP-запрос (уровень 7) упаковывается в сегмент TCP (уровень 4), который помещается в IP-пакет (уровень 3), а тот — в Ethernet-кадр (уровень 2) для передачи по проводу (уровень 1).