Ответ
Сетевая модель OSI (Open Systems Interconnection) — это концептуальная модель, которая стандартизирует сетевые функции, разделяя их на 7 логических уровней. Каждый уровень обслуживает вышестоящий уровень и использует сервисы нижестоящего.
Семь уровней модели OSI (сверху вниз):
Прикладной (Application): Предоставляет интерфейс для взаимодействия приложений с сетью. Протоколы: HTTP, FTP, SMTP, DNS.
Представления (Presentation): Отвечает за преобразование, шифрование и сжатие данных, чтобы они были понятны приложению на другом конце. Примеры: JSON, XML, SSL/TLS.
Сеансовый (Session): Устанавливает, управляет и завершает сеансы (соединения) между приложениями. Отвечает за аутентификацию и авторизацию.
Транспортный (Transport): Обеспечивает надёжную сквозную (end-to-end) доставку данных между хостами. Управляет сегментацией данных и контролем потока. Протоколы: TCP (с гарантией доставки) и UDP (без гарантии).
Сетевой (Network): Отвечает за логическую адресацию (IP-адреса) и маршрутизацию пакетов данных через несколько сетей. Протоколы: IP (IPv4/IPv6), ICMP.
Канальный (Data Link): Обеспечивает передачу кадров (frames) между двумя узлами, соединенными напрямую. Отвечает за физическую адресацию (MAC-адреса) и обнаружение ошибок. Протоколы: Ethernet, Wi-Fi.
Физический (Physical): Отвечает за передачу необработанных битов по физической среде (кабели, радиоволны). Определяет характеристики среды: напряжение, частоты, разъемы.
Соотношение с моделью TCP/IP:
Модель TCP/IP — это более практическая, реализованная модель, которая используется в современном интернете. Она состоит из 4 уровней, которые соотносятся с OSI следующим образом:
Модель TCP/IP | Уровни модели OSI |
---|---|
Application | 7. Прикладной, 6. Представления, 5. Сеансовый |
Transport | 4. Транспортный |
Internet | 3. Сетевой |
Network Access | 2. Канальный, 1. Физический |
Пример в Go:
// net.Dial работает на Транспортном (TCP) и Сетевом (IP) уровнях.
// "tcp" - протокол 4-го уровня, "example.com:80" - разрешается в IP-адрес (3-й уровень) и порт.
conn, err := net.Dial("tcp", "example.com:80")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// Отправка HTTP-запроса - это работа на Прикладном уровне (7-й уровень OSI).
// Мы формируем текстовые данные по протоколу HTTP.
request := "GET / HTTP/1.1rnHost: example.comrnrn"
_, err = fmt.Fprint(conn, request)
if err != nil {
log.Fatal(err)
}