Комитет IETF [2], занимающийся развитием протоколов и архитектуры Интернет, объявил [3] о публикации RFC 6455 [4] с описанием протокола WebSocket, который после серии черновых версий получил статус "Предложенного стандарта [5]" (Proposed Standard). На текущей стадии спецификация на протокол WebSocket, претендующего на роль стандарта Интернет, уже избавилась от наблюдаемой ранее незавершённости, например, связанной с определением метода надёжного блокирования атак, ориентированных на подмену кэша.
Переход протокола WebSocket на стадию "Предложенного стандарта" занял полтора года - первый черновик представленного RFC был опубликован [6] ещё в мае 2010 года, после чего было выпущено 17 редакций документа. Следующей стадией развития RFC является придание статуса чернового стандарта (Draft Standard), по сути означающего полную стабилизацию протокола и учёт всех высказанных замечаний. На стадии чернового стандарта находятся большинство протоколов сети, лишь единицы, после многих лет существования, достигают наивысшего статуса - стандарт Интернета (всего статус стандарта получили [7] около 70 RFC).
Протокол WebSocket разработан два года назад компанией Google для решения проблемы с организацией двустороннего надёжного обмена данными между web-приложением и сервером. По своей сути WebSockets является своеобразным аналогом TCP для Web и позволяет в произвольном порядке инициировать отправку данных от сервера к web-приложению, а не только от web-приложения к серверу. Для аутентификации и обеспечения безопасности передачи данных в Web Sockets используются стандартные механизмы браузера. Сам протокол не использует сырые TCP-соединения или множественные HTTP-запросы, вместо этого соединение поддерживается в рамках единого с HTTP канала передачи данных, по которому не передаётся лишних HTTP заголовков, а соединение постоянно держится открытым. Установив WebSocket соединение между сервером и клиентом, разработчик может отправить данные из web-браузера выполнив метод send() и получить отправленные со стороны сервера данные через установку специального обработчика событий.
Модель безопасности WebSockets базируется на механизме "Web Origin", который используется для определения доверительной области и ограничения полномочий браузеров при запросе внешних ресурсов, в частности используется для защиты от CSRF-атак. Технология основана на идее изоляцией браузером контента, полученного из разных источников с целью предотвращения злоупотребления влияния одного веб-сайта на операции с другим сайтом. Дополнительно описывается HTTP-заголовок "Origin", созданный для определения источника, ассоциированного с HTTP-запросом. Концепция "Web Origin" определена в RFC 6455 [4], который продвигается [8] в паре с RFC 6455, определяющем протокол WebSocket.
Альтернативные методы организации постоянно доступного канала связи с сервером излишне усложнены и не эффективны, так как основываются на периодической отправке проверяющих состояние запросов через метод XMLHttpRequests, на манипуляциях с iframe или на искусственном удержании HTTP-соединения в открытом состоянии. WebSocket обходится открытием одного активного соединения с сервером, что существенно снижает нагрузку, но требует обеспечения поддержки протокола на стороне клиента и сервера.
В настоящее время поддержка WebSocket уже реализована в большинстве современных браузеров, включая Opera, Firefox, Safari и Chrome. Поддержка WebSocket в Internet Explorer ожидается в версии 10, до этого момента можно использовать специальное дополнение [9] или универсальную реализацию [10] протокола на языке JavaScript, использующую функции Adobe Flash для создания постоянного канала связи. Компоненты для поддержки WebSocket на стороне сервера представлены на таких языках как Python [11], PHP [12], Perl [13], Си [14], JavaScript (node.js).
Ссылки:
[1] http://htfl.ru/cat-news-novosti
[2] /out.php?link=http://www.ietf.org
[3] /out.php?link=http://www.ietf.org/mail-archive/web/ietf-announce/current/msg09663.html
[4] /out.php?link=http://www.rfc-editor.org/rfc/rfc6455.txt
[5] /out.php?link=http://ru.wikipedia.org/wiki/RFC
[6] /out.php?link=http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00
[7] /out.php?link=http://www.apps.ietf.org/rfc/stdlist.html
[8] /out.php?link=http://www.ietf.org/mail-archive/web/ietf-announce/current/msg09662.html
[9] /out.php?link=http://html5labs.interoperabilitybridges.com/html5labs/prototypes/websockets/websockets/info/
[10] /out.php?link=http://github.com/gimite/web-socket-js
[11] /out.php?link=http://code.google.com/p/pywebsocket/
[12] /out.php?link=http://code.google.com/p/phpwebsocket/
[13] /out.php?link=http://search.cpan.org/%7Evti/Protocol-WebSocket-0.00906/lib/Protocol/WebSocket.pm
[14] /out.php?link=http://code.google.com/p/cwebsocket/