Протокол WebSocket: интернет в режиме реального времени

20.08.2012

Протокол WebSocket обеспечивает более высокую скорость доступа в Глобальную Сеть. Благодаря ему работа с приложениями в браузере по быстроте и удобству сравнима с использованием обычных программ.

Протокол WebSocket обеспечивает более высокую скорость доступа в Глобальную Сеть. Благодаря ему работа с приложениями в браузере по быстроте и удобству сравнима с использованием обычных программ. Источник — websocket.org Чат, новостные ленты, бегущая строка, игры — все усилия разработчиков направлены на то, чтобы использовать данные приложения в браузере без необходимости установки плагинов. Разумеется, такие утилиты должны работать в режиме реального времени и обновляться автоматически. Сеть в ее классическом исполнении непригодна для работы с Rich Internet Application («насыщенными интернет-приложениями») и создает для разработчиков множество препятствий. Назрела необходимость в масштабных переменах в способе организации сетевого взаимодействия «клиент-сервер»: требовалось уйти от модели протокола HTTP, работающей по схеме «запрос/ответ», начав использовать двустороннюю систему связи в режиме реального времени. Все это стало реальным после принятия в 2011 году консорциумом W3C и сообществом IETF протокола WebSocket.

HTTP: одноколейная дорога

TCP, являясь протоколом транспортного уровня, предоставляет возможность двусторонней передачи данных. Но HTTP — прикладной протокол, с помощью которого общаются клиент и сервер, — ее не задействует и накладывает ограничения при использовании необходимого для современных веб-приложений механизма Push-уведомлений, отправляемых сервером клиенту. HTTP работает по простому образцу: клиент посылает запрос, и сервер отвечает. Это отнимает много времени и ресурсов.

Для того чтобы пользователям, работающим с веб-приложениями, не приходилось постоянно нажимать клавишу обновления, программисты задействуют инструменты, которые обеспечивают возможность организации обмена данными в режиме реального времени с использованием протокола HTTP — Polling (опрос готовности сервера) или HTTP-Streaming (HTTP-вещание). У обоих механизмов есть такие недостатки, как увеличение трафика и разная реализация для различных браузеров.

WebSocket: скорость и эффективность

Протокол WebSocket позволяет решить данные проблемы путем создания в браузерах сокета, поддерживающего связь с сервером через IP-адрес и порт по постоянно активному каналу. Так, обе конечные системы могут в любое время и по «собственному желанию» одновременно отправлять данные по одному и тому же каналу. Протокол WebSocket для установления соединения использует почти забытую функцию процедуры соединения (handshake) протокола HTTP — возможность смены протокола путем использования механизма Upgrade (переключения). Данная опция первоначально служила для того, чтобы шифровать незащищищенные соединения через порт 80 с помощью переключения на протокол TLS (TLS Upgrade), однако на тот момент так и не получила применения. Свое второе рождение она пережила в составе протокола WebSocket, который использует эту функцию для того, чтобы с помощью процедуры handshake протокола HTTP переключаться со старого протокола на новый (WebSocket). Реализация API (интерфейса программирования) WebSocket в браузере осуществляется с помощью объекта JavaScript. Активное WebSocket-соединение можно определить по идентификаторам (URI) «ws» или «wss».

Для того чтобы связь по протоколу WebSocket устанавливалась только разрешенными конечными клиентами, в HTTP-заголовке было предусмотрено несколько механизмов обеспечения безопасности. Первая степень защиты: клиент отправляет серверу запрос, в котором содержится код безопасности, полученный с использованием системы кодирования Base64. В данный код сервер добавляет стандартную последовательность символов, затем генерирует хэш-значение SHA1 и после повторного кодирования отправляет его клиенту. Переменная Origin, содержащаяся в запросе клиента, защищает WebSocket-сервер от несанкционированного доступа из внешних источников, поэтому соединение могут устанавливать только известные ему и поддерживаемые им клиенты.

Последняя важная мера безопасности осуществляется после процедуры handshake протокола HTTP: речь идет о шифровании WebSocket-клиентом каждого пакета данных с помощью простой маски XOR, чтобы промежуточные прокси-серверы по ошибке не приняли трафик протокола WebSocket за HTTP-запросы. Без шифрования пакетов данных вредоносный скрипт получает возможность манипуляции прокси-сервером и использования его против других пользователей. Ввиду того, что проксисерверы неспособны «читать» зашифрованный трафик, они перенаправляют его указанной конечной системе. В настоящее время многие браузеры поддерживают текущую версию протокола WebSocket.

Одно соединение — два направления: порядок действий

Протокол WebSocket, в отличие от HTTP, позволяет передавать данные по TCP-соединению одновременно в обоих направлениях. Это снижает задержки и нагрузку на сеть. WebSocket основывается на протоколе HTTP и занимает его место после процедуры «handshake» (установление соединения). Как и в случае с HTTP, WebSocket-соединения устанавливаются через порт 80 без использования шифрования или с шифрованием через порт 443. В отличие от Flash Socket и Java Socket новый протокол можно использовать без браузерных плагинов и в среде, защищенной брандмауэром. WebSocket предусматривает две схемы URI, аналогичные протоколу HTTP, — «ws» для незашифрованных и «wss» для зашифрованных соединений.

1. Процедура подключения (Handshake) по протоколу HTTP: клиент
2. Процедура подключения (Handshake) по протоколу HTTP: сервер
3. Соединение по протоколу WebSocket