- Автор темы
- #1
Веб-сокеты - это передовая технология, которая позволяет создавать интерактивное соединение между клиентом (браузером) и сервером для обмена сообщениями в режиме реального времени. Веб-сокеты, в отличие от HTTP, позволяют работать с двунаправленным потоком данных, что делает эту технологию совершенно уникальной. Давайте разберемся, как работает эта технология и чем она отличается от HTTP.
Пример работы Веб-Сокетов.
В чем разница между HTTP и Веб-Сокетами?
Большая часть связи между веб-браузерами и веб-сайтами использует HTTP. С помощью HTTP клиент отправляет запрос, а сервер возвращает ответ. Как правило, ответ происходит немедленно, и транзакция завершена. Даже если сетевое соединение остается открытым, оно будет использоваться для отдельной транзакции запроса и ответа.
Некоторые современные веб-сайты используют Веб-Сокеты. Соединения Веб-Сокетов инициируются через HTTP и обычно долговечны. Сообщения могут быть отправлены в любом направлении в любое время и не имеют транзакционного характера. Соединение обычно остается открытым и бездействующим, пока клиент или сервер не будут готовы отправить сообщение.
Веб-Сокеты особенно полезны в ситуациях, когда требуются сообщения с низкой задержкой или инициируемые сервером сообщения, такие как потоки финансовых данных в реальном времени.
Как устанавливаются соединения Веб-Сокетов?
Соединения Веб-Сокетов обычно создаются с использованием клиентского JavaScript, как показано ниже:
var ws = new WebSocket ("ws: //нормальный-сайт.com/chat");
p.s так же возможно использовать Веб-Сокеты поверх TLS, пример:
wss://нормальный-сайт.com/chat
, обычный же ws используется без шифрования.
Чтобы установить соединение, браузер и сервер выполняют рукопожатие Веб-Сокетов через HTTP протокол. Браузер выдает запрос рукопожатия Веб-Сокетов следующим образом:
GET /chat HTTP/1.1
Host: нормальный-сайт.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
И если сервер принимает запрос, отправляется следующий ответ:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
Особенности «рукопожатий» веб-сокетов.
Заголовки Connection и Upgrade в запросе и ответе указывают, что это рукопожатие Веб-Сокетов.
Заголовок запроса Sec-WebSocket-Version указывает версию протокола Веб-Сокетов, которую клиент желает использовать. Обычно это 13.
Заголовок запроса Sec-WebSocket-Key содержит случайное значение в кодировке Base64, которое должно генерироваться случайным образом в каждом запросе квитирования.
Заголовок ответа Sec-WebSocket-Accept содержит хэш значения, представленного в заголовке запроса Sec-WebSocket-Key, объединенного с определенной строкой, определенной в спецификации протокола. Это сделано для предотвращения вводящих в заблуждение ответов в результате неверно настроенных серверов или кэширующих прокси.
Как выглядит общение через Веб-Сокеты?
Возьмём к примеру чат который работает через веб-сокеты, после установки соединения через протокол HTTP, сервер получает сигнал «o», и после происходит общение.
Для начала сервер к примеру отправляет вам сообщение с человеком с которым будет происходить общение:
ws.send("Alpine Linux");
И затем идёт отправка сообщений в таком виде:
{"user":"Linux user","content":"Hey Faka Tony Montana!"}

Пример работы Веб-Сокетов.
В чем разница между HTTP и Веб-Сокетами?
Большая часть связи между веб-браузерами и веб-сайтами использует HTTP. С помощью HTTP клиент отправляет запрос, а сервер возвращает ответ. Как правило, ответ происходит немедленно, и транзакция завершена. Даже если сетевое соединение остается открытым, оно будет использоваться для отдельной транзакции запроса и ответа.
Некоторые современные веб-сайты используют Веб-Сокеты. Соединения Веб-Сокетов инициируются через HTTP и обычно долговечны. Сообщения могут быть отправлены в любом направлении в любое время и не имеют транзакционного характера. Соединение обычно остается открытым и бездействующим, пока клиент или сервер не будут готовы отправить сообщение.
Веб-Сокеты особенно полезны в ситуациях, когда требуются сообщения с низкой задержкой или инициируемые сервером сообщения, такие как потоки финансовых данных в реальном времени.
Как устанавливаются соединения Веб-Сокетов?
Соединения Веб-Сокетов обычно создаются с использованием клиентского JavaScript, как показано ниже:
var ws = new WebSocket ("ws: //нормальный-сайт.com/chat");
p.s так же возможно использовать Веб-Сокеты поверх TLS, пример:
wss://нормальный-сайт.com/chat
, обычный же ws используется без шифрования.
Чтобы установить соединение, браузер и сервер выполняют рукопожатие Веб-Сокетов через HTTP протокол. Браузер выдает запрос рукопожатия Веб-Сокетов следующим образом:
GET /chat HTTP/1.1
Host: нормальный-сайт.com
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wDqumtseNBJdhkihL6PW7w==
Connection: keep-alive, Upgrade
Cookie: session=KOsEJNuflw4Rd9BDNrVmvwBF9rEijeE2
Upgrade: websocket
И если сервер принимает запрос, отправляется следующий ответ:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
Особенности «рукопожатий» веб-сокетов.
Заголовки Connection и Upgrade в запросе и ответе указывают, что это рукопожатие Веб-Сокетов.
Заголовок запроса Sec-WebSocket-Version указывает версию протокола Веб-Сокетов, которую клиент желает использовать. Обычно это 13.
Заголовок запроса Sec-WebSocket-Key содержит случайное значение в кодировке Base64, которое должно генерироваться случайным образом в каждом запросе квитирования.
Заголовок ответа Sec-WebSocket-Accept содержит хэш значения, представленного в заголовке запроса Sec-WebSocket-Key, объединенного с определенной строкой, определенной в спецификации протокола. Это сделано для предотвращения вводящих в заблуждение ответов в результате неверно настроенных серверов или кэширующих прокси.
Как выглядит общение через Веб-Сокеты?
Возьмём к примеру чат который работает через веб-сокеты, после установки соединения через протокол HTTP, сервер получает сигнал «o», и после происходит общение.
Для начала сервер к примеру отправляет вам сообщение с человеком с которым будет происходить общение:
ws.send("Alpine Linux");
И затем идёт отправка сообщений в таком виде:
{"user":"Linux user","content":"Hey Faka Tony Montana!"}