Что такое WebSockets

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

В этом разделе мы узнаем разницу между HTTP и WebSockets, опишем, как устанавливаются соединения WebSocket, и покажем, как выглядят сообщения WebSocket.

В чём разница между HTTP и WebSockets?

Большая часть коммуникаций между веб-браузерами и веб-сайтами использует HTTP. При HTTP клиент отправляет запрос, а сервер возвращает ответ. Обычно ответ приходит сразу, и транзакция завершается. Даже если сетевое соединение остаётся открытым, оно будет использовано для отдельной транзакции запроса и ответа.

Некоторые современные веб-сайты используют WebSockets. Соединения WebSocket инициируются поверх HTTP и обычно являются долгоживущими. Сообщения могут отправляться в любом направлении в любое время и не являются транзакционными по своей природе. Соединение, как правило, остаётся открытым и простаивает до тех пор, пока клиент или сервер не будут готовы отправить сообщение.

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

Как устанавливаются соединения WebSocket?

Соединения WebSocket обычно создаются с помощью клиентского JavaScript, например:

var ws = new WebSocket("wss://normal-website.com/chat");

Note

Протокол wss устанавливает WebSocket по зашифрованному соединению TLS, а протокол ws использует незашифрованное соединение.

Для установления соединения браузер и сервер выполняют рукопожатие WebSocket поверх HTTP. Браузер отправляет запрос рукопожатия WebSocket примерно такого вида:

GET /chat HTTP/1.1
Host: normal-website.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket

Если сервер принимает соединение, он возвращает ответ рукопожатия WebSocket примерно такого вида:

На этом этапе сетевое соединение остаётся открытым и может использоваться для отправки сообщений WebSocket в любом направлении.

Note

Стоит отметить несколько особенностей сообщений рукопожатия WebSocket:

  • Заголовки Connection и Upgrade в запросе и ответе указывают, что это рукопожатие WebSocket.

  • Заголовок запроса Sec-WebSocket-Version указывает версию протокола WebSocket, которую клиент хочет использовать. Обычно это 13.

  • Заголовок запроса Sec-WebSocket-Key содержит случайное значение в Base64, которое должно генерироваться случайно в каждом запросе рукопожатия.

  • Заголовок ответа Sec-WebSocket-Accept содержит хэш значения из заголовка запроса Sec-WebSocket-Key, конкатенированного с определённой строкой, заданной в спецификации протокола. Это делается, чтобы предотвратить вводящие в заблуждение ответы из-за неправильно настроенных серверов или кэширующих прокси.

Как выглядят сообщения WebSocket?

После установления соединения WebSocket сообщения могут асинхронно отправляться в любом направлении — клиентом или сервером.

Простое сообщение можно отправить из браузера с помощью клиентского JavaScript, как показано ниже:

В принципе, сообщения WebSocket могут содержать любой контент или формат данных. В современных приложениях часто используется JSON для передачи структурированных данных в сообщениях WebSocket.

Например, чат-бот на базе WebSockets может отправить такое сообщение:

Last updated