Раздел 3A. Протоколы — TCP, UDP, HTTP, WebSocket, WebRTC, CDN
TCP/UDP, HTTP/WebSocket, WebRTC и CDN: что поверх чего и зачем в мессенджере.
Все эти штуки — способы доставки данных. Как разные курьерские службы: у каждой свои правила, скорость и надёжность. Сначала разберём что есть что, потом проследим за Алисой по шагам.
Часть 1. Что это такое
Фундамент: TCP и UDP
Это базовые протоколы передачи. Всё остальное строится поверх них.
TCP — курьер с подтверждением
- Доставил посылку → получил подпись → только тогда везёт следующую
- Посылка потерялась — везёт заново
- Порядок гарантирован: что отправил первым, то первым и придёт
- Медленнее, но надёжно
- 📦 Аналогия: заказное письмо с уведомлением
UDP — курьер без подтверждения
- Бросил в почтовый ящик и побежал дальше
- Потерялась — не его проблема, повторять не будет
- Порядок не гарантирован
- Быстрее, но ненадёжно
- 📦 Аналогия: листовка в ящик
💡 TCP = надёжность важнее скорости. UDP = скорость важнее надёжности.
Поверх TCP: HTTP и WebSocket
HTTP — разовый запрос
- Клиент спрашивает → сервер отвечает → всё
- Инициатива всегда у клиента: сервер сам ничего не присылает
- 📞 Аналогия: звонок в справочную — спросил, услышал ответ, положил трубку
- Для чего: загрузить историю, создать чат, загрузить файл
WebSocket — постоянный канал
- Один раз открыли соединение → дальше обе стороны говорят когда хотят
- Сервер может сам толкнуть данные, не дожидаясь вопроса
- 📞 Аналогия: телефонный разговор — трубка поднята, говорите оба
- Для чего: новые сообщения, статусы, «печатает…»
💡 HTTP — клиент спрашивает. WebSocket — сервер сам толкает.
Поверх UDP: WebRTC
WebRTC — технология звонков в реальном времени
- Не просто протокол, а целый набор: захват микрофона/камеры, сжатие в кодеки, поиск пути между устройствами, шифрование
- Голос/видео идут напрямую между устройствами, минуя сервер мессенджера
- Работает поверх UDP — потому что для звонка скорость важнее потери пары пакетов
- Для чего: голосовые и видеозвонки
Сбоку: CDN
CDN — сеть серверов с копиями файлов по всему миру
- Не протокол, а инфраструктура для раздачи тяжёлых файлов (фото, видео)
- Файл лежит копиями в разных странах → пользователь качает с ближайшего сервера → быстро
- Разгружает основное хранилище: лавину скачиваний берёт на себя
- 📦 Аналогия: сеть складов — забираешь товар не из единого центра на другом конце страны, а из ближайшего к тебе
Шпаргалка
| Протокол | Поверх чего | Соединение | Инициатива | Для чего в мессенджере |
|---|---|---|---|---|
| TCP | — | Надёжное | — | Фундамент для HTTP и WebSocket |
| UDP | — | Быстрое, ненадёжное | — | Фундамент для звонков |
| HTTP | TCP | Разовое | Клиент спрашивает | История, чаты, загрузка медиа |
| WebSocket | TCP | Постоянное | Любая сторона | Сообщения, статусы, сигналинг звонка |
| WebRTC | UDP | Прямое P2P | Любая сторона | Голос, видео |
| CDN | HTTP | — | Клиент качает | Раздача фото и видео |
Часть 2. Как они работают вместе — по шагам за Алисой
Алиса открывает приложение
Что делает: нажимает на иконку мессенджера
1. TCP-соединение установлено
(рукопожатие с сервером — "дозвонились", канал открыт)
↓
2. HTTP запрос: GET /chats — загрузить список чатов
↓
3. HTTP запрос: GET /messages/123 — загрузить историю чата с Бобом
↓
4. То же TCP-соединение «апгрейдится» до WebSocket
(один раз договорились — дальше канал живёт постоянно)
↓
5. WebSocket живёт — прилетают новые сообщения, статусы, «печатает…»
(сервер сам толкает, без запросов от Алисы)
Боб пишет Алисе
Что делает: Алиса видит новое сообщение и точки «печатает…»
6. Боб начал печатать →
сервер толкает по WebSocket → у Алисы появились точки
↓
7. Боб отправил сообщение →
сервер толкает по WebSocket → сообщение появилось мгновенно
Алиса отправляет фото
Что делает: выбрала фото в галерее, нажала отправить
8. HTTP POST /media/upload — фото едет в объектное хранилище (S3)
(не через WebSocket! большой файл тащат отдельным путём)
↓
9. Хранилище сделало превью, вернуло ссылку на файл
↓
10. По WebSocket летит обычное сообщение — но внутри не файл, а ССЫЛКА
↓
11. Боб получил сообщение со ссылкой →
его телефон качает фото с ближайшего сервера CDN
(быстро, и основное хранилище не перегружается)
Алиса отправляет файл (документ, видео)
Что делает: прикрепила файл, нажала отправить
12. HTTP POST /media/upload — файл едет в хранилище
(большой файл — кусками, чтобы докачать при обрыве связи)
↓
13. В фоне видео перекодируется в разные качества (транскодинг)
↓
14. Вернулась ссылка → по WebSocket уходит сообщение со ссылкой,
размером, типом и превью
↓
15. Боб качает файл с CDN, когда захочет открыть
💡 Правило медиа: большие файлы НИКОГДА не идут через канал сообщений. Файл → отдельно в хранилище (HTTP). В сообщении едет только ссылка.
Алиса звонит Бобу
Что делает: нажала кнопку звонка, говорит, слышит Боба
16. По WebSocket летит сигнал Бобу: «Алиса звонит, вот мои данные»
(это сигналинг — договориться о звонке. Голос ещё не идёт)
↓
17. Боб принял → по WebSocket летит ответ Алисе: «принимаю, вот мои данные»
↓
18. Устройства узнали адреса друг друга →
открывается прямой UDP-канал телефон ↔ телефон
(если напрямую нельзя — через ретранслятор TURN, но всё равно UDP)
↓
19. WebRTC гонит голос по UDP:
каждые ~20мс маленький пакет звука летит напрямую
Потерялся пакет — пропустили, едем дальше.
Ждать и пересылать нельзя — разговор «заморозится»
Часть 3. Итог одной картинкой
┌─────────────────────────────────────────────┐
│ Приложение │
│ HTTP WebSocket WebRTC │ ← что видит юзер
├───────────┬──────────────┬───────────────────┤
│ TCP │ TCP │ UDP │ ← как едут данные
├───────────┴──────────────┴───────────────────┤
│ Интернет │ ← дороги
└─────────────────────────────────────────────┘
Фото/видео ──HTTP──→ Хранилище (S3) ──CDN──→ скачивание
| Действие Алисы | Протокол |
|---|---|
| Открыть приложение | TCP |
| Загрузить чаты и историю | HTTP поверх TCP |
| Получать новые сообщения, статусы | WebSocket поверх TCP |
| Отправить фото / файл | HTTP (загрузка) + WebSocket (ссылка) |
| Скачать чужое фото / файл | HTTP с CDN |
| Позвонить / принять звонок | WebSocket (сигналинг) |
| Говорить голосом | WebRTC поверх UDP |
Главное, что сказать на собеседовании
- Текст и статусы — по WebSocket поверх TCP (надёжно, сервер сам толкает).
- Разовые запросы (история, чаты, загрузка медиа) — по HTTP поверх TCP.
- Большие файлы — отдельным путём в хранилище, в сообщении только ссылка, раздача через CDN.
- Звонки — сигналинг через WebSocket, а сам голос/видео через WebRTC поверх UDP, напрямую между устройствами.
- Почему UDP для звонка: опоздавший пакет звука бесполезен — лучше потерять 20мс, чем заморозить разговор.