Сетевые уровни (L4, L7 и другие) простыми словами
Справочный материал курса по архитектуре мессенджера: Сетевые уровни (L4, L7 и другие) простыми словами.
📚 Что такое OSI модель?
OSI модель — это способ разделить сетевое общение на 7 уровней, как этажи в здании. Каждый уровень отвечает за свою задачу, и верхние уровни используют услуги нижних.
┌─────────────────────────────────────┐
│ L7: Application (Приложение) │ ← HTTP, WebSocket, SMTP
├─────────────────────────────────────┤
│ L6: Presentation (Представление) │ ← Шифрование, сжатие
├─────────────────────────────────────┤
│ L5: Session (Сессия) │ ← Управление сессиями
├─────────────────────────────────────┤
│ L4: Transport (Транспорт) │ ← TCP, UDP ⭐ ВАЖНО
├─────────────────────────────────────┤
│ L3: Network (Сеть) │ ← IP-адреса, маршрутизация
├─────────────────────────────────────┤
│ L2: Data Link (Канальный) │ ← MAC-адреса, Ethernet
├─────────────────────────────────────┤
│ L1: Physical (Физический) │ ← Кабели, сигналы
└─────────────────────────────────────┘
Зачем это нужно?
Чтобы не думать обо всём сразу. Когда вы пишете HTTP-запрос, вас не волнует, как пакеты физически летят по проводам.
🎯 Главное: L4 vs L7
В контексте балансировщиков и сетей обычно говорят про два ключевых уровня:
🔵 L4 — Transport Layer (Транспортный уровень)
Что делает:
- Доставляет данные от точки A до точки B
- Работает с TCP/UDP портами
- Не смотрит, что внутри пакета
- Просто пересылает байты
Аналогия:
L4 — это курьерская служба. Курьер получает посылку, смотрит только на адрес (IP:порт) и везёт. Ему всё равно, что внутри: письмо, книга или пицца.
Примеры L4-балансировщиков:
- HAProxy (в режиме TCP)
- Nginx (stream module)
- AWS NLB (Network Load Balancer)
- Linux IPVS
Что видит L4-балансировщик:
Источник: 192.168.1.100:54321
Назначение: 10.0.0.5:443
Протокол: TCP
Длина: 1460 байт
Всё. Он не знает, HTTP это, WebSocket или SSH.
🟢 L7 — Application Layer (Прикладной уровень)
Что делает:
- Понимает содержимое сообщений
- Работает с протоколами: HTTP, HTTPS, WebSocket, gRPC
- Может читать заголовки, URL, cookies
Аналогия:
L7 — это почтовый сортировщик. Он вскрывает конверт, читает письмо и решает: "Это спам — в корзину", "Это важное — начальнику", "Это реклама — в маркетинг".
Примеры L7-балансировщиков:
- HAProxy (в режиме HTTP)
- Nginx (http module)
- AWS ALB (Application Load Balancer)
- Envoy
- Traefik
Что видит L7-балансировщик:
GET /api/users HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbGc...
Content-Type: application/json
Он может маршрутизировать на основе:
- URL (
/api/*→ один бэкенд,/static/*→ другой) - Заголовков (
Authorization→ проверка токена) - Метода (
POST→ один сервер,GET→ другой)
📊 Сравнение L4 и L7
| Характеристика | L4 (Transport) | L7 (Application) |
|---|---|---|
| Что видит | IP:порт, TCP/UDP | HTTP, headers, body |
| Скорость | ⚡ Очень быстро | 🐢 Медленнее (нужно парсить) |
| Память на соединение | ~2-5 KB | ~10-50 KB |
| CPU нагрузка | Низкая | Выше (парсинг, TLS termination) |
| Масштабируемость | Миллионы соединений | Сотни тысяч |
| Гибкость маршрутизации | Только по IP:порт | По URL, headers, cookies |
| TLS termination | ❌ Нет (прозрачный) | ✅ Да (расшифровывает) |
| Health checks | Базовые (порт открыт?) | Глубокие (HTTP 200 OK?) |
🏗️ Практический пример: Мессенджер
Клиенты (10 млн)
↓
┌──────────────────────────────────────┐
│ L4 Load Balancer (HAProxy) │
│ • Видит только TCP соединения │
│ • Распределяет по Connection Servers│
│ • Держит миллионы соединений │
│ • Дешевый, быстрый │
└──────────────┬───────────────────────┘
│ (TCP stream)
↓
┌──────────────────────────────────────┐
│ Connection Servers (WebSocket) │
│ • Держат WebSocket соединения │
│ • Парсят протокол, heartbeat │
└──────────────┬───────────────────────┘
│ (внутренние вызовы)
↓
┌──────────────────────────────────────┐
│ L7 Load Balancer (Nginx/Envoy) │
│ • Для HTTP API │
│ • Маршрутизирует: │
│ /api/auth → Auth Service │
│ /api/messages → Message Service │
│ /api/files → File Service │
│ • Терминирует TLS │
└──────────────────────────────────────┘
Почему так?
- L4 для WebSocket — потому что соединений очень много, а маршрутизация не нужна (все идут на один тип серверов)
- L7 для HTTP API — потому что нужно умно маршрутизировать по URL и экономить ресурсы бэкендов
🧠 Другие уровни (кратко)
L3 — Network Layer (Сетевой)
- Работает с IP-адресами
- Маршрутизация между сетями
- Примеры: роутеры, L3-свитчи
- Балансировка: ECMP (Equal-Cost Multi-Path) — распределение по нескольким путям
L2 — Data Link Layer (Канальный)
- Работает с MAC-адресами
- Передача внутри одной сети (LAN)
- Примеры: свитчи, VLAN
- Балансировка: редко, но есть L2-балансировщики
💡 Почему L4 дешевле L7?
L4-балансировщик:
1. Принял TCP пакет
2. Посмотрел: IP источника + порт
3. Выбрал бэкенд по хешу
4. Переслал пакет
Время: микросекунды
Память: только таблица соответствий (client_ip:port → backend_ip:port)
L7-балансировщик:
1. Принял TCP пакет
2. Собрал полный HTTP запрос (может быть несколько пакетов)
3. Расшифровал TLS (если HTTPS)
4. Распарсил HTTP заголовки
5. Проанализировал URL, headers
6. Выбрал бэкенд по правилам
7. Возможно, модифицировал запрос (добавил X-Forwarded-For)
8. Переслал на бэкенд
Время: миллисекунды (в 10-100 раз медленнее)
Память: буферы для сборки запросов, таблицы маршрутизации, SSL сертификаты
🎯 Когда что использовать?
| Сценарий | Рекомендация | Почему |
|---|---|---|
| WebSocket/TCP стримы | L4 | Соединений много, маршрутизация не нужна |
| HTTP API с разными путями | L7 | Нужно маршрутизировать по URL |
| Микросервисы | L7 | Разные сервисы на разных путях |
| Высокая нагрузка (C10M) | L4 | Дешевле, масштабируется лучше |
| Нужен TLS termination | L7 | L4 не может расшифровать трафик |
| Canary deploy, A/B тесты | L7 | Можно маршрутизировать по headers/cookies |
🔥 Современные тренды
Service Mesh (Istio, Linkerd):
- Используют L7-прокси (Envoy) рядом с каждым сервисом
- Умная маршрутизация, observability, security
- Но дороже по ресурсам
eBPF (Extended Berkeley Packet Filter):
- Позволяет делать L4-балансировку в ядре Linux
- Ещё быстрее, чем пользовательские процессы
- Используется в Cilium, Cloudflare
📝 Итог
- L4 = "тупой" транспорт. Быстрый, дешевый, держит миллионы соединений. Не знает, что внутри.
- L7 = "умный" балансировщик. Медленнее, дороже, но понимает протоколы и может делать умную маршрутизацию.
- В продакшене часто используют оба: L4 на фронтенде для сырого трафика, L7 внутри для микросервисов.
В вашем контексте: балансировщик перед Connection Servers работает на L4, потому что ему нужно просто принять миллион TCP-соединений и пробросить их дальше, не вникая в WebSocket-протокол. Это экономит память и CPU.