Ответ
Модель 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 - Прикладной)
}