Содержание
что это и как работают сокеты, асинхронный сервер
Скопировано
Содержание
WebSocket (веб-сокеты) — независимый веб-протокол, который позволяет создавать интерактивное соединение между сервером и клиентом (браузером) и обмениваться сообщениями в реальном времени. В отличие от HTTP, веб-сокеты позволяют работать с двунаправленным потоком данных, поэтому технология является уникальной.
Первая версия протокола появилась в 2009 году. Уже в 2011 году он получил статус RFC (Request for Comments, рабочее предложение), то есть был признан как стандарт, широко применяемый во Всемирной паутине. Сегодня технология поддержки веб-сокетов используется во всех мобильных, десктопных и серверных устройствах.
Как работают HTTP и AJAX
До появления веб-сокетов основным протоколом был HTTP. Он однонаправленный, то есть сервер отвечает только на запрос, отправленный клиентом. Для статичного контента вроде информационной статьи на сайте это не проблема. Но чтобы узнать об изменениях интерактивного контента (например, новом сообщении в онлайн-чате, комментариях или push-уведомлениях), нужно обновить страницу вручную.
Ситуацию улучшила технология AJAX — теперь клиент стал сам отправлять на сервер уточняющие HTTP-запросы в фоновом режиме.
Схема взаимодействия клиента с сервером до WebSocket
Такой подход имел недостатки:
- Клиент должен регулярно отправлять запросы на сервер даже при отсутствии новой информации. Это создавало лишнюю и бесполезную нагрузку на сеть.
- Для отправки каждого уточняющего запроса создавалось новое соединение, это занимало время.
- Клиент не мог получить новые данные сразу после их появления на сервере (только после очередного обращения).
Чтобы устранить эти недостатки, была разработана модель Comet, в которой уже вводилось постоянное соединение. Однако ее варианты содержали много ошибок и недоработок.
Как работают веб-сокеты
Протокол WebSocket позволил сделать соединение двунаправленным и постоянным. Сервер может не только отвечать на запрос клиента, но и самостоятельно передавать новую информацию по мере ее поступления. Обмен данными происходит в рамках одного установленного соединения в режиме реального времени. Такой метод называется «открывающим рукопожатием». Клиенту нужно только прослушивать однажды открытый канал до получения ответа от сервера.
WebSocket создает двунаправленное постоянное соединение по методу «открывающего рукопожатия».
В общем виде механизм веб-сокета работает так:
- Веб-страница или приложение создает скрипт с тремя коллбэками (функциями обратного вызова): первый и третий сообщают об установке и закрытии соединения, а второй срабатывает каждый раз, когда клиент получает новые данные от сервера.
- Клиент подключается к серверу по протоколу TCP и подает запрос:
GET /demo HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: site.com
Origin: http://site.com - Сервер с поддержкой веб-сокетов отвечает:
HTTP/1. 1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://site.com
WebSocket-Location: ws://site.com/demo - Клиент оставляет соединение открытым — канал готов. Далее при любом обмене информацией между ним и сервером будет срабатывать второй коллбэк скрипта, установленного страницей или веб-приложением.
Веб-сокеты позволяют обмениваться текстовыми сообщениями, изображениями, аудио- и видеофайлами, потоковыми данными. Для передачи зашифрованных сообщений используется надстройка над протоколом WSS.
Где применяются веб-сокеты
Протокол WS создан для интерактивных, динамически обновляющихся сервисов, веб-приложений и устройств, работающих в режиме реального времени. Например:
- бирж, торговых площадок и других коммерческих сервисов с быстро меняющимися котировками, ценами и другими данными;
- онлайн-игр, особенно многопользовательских;
- онлайн-чатов, включая службы клиентской поддержки;
- информационных сайтов с функцией комментирования контента;
- push-уведомлений;
- социальных сетей и блогов;
- интернета вещей.
Если пользователю нужны статичные или медленно обновляемые данные, веб-сокеты не требуются. Например, информационная статья, каталог товаров на сайте не меняются в течение долгого времени. Для получения обновлений достаточно вручную перезагрузить страницу.
Преимущества и недостатки
Преимущества:
- стандартизация решений, которая делает проще разработку кроссплатформенных приложений;
- неограниченное время жизни соединения, его не нужно периодически обновлять;
- множество одновременно открытых сессий;
- быстрая передача динамически обновляемых данных без лишней нагрузки на сеть и сервер.
Недостатки:
- повышенные требования к серверному оборудованию;
- отвал соединения без уведомлений. Чтобы понять, отвечает ли клиент, иногда нужно вводить дополнительные механизмы общения между ним и сервером;
- смена сети клиентом. Если при переподключении к другой сети клиент не закрыл соединение, сервер не получит информации об изменении адреса.
WebSocket — удобная технология передачи динамично обновляемых данных. Ее внедрение позволяет снизить нагрузку на сеть и серверное оборудование, ускорить работу сайта.
Скопировано
как работает и когда использовать
Существуют разные способы передачи данных от браузера или приложения к серверам и обратно.
Правила этих способов описаны в специальных протоколах. Некоторые применяют там, где нет необходимости обмениваться данными быстро, например на информационных сайтах, другие там, где важна скорость, в частности в интернете вещей.
Мы совместно с экспертами из компании Git in Sky решили рассказать об одной из таких технологий — протоколе передачи данных веб-сокет (WebSocket) — и объяснить принцип его работы и преимущества на простых примерах.
Чтобы понять, что такое протокол WebSocket, давайте посмотрим, каким был интернет до него
Раньше, чтобы получить новую информацию от сервера, клиент (браузер) должен был направить ему запрос, а сервер отправлял ответ. Без запроса не было ответа, то есть обновления страницы — сервер не мог ничего отправить сам. Например, пользователь получил сообщение или push-уведомление на сайте. Чтобы клиент об этом узнал, он должен опрашивать сервер с некоторой периодичностью, нет ли новых данных.
Другой вариант — клиент узнавал о новых данных только тогда, когда пользователь взаимодействовал с сайтом: переходил на другие страницы, вручную обновлял вкладку или открывал сайт заново. Как правило, использовался первый метод: клиент, к примеру, раз в 5 секунд отправлял запрос на сервер; если было что-то новое, сервер отдавал эту информацию в ответ.
В таком подходе были недостатки:
- Лишняя сетевая нагрузка. Клиент должен постоянно отправлять запросы на сервер, даже если новой информации нет.
- Накладные расходы на установление нового соединения при каждом запросе/ответе. При этом расходуется и какое-то время. Забегая вперед, отметим, что в WebSocket соединение устанавливается один раз и держится открытым, поэтому дополнительных накладных расходов нет.
- Низкая частота обновления данных. Клиент не может получить данные сразу, как только они появились на сервере. Новые данные поступают к клиенту только после того, как сервер получил запрос. Если важно получить данные как можно скорее, то можно было обращаться к серверу чаще, например один раз в 0,5 секунды. Однако это приводило к дополнительной нагрузке на сеть и сервер, которым приходилось проводить и обрабатывать множество запросов.
Веб-сокеты же позволяют устанавливать постоянное соединение, и теперь сервер может сам отправить клиенту новые данные, не дожидаясь запроса. Эта интерактивность устраняет вышеперечисленные недостатки. Чтобы увидеть преимущества протокола WebSocket, посмотрим, как он работает, сравнив его с протоколом HTTP.
Как работает WebSocket и в чем его отличия от HTTP
Протокол HTTP однонаправленный. После цикла «запрос — ответ» соединение закрывается, а любой следующий запрос каждый раз устанавливает новое соединение с сервером: сколько запросов, столько и соединений. Процесс передачи данных происходит с некоторыми задержками за счет того, что есть накладные расходы на установку нового соединения при каждом запросе/ответе, а также сетевая и серверная нагрузка из-за обилия периодических запросов. В чистом виде протокол HTTP сейчас используется все реже, ему на смену приходит HTTPS. Это не отдельный протокол, а надстройка над HTTP, позволяющая шифровать данные.
Протокол WebSocket двунаправленный, полнодуплексный, что означает, что он может одновременно и получать, и передавать информацию. Веб-сокет делает это множество раз в одном открытом соединении. У такого соединения и скорость выше, чем у HTTP.
У веб-сокетов также есть возможность шифровать передаваемые данные, для этого используется надстройка над протоколом — WSS. Если передаваемые данные не зашифрованы, они становятся объектом для привлечения таких угроз, как несанкционированный доступ к клиенту третьих сторон, использование вредоносного ПО. Специальные надстройки протоколов передачи данных кодируют информацию на стороне отправителя и раскодируют на стороне получателя, оставляя ее зашифрованной для любых посредников. Так достигается безопасный транспортный уровень.
Для наглядности покажем, в чем различия технологий HTTP и WebSocket, на примере их работы в чатах.
Чтобы пользователи могли получать новые сообщения, браузер периодически опрашивал сервер: есть ли новые сообщения для пользователя? Каждый такой запрос устанавливал новое соединение и создавал лишнюю сетевую нагрузку.
WebSocket API (WebSockets) — веб-API
WebSocket API — это передовая технология, позволяющая открывать сеанс двусторонней интерактивной связи между браузером пользователя и сервером. С помощью этого API вы можете отправлять сообщения на сервер и получать ответы, управляемые событиями, без необходимости запрашивать ответ у сервера.
Примечание: Хотя соединение WebSocket функционально несколько похоже на стандартные сокеты в стиле Unix, они не связаны между собой.
-
Веб-сокет
Основной интерфейс для подключения к серверу WebSocket и последующей отправки и получения данных о соединении.
-
CloseEvent
Событие, отправленное объектом WebSocket при закрытии соединения.
-
Событие сообщения
Событие, отправляемое объектом WebSocket при получении сообщения от сервера.
- Написание клиентских приложений WebSocket
- Запись серверов WebSocket
- Написание сервера WebSocket на C#
- Написание сервера WebSocket на Java
- AsyncAPI: Спецификация для описания архитектур, управляемых событиями, на основе таких протоколов, как WebSocket. Вы можете использовать его для описания API-интерфейсов на основе WebSocket так же, как вы бы описали API-интерфейсы REST с помощью спецификации OpenAPI. Узнайте, почему вам следует рассмотреть возможность использования AsyncAPI с WebSocket и как это сделать.
- HumbleNet: кроссплатформенная сетевая библиотека, работающая в браузере. Он состоит из C-оболочки WebSockets и WebRTC, которая абстрагируется от межбраузерных различий, облегчая создание многопользовательских сетевых функций для игр и других приложений.
- µWebSockets: Высокомасштабируемый сервер WebSocket и реализация клиента для C++11 и Node.js.
- Socket.IO: сторонний протокол передачи на основе длинного опроса/WebSocket для Node.js.
- SocketCluster: среда публикации/подписки WebSocket для Node.js с упором на масштабируемость.
- WebSocket-Node: реализация API сервера WebSocket для Node.js.
- Total.js: платформа веб-приложений для Node.js (пример: чат WebSocket)
- Faye:
WebSocket
(двустороннее соединение) и EventSource (одностороннее соединение) для сервера и клиента Node.js. - SignalR: SignalR будет скрыто использовать WebSockets, когда они доступны, и изящно отступать к другим методам и технологиям, когда это не так, в то время как код вашего приложения остается прежним.
- Caddy: веб-сервер, способный проксировать произвольные команды (stdin/stdout) как веб-сокет.
- ws: популярная клиентская и серверная библиотека WebSocket для Node. js.
- jsonrpc-bidirectional: асинхронный RPC, который при одном подключении может экспортировать функции на сервер и одновременно на клиент (клиент может вызывать сервер, сервер также может вызывать клиент).
- cowboy: Cowboy — это небольшой, быстрый и современный HTTP-сервер для Erlang/OTP с поддержкой WebSocket.
- ZeroMQ: ZeroMQ — это встраиваемая сетевая библиотека, которая передает сообщения внутри процесса, IPC, TCP, UDP, TIPC, многоадресной рассылки и WebSocket.
- WebSocket King: клиентский инструмент для разработки, тестирования и работы с серверами WebSocket.
- Сервер PHP WebSocket: сервер, написанный на PHP для обработки соединений через веб-сокеты wss:// или ws:// и обычные сокеты через ssl://, tcp://
- : библиотека Django, которая добавляет поддержку WebSockets (и других протоколов, требующих длительных асинхронных соединений).
- Flask-SocketIO: предоставляет приложениям Flask доступ к двунаправленной связи с малой задержкой между клиентами и сервером.
- Gorilla WebSocket: Gorilla WebSocket — это реализация Go протокола WebSocket.
Каналы
- АЯКС
- JavaScript
Спецификация | ||
---|---|---|
WebSockets Standard # the-websocket-interface | ||
WebSocket Connection | HTTP Connection |
---|---|
WebSocket — это бидоральный протокол, который может отправить данные на сервер или от сервера или от сервера или от сервера на сервер или от сервера или от сервера или от сервера или от сервера или от сервера или от сервера или от сервера или от сервера или от сервера или от сервера. клиента, повторно используя установленный канал соединения. |