Курс «Архитектура мессенджера» · Часть 2 · Соединение и доставка

Раздел 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

Главное, что сказать на собеседовании

  1. Текст и статусы — по WebSocket поверх TCP (надёжно, сервер сам толкает).
  2. Разовые запросы (история, чаты, загрузка медиа) — по HTTP поверх TCP.
  3. Большие файлы — отдельным путём в хранилище, в сообщении только ссылка, раздача через CDN.
  4. Звонки — сигналинг через WebSocket, а сам голос/видео через WebRTC поверх UDP, напрямую между устройствами.
  5. Почему UDP для звонка: опоздавший пакет звука бесполезен — лучше потерять 20мс, чем заморозить разговор.