Чем плох обычный HTTP для живых данных

Разбираемся, почему классический HTTP не умеет «толкать» данные пользователю сам.

Реалтайм — режим, при котором изменение на сервере доходит до пользователя за доли секунды, без его участия и без перезагрузки страницы.

Почему это важно

Представьте чат. Вы написали сообщение — собеседник должен увидеть его сразу, а не через 30 секунд и не после нажатия «Обновить». То же с уведомлениями, онлайн-статусом, тикером цен на бирже, счётом в матче. Все эти задачи объединяет одно: инициатором обмена выступает сервер, а не пользователь. Что-то поменялось — и об этом надо немедленно сообщить браузеру.

Беда в том, что обычный HTTP так не умеет. Он построен вокруг модели «запрос — ответ»: браузер спрашивает, сервер отвечает, соединение закрывается. Сервер физически не может «постучаться» в браузер первым.

Модель «запрос — ответ»

Любой обмен по HTTP инициирует клиент. Схема всегда одна:

Браузер  ----- GET /messages ----->  Сервер
Браузер  <---- 200 OK + данные -----  Сервер
         (соединение закрыто)

... проходит время, на сервере появилось новое сообщение ...

Сервер  ???  как сообщить браузеру?  ???
        (никак — браузер не спрашивал)

Сервер знает о новом сообщении, но у него нет открытого канала к браузеру. Остаётся ждать следующего запроса. Это фундаментальное ограничение: HTTP однонаправлен в смысле инициативы — говорит всегда клиент.

Как работает под капотом

HTTP/1.1 работает поверх TCP-соединения. Браузер открывает соединение, шлёт строку запроса и заголовки, получает ответ — и дальше соединение либо закрывается, либо живёт в режиме keep-alive для следующих запросов того же клиента. Но даже keep-alive не позволяет серверу заговорить первым: канал предназначен для следующего запроса браузера, а не для спонтанной отправки данных сервером.

Сравним две роли в TCP-соединении:

КтоМожет начать передачу?
Браузер (клиент)Да — шлёт запрос, когда захочет
СерверНет — только в ответ на запрос

Частые ошибки

  • «Поставлю запрос в цикл — будет реалтайм». Это polling, и он работает, но с задержкой и лишней нагрузкой (разберём в следующих уроках).
  • Путать keep-alive с двусторонним каналом. Keep-alive переиспользует TCP-соединение для запросов клиента, но не даёт серверу инициативу.
  • Думать, что проблема в скорости сети. Дело не в скорости, а в самой модели: сервер не имеет права заговорить первым.

Итоги

  • Реалтайм — это когда сервер сам и мгновенно доставляет изменения пользователю.
  • HTTP построен на модели «запрос — ответ»: инициатор всегда клиент.
  • Сервер не может «толкнуть» данные браузеру по обычному HTTP — нет открытого канала под его инициативу.
  • Из этого ограничения выросли все приёмы реалтайма, которые мы дальше разберём.
Проверьте себя
1. Почему обычный HTTP плохо подходит для чата в реальном времени?
AСервер не может сам инициировать передачу данных браузеру
BHTTP слишком медленный по скорости передачи
CБраузер не умеет принимать JSON
DHTTP не поддерживает кириллицу
2. Что даёт HTTP keep-alive?
AПозволяет серверу слать данные первым
BПереиспользует TCP-соединение для следующих запросов клиента
CШифрует трафик
DДелает соединение двунаправленным по инициативе