Какие сетевые протоколы ты знаешь в контексте модели OSI?

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

Ответ

Модель OSI (7 уровней) — это эталонная модель. На практике в стеке TCP/IP уровни OSI 5-7 объединяются в "Прикладной уровень". Вот ключевые протоколы, сопоставленные с уровнями OSI, и пример на C++ (сокеты Беркли):

Уровень OSI Примеры протоколов Назначение
7. Прикладной HTTP/HTTPS, FTP, SMTP, DNS, SSH Интерфейс для приложений, данные пользователя.
6. Представления SSL/TLS, JPEG, MPEG Шифрование, сжатие, кодирование данных.
5. Сеансовый RPC, NetBIOS, SIP Управление сеансами связи (установка, поддержка, завершение).
4. Транспортный TCP, UDP, SCTP Гарантированная/негарантированная доставка, контроль потока.
3. Сетевой IP (IPv4/IPv6), ICMP, ARP, BGP Маршрутизация пакетов между сетями, логическая адресация.
2. Канальный Ethernet (MAC), Wi-Fi (802.11), PPP Передача кадров между соседними узлами в одной сети, исправление ошибок.
1. Физический DSL, USB, оптоволокно (IEEE 802.3) Передача битов (электрических/оптических сигналов).

Пример создания TCP-сокета на C++ (сырой API сокетов):

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

int createTcpSocket(const char* serverIp, uint16_t port) {
    // 1. Создание сокета (Уровень 4 - Транспортный, выбор TCP)
    int sockfd = socket(AF_INET, SOCK_STREAM, 0); // AF_INET - IPv4 (Уровень 3)
    if (sockfd < 0) { /* обработка ошибки */ }

    // 2. Настройка адреса сервера
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port); // Преобразование порядка байт
    inet_pton(AF_INET, serverIp, &serv_addr.sin_addr);

    // 3. Установка соединения (TCP handshake - Уровень 4)
    if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
        close(sockfd);
        /* обработка ошибки */
    }
    return sockfd; // Сокет готов для send()/recv() (Уровень 7 - Прикладной)
}