В чем разница между протоколами WebSocket и HTTP?

«В чем разница между протоколами WebSocket и HTTP?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HTTP (HyperText Transfer Protocol) — это протокол прикладного уровня, работающий по модели запрос-ответ (request-response). Каждое взаимодействие независимо: клиент отправляет запрос, сервер возвращает ответ, после чего соединение (в HTTP/1.1 может сохраняться для повторного использования, но логика "запрос-ответ" остается) завершает обработку этого конкретного запроса.

WebSocket — это протокол, обеспечивающий полнодуплексный (full-duplex) канал связи поверх одного долгоживущего TCP-соединения. После начального "рукопожатия" (handshake), выполненного по HTTP, соединение переключается на протокол WebSocket, позволяя любой стороне отправлять данные в любой момент.

Ключевые отличия:

  1. Коммуникационная модель:

    • HTTP: Однонаправленная (клиент инициирует, сервер отвечает). Сервер не может отправить данные без запроса клиента (без использования техник вроде Long Polling).
    • WebSocket: Двунаправленная (клиент и сервер равноправны, могут отправлять данные асинхронно).
  2. Состояние соединения:

    • HTTP: Без состояния (stateless) на уровне протокола. Каждый запрос/ответ логически независим.
    • WebSocket: С постоянным соединением (stateful). Контекст может поддерживаться на протяжении всей сессии.
  3. Накладные расходы (Overhead):

    • HTTP: Полный набор заголовков (headers) передается с каждым запросом и ответом (Cookie, User-Agent, Cache-Control и т.д.).
    • WebSocket: После handshake передаются минимальные фреймы данных (2-14 байт заголовка + payload), что эффективно для частого обмена небольшими сообщениями.
  4. Использование:

    • HTTP: Идеален для загрузки веб-страниц, RESTful API, передачи документов — сценарии, где не требуется мгновенное обновление.
    • WebSocket: Критически важен для приложений реального времени: чаты, уведомления, онлайн-игры, финансовые котировки, совместное редактирование.

Наглядная аналогия:

  • HTTP — как отправка писем по почте. Вы отправляете запрос (письмо) и ждете ответ (другое письмо).
  • WebSocket — как телефонный разговор. Вы устанавливаете соединение один раз и можете говорить (отправлять данные) и слушать (получать данные) в реальном времени.