JavaScript API: новый протокол WebSocket
Технология WebSocket - наверное, самое кардинальное нововведение эпохи HTML 5. Это новый формат обмена данными между браузером и сервером, который предполагает не только изменение функциональности браузеров, но и изменения протокола обмена данных HTTP.
Функциональность и простота
Всемирная Паутина держится на трёх китах: формате гипертекста HTML, глобальной системе идентификаторов веб-ресурсов URI и протоколе запросов веб-страниц HTTP. В эпоху HTML 5 меняется не только гипертекст - изменения коснутся и протокола HTTP.
HTTP - это протокол общения между браузером и сервером. Он эффективен тем, что выполняет простую задачу получения нужного html-документа с сервера: браузер отправляет запрос, а сервер отсылает в ответ статическую или динамически сформированную страницу. Вот и все функции обмена данными, которые может обеспечить текущая версия HTTP.
Появление веб-приложений потребовало дополнительных возможностей для общения между браузером и сервером. Например, стал необходим фоновый обмен запросами и данными между страницей в браузере и сервером без перезагрузки страницы, что привело к появлению технологии AJAX.
Сейчас для веб-приложений требуется возможность не только браузеру отсылать запросы к серверу, но и серверу отправлять запросы клиенту. Это называется симметричным обменом данных. На текущий момент протокол HTTP обеспечивает несимметричный обмен, и инициативой подачи запросов обладает только браузер.
Кроме симметричности, не помешает и асинхронность передачи данных. Это когда одна сторона передаёт данные и не ожидает ответа, продолжая выполнять свои следующие задачи.
Стандарт WebSocket направлен на то, чтобы реализовать этот полноценный симметричный и асинхронный обмен данными. Это, в свою очередь, требует модификации протокола HTTP.
В дополнение ко всем этим новым возможностям считаю важным отметить как для стандарта WebSocket, так и для всех остальных веб-стандартов, что от них требуется не только реализация каких-то технических возможностей. Эти веб-стандарты должны быть просты и понятны для не очень искушённых разработчиков. Простота и доступность - эти требования к веб-стандартам часто забывают упоминать.
С приходом к власти стандарта WebSocket организовать канал обмена данных между сервером станет значительно проще, чем это возможно при помощи современных хакерских приёмов Comet, что сейчас используются в веб-разработках для достижения асинхронности и симметричности обмена запросами.
Простая связь
Организовать канал обмена данными между сервером и браузером при помощи стандарта WebSocket действительно просто. Как только веб-странице нужно открыть канал на сервер, она создает специальный javascript-объект:
ws = new WebSocket("ws://site.by")
Обратите внимание на протокол "ws://" в ссылке к серверу, с которым устанавливается соединение. В результате такого запроса на сервер будет отправлен http-запрос с дополнительными полями для установки сокета:
GET HTTP/1.1 Upgrade: WebSocket Connection: Upgrade Host: site.com Origin: http://site.by
Если сервер поддерживает сокеты, то он отошлёт браузеру специальное подтверждение, аналогичное запросу, и между ними установится открытое TCP-соединение.
Для управления этим соединением со стороны браузера используются несложные интерфейсы.
// вызывается при открытии сокета ws.open = function() {alert("opened")}; // вызывается при закрытии сокета ws.onclose = function() {alert("closed")}; // принимаем данные с сервера ws.onmessage = function(e) {alert(e.data)};
Непосредственный формат данных для обмена между клиентом и сервером представляет собой простой фрейм строковых или бинарных данных со специальными старт-байтом и стоп-байтом.
0x00, <строка в кодировке UTF-8>, 0xFF 0x80, <длина - один или несколько байт>, <тело сообщения>
Проще говоря, после установления сокет-канала при передаче данных не нужно больше указывать никаких заголовков и метаданных. Поэтому стандарт WebSocket может действительно сократить трафик при обмене данными, особенно небольшого размера, что не всегда удаётся при использовании того же AJAX.
Черновая спецификация WebSocket пока не накладывает ограничений на количество веб-сокетов для каждой страницы. Также веб-сокеты не имеют ограничений на время жизни в неактивном состоянии. Хотя стоит сказать, что на сервере будут забиваться TCP-сокеты.
Поддержка технологии WebSocket имеется в современных браузерах Opera, Firefox, Chrome. Однако вся эта поддержка пока имеет экспериментальный характер, так как черновик стандарта постоянно обновляется. Буквально месяц назад спецификации протокола WebSocket были изменены и новая 76-я редакция протокола несовместима с предыдущей - 75-й.
Основные изменения связаны с безопасностью. Чтобы предотвратить или хотя бы максимально осложнить подделку запросов, отправленных с неверных источников, в протокол был добавлен целый ряд заголовков, обеспечивающих эту безопасность. Поэтому назвать технологию WebSocket устоявшейся ещё нельзя.
Михаил АСТАПЧИК
Горячие темы