ИССЛЕДОВАНИЕ ТЕХНОЛОГИИ ПОСТРОЕНИЯ ПРИЛОЖЕНИЙ РЕАЛЬНОГО ВРЕМЕНИ C ИСПОЛЬЗОВАНИЕМ ПРОТОКОЛА WEBSOCKET

Авторы: Беседа Д.Г., Семенистый Н.В., Аоприенко А.Я.
Источник: Информационные управляющие системы и компьютерный мониторинг (ИУС КМ 2013), c. 276-282

Аннотация

Беседа Д.Г., Семенистый Н.В., Аноприенко А.Я. Исследование технологий построения приложений реального времени c использованием протокола websocket. Выполнен анализ технологии WebSocket и ее внедрение в современные инструменты создания Web-приложений. Описана реализация данной технологии в платформах Microsoft ASP.NET и Node.js.

Ключевые слова: socket.io, signalR, Websocket, MVC, AJAX, polling, long polling, hub.

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

Целью данного доклада является анализ особенностей протокола Websocket, его технических характеристик, преимуществ и недостатков, а также – сравнение реализаций «оберток» для протокола на платформах .NET и Node.js.

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

Постановка задачи. Необходимо рассмотреть транспортные параметры протокола Websocket, структуру его сообщения, возможные проблемы при его использовании. Рассмотрев реализации на разных платформах, необходимо сформировать вывод по эффективности работы с протоколом, используя библиотеки данных платформ.

Анализ протокола Websocket. Являясь синхронным протоколом, http предназначен для решения бытовых задач. Время запроса занимает незначительное время или вовсе не берется в расчет, но с ростом вычислительных мощностей и развитием Интернета нагрузка на сервера увеличивалась, что сделало данный протокол непригодным для решения многих современных задач.

Одним из решений этой проблемы стал протокол Websocket. Websocket – это протокол полнодуплексной двунаправленной связи поверх TCP-соединения, предназначенный для обмена данными между браузером и веб-сервером в режиме реального времени. Это стало доступно за счет того, что теперь нет понятия «клиент» и «сервер», а имеются два равноправных участника обмена данными.

Протокол мог бы стать успешным решением в проекте «Миллион пикселей для библиотеки».[1][2] При выбранной области она станет доступной для отображения только после перезагрузки страницы, а использование протокола Websocket позволило бы видеть изменения в структуре сетки изображений в момент их добавления. Структурная схема работы протокола WebSocket изображена на рисунке 1.

Рис. 1 – Структурная схема работы WebSocket.

На клиентской стороне работа с протоколом выполняется при помощи объекта Websocket.[3] Cтруктура сообщений данного объекта отображена на рисунке 2.

На рисунке 3 приведен формат dataframe протокола Websocket.

Данные минимально обозначены двумя байтами: 0х00 вначале и 0xFF в конце. Это позволяет быстрее обмениваться данными участникам. Соединение достаточно установить один раз и, следовательно, экономить время и трафик на его установление при необходимости. Таким образом, отсутствует ограничение на время жизни в неактивном состоянии. Соединение может оставаться без траты ресурсов. Единственным недостатком в данной ситуации является то, что на сервере могут забиваться TCP-сокеты.

Рис. 2 – Асинхронные сообщения объекта Websocket.
Рис. 3 – Формат dataframe протокола Websocket.

Еще одним преимуществом Websocket является отсутствие ограничения на количество как активных, так и пассивных соединений (кроме памяти самих серверов). Протокол зарекомендовал себя с хорошей позиции по множеству параметров, таких как безопасность, универсальность, скорость, кросс-доменность. Он был реализован во всех современных браузерах, что делает возможным его использование в проектах, основой которых есть интерактивное взаимодействие с пользователем, потому что протокол в некотором смысле реализует паттерн publish/subscribe, то есть, будучи подписанным на обновления какого-либо публикатора, вам больше не нужно отсылать запросы о получении информации, а ее распространением будет заниматься только сторона, обладающая этой информацией.

Протокол Websocket позволяет экономить существенное количество передаваемой информации за счет того, что он имеет крайне малые заголовки в сравнении с обычными HTTP¬-запросами. Это продемонстрировано на рисунке 4. Очевидно, что технология Polling, которая базируется на асинхронных запросах, посылает на порядок больше сообщений в канал, чем идет по протоколу Websocket.

Обертки более высокого уровня были реализованы во множестве языков и на множестве платформ. В качестве примера рассмотрим библиотеки SignalR платформы .Net и Socket.io Node.js.

Рисунок 4. Сравнительная характеристика количества использованных битов для передачи одинаковой информации технологий Polling и Websocket

Socket.io. Реализации данной библиотеки выполнена на платформе Node.js, которая набирает все больше и больше популярности в обществе веб-разработчиков. Среди числа ее преимуществ:

Именно асинхронность является той особенностью, которая заставляет использовать эту платформу на проектах, которые подразумевают обильный обмен данными между сервером и клиентом. Проекты, использующие протокол веб-сокетов, преимущственно создаются на платформе Node.js с использованием библиотеки Socket.io.

Socket.io предоставляет много преимуществ перед стандартной реализацией протокола:

Рассмотрим конфигурацию объекта socket. Один из главных настраиваемых атрибутов – возможные транспорты. В библиотеке реализована поддержка следующих протоколов:

Можно указывать массив поддерживаемых транспортов. При этом flash socket не будет активирован в браузерах, которые полностью поддерживают технологию Websocket.

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

Следующим важным аспектом являются клиентские настройки. Среди них: поле, свидетельствующее о том, является ли клиент браузером, для определения необходимости хостинга статических ресурсов, включен ли клиентский кэш, время актуальности ресурсов на клиенте, минификация файла socket.io.js, gzip архивирование скрипта.

В настройках также можно установить уровень логгирования:

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

В данной библиотеке есть 2 основных класса: PersistantConnection и Hub.

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

Hub – это надстройка над PersistantConnection. Он позволяет напрямую работать клиенту и серверу друг с другом. Таким образом клиент может вызывать методы сервера так же просто, как он вызывает свои локальные. Также этот класс упрощает работу, если приложение должно посылать сообщения разных типов.

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

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

Перспективы дальнейших исследований. Websocket является технологией нового поколения, является одним из элементов реформации Web в составе HTML5. Вполне вероятно, что в ближайшее время появятся другие технологии, которые будут справляться с задачей обеспечения real-time соединения между компьютерами еще лучше.

Список литературы
  1. Беседа Д.Г., Семенистый Н.В., Аноприенко А.Я. Миллион пикселей для библиотеки // Мате¬риалы III всеукраинской научно-технической конференции «Информационные управляющие системы и компьютерный мониторинг (ИУС и КМ 2012)» – 17-18 ап¬реля 2012 г., Донецк, ДонНТУ, 2012. С. 358-362.
  2. Беседа Д.Г., Семенистый Н.В., Аноприенко А.Я. Миллион пикселей для библиотеки // Мате¬риалы VIII международной научно-технической конференции «Информатика и компьютерные технологии – 2012» – 18-19 cентября 2012 г., Донецк, ДонНТУ, 2012.
  3. Wang V., Salim F., Moskovits P. The Definitive Guide to HTML5 WebSocket. New York, Apress, 2013. C. 17