Web сокеты — протокол прикладного уровня

WEB сокеты — это протокол прикладного уровня стека протоколов TCP/IP и модели взаимодействия открытых систем OSI. Он находится там же, где и протокол http. Для передачи данных в пакеты на транспортном уровне используют протокол TCP.

место WS в стеке протоколов tcp

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

Протокол HTTP

Для web используется протокол HTTP, который очень популярен, зачем нужен еще один? Протокол http работает в режиме запрос ответ. Клиент отправляет запрос на сервер, в ответ от сервера получает веб-страницу и показывает ее например в браузере.

протокол http и web сокет

Такая модель обеспечивает очень простую работу протокола, но недостаток ее заключается в том, что сервер ничего не может отправить клиенту по своей воле, ему приходится ждать когда клиент направит запрос и включать эти данные в ответ.  И если раньше web был устроен очень просто и использовался для просмотра веб-страниц, то такой модели было вполне достаточно.

Чат

Сейчас web усложнился и применяется для большого количества других задач, например для мессенджеров и чатов. В этом случае у нас есть несколько клиентов чата, которые подключены к одному серверу. Один из клиентов отправляет сообщение на сервер, а затем сервер передает это сообщение всем остальным клиентам чата, так чтобы они его увидели.

web сокеты для чата

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

Web Сокеты

Web сокеты как раз предназначены для решения этой проблемы. В web сокетах в отличии от http, между клиентом и сервером устанавливается постоянное двунаправленное соединение. По этому соединению клиент может в любое время отправлять данные серверу и сервер тоже в любой момент может отправлять данные клиенту по своей инициативе.

web сокеты

Также любая сторона получив запрос, может ответить на него сразу либо через некоторое время так, как ей это кажется правильным и эффективным. Таким образом web сокеты гораздо лучше подходят для разработки приложений реального времени, чем протокол http.

Web сокеты это стандартный протокол, который определенно в RFC 6455 в 2011 году уже достаточно давно и сейчас он поддерживается всеми современными браузерами. В web сокетах на прикладном уровне устанавливается постоянное двунаправленное соединение между клиентом и сервером. При этом на транспортном уровне также используется постоянное соединение tcp.

Web сокеты также как и http работают на портах 80 и 443 если используются шифрование. Для веб сокетов есть специальный префикс в URL ws/ сокращение от веб-сокетов или wss/ если сокеты используются совместно с SSL TLS для шифрования. В url для веб-сокетов выглядит вот таким образом ws://www/zvondozvon.ru/chat).

Работа протоколов web сокетов состоит из двух частей, первая часть это установка соединения по английский (Opening Handshake), вторая часть — передача данных. Эти части логические разделены между собой. Для того чтобы веб сокеты могли работать в современной инфраструктуре рассчитанной на протокол http, этап установки соединения очень похож на работу протокола HTTP.

Установка соединения — запрос клиента

В web сокетах запрос клиента на установку соединения выглядит как get запрос http. При этом указывается опция Upgrade и протокол на который нужно перейти websocket. Также в заголовке указывается ключ web сокетов — это 16 байт сгенерированных случайным образом и представленных в кодировке base 64.

Установка соединения запрос клиента

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

Установка соединения — ответ сервера

Ответ сервера на установку соединения веб сокетов, также выглядит, как ответ по протоколу http. Код ответа 101, переключение протоколов.

Установка соединения - ответ сервера

В заголовке Upgrade, также указывается протокол на который происходит переключение web сокеты и  указывается ключ безопасности, который получен на основе ключа отправленного клиентам по специальному алгоритму описанному в документе RFC 6455. После этого между клиентом и сервером устанавливается прямое tcp соединение по котором данные передаются уже без использования протокола http.

Передача данных

В web сокетах данные передаются в виде кадров по английский frame при этом разработчики протокола web сокета старались снизить накладные расходы на передачу данных, поэтому заголовок web сокетов имеет бинарный вид в отличии от http, где заголовки в текстовом виде очень большие. В результате накладные расходы на передачу данных через web сокеты гораздо ниже чем через http.

Фрагментация

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

Типы кадров

В web сокетах есть кадры трех типов:

  • кадры, которые передают текстовую информацию представленную в кодировке utf-8;
  • кадры, которые передают данные в двоичном виде;
  • управляющие кадре которые используются для поддержания или для закрытия соединения.

Запрос ping

Для поддержания соединения используются запросы ping-pong, сервер через определенные промежутки времени отправляет клиенту управляющий запрос ping и после того как клиент получил этот запрос он в ответ отправляет управляющий кадр pong.

Запрос ping ответ pong

Это нужно для того чтобы решить две задачи: первое, убедиться, что другая сторона соединение все еще функционирует, а вторая задача это поддерживать TCP соединения открытым в случае если клиент и сервер соединены не напрямую, а например через прокси сервер или балансировщик нагрузки.

Разрыв соединения

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

разрыв соединения веб сокетов

Формат заголовка кадра Web сокетов

Заголовок кадра в веб сокетах выглядит вот таким образом. Эта картинка из документа rfc.

формат заголовка кадра веб сокетов

Основные поля здесь это код операции (opcode), который говорит о том, что за тип кадра. Это может быть кадр, который передает текстовые данные, бинарные данные, кадр ping, pong, close и другие типы кадров.

В разделе Payload Data находится полезные данные, которые нужно передать. В веб сокетах для того чтобы снизить накладные расходы используется хитрая схема для указания объема передаваемых данных. Если объем данных небольшой, то для поля длина данных используется всего лишь 7 бит, а если объем данных больше, то могут использоваться дополнительные биты заголовка и размер поля длина данных может быть 16 или 64 бита.

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

А если данные были фрагментированны и передаются в нескольких кадрах, то во всех кадрах кроме последнего фланг FIN установлен в 0. Следующие три флага, зарезервированны и используются для расширения протокола веб советов. О том будут ли использоваться расширение и какие именно клиенту и серверу необходимо договориться в процессе установки соединения.

В веб сокетах данные при передаче могут маскироваться и на практике это делается почти всегда, если данные маскируются то флаг MASK установлен в единицу, в противном случае в 0. Если используется маскирование данных, то кадр должен включать ключ маскирование, Masking-key.

Ключ маскирование генерируется отправителем случайным образом и этот ключ должен быть разным для каждого кадра, если используются маскирование, то в части Payload Data находятся данные, которые получены в результате операции xor ключа маскирования и оригинальных данных.

Заключение

Мы рассмотрели протокол веб сокетов, который позволяет организовать веб двунаправленную асинхронную передачи данных. Веб сокеты очень полезны для разработки web-приложений реального времени.

Работа веб сокетов состоит из двух частей первый этап установка соединения, сейчас для этой цели  используются заголовки протокола http, но протокол веб сокетов подразумевает расширение и если через какое-то время в веб будет популярен другой протокол ни http, то процедура установки соединения в web сокетах можно заменить на другой протокол. Второй этап работы веб сокетов — передача данных, выполняется через прямое TCP соединение между клиентом и сервером с помощью кадров формата веб сокетов.

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

Кроме того, web сокеты обеспечивают более высокую производительность из-за низких накладных расходов на передачу данных из за того что используются заголовки кадров веб сокетов в бинарном виде, а не большие заголовки HTTP в текстовом виде.

Ссылка на основную публикацию