WebSocket
WebSocket — технологія, що забезпечує двонаправлений повнодуплексний канал зв'язку через один сокет TCP. WebSocket спроектований для втілення у веб-браузерах та веб-серверах, але може також бути використаний будь-яким клієнт-серверним застосунком. Прикладний програмний інтерфейс WebSocket був стандартизований W3C, крім того протокол WebSocket стандартизований IETF як RFC 6455.[1] Оскільки звичайне TCP-з'єднання з портом, відмінним від 80, часто заблокований адміністраторами для зовнішнього використання, він може використовуватися так, щоб подолати це обмеження та забезпечити подібну функціональність з деякою додатковою надбудовою над протоколом шляхом мультиплексування кількох WebSocket-сервісів через один TCP-порт.
Зміст |
Установлення з'єднання [ред.]
Щоб установити WebSocket-з'єднання, клієнт надсилає запит на WebSocket-з'єднання (handshake request), а сервер відповідає на запит, як показано у наступному прикладі:
GET /ws HTTP/1.1 Host: pmx Upgrade: websocket Connection: Upgrade Sec-WebSocket-Version: 6 Sec-WebSocket-Origin: http://pmx Sec-WebSocket-Extensions: deflate-stream Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Відповідь сервера
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Клієнт надсилає ключ Sec-WebSocket-Key, кодований у base64. До цього ключа додається магічний рядок "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", хешується SHA1 і тоді кодується у base64. Зауважте, що Sec-WebSocket-Key кодований base64, але не декодується сервером. Результат є, коли у відповіді присутній заголовок "Sec-WebSocket-Accept".
Приклад перетворення Sec-WebSocket-Key на Sec-WebSocket-Accept:
- рядок "x3JJHMbDL1EzLkh9GBhXDw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11", хешований SHA1 дає "1d29ab734b0c9585240069a6e4e3e91b61da1969" hexadecimal value.
- команда Unix `printf "\x1d\x29\xab\x73\x4b\x0c\x95\x85\x24\x00\x69\xa6\xe4\xe3\xe9\x1b\x61\xda\x19\x69" | base64` друкує "HSmrc0sMlYUkAGmm5OPpG2HaGWk="
URL-схеми [ред.]
Специфікація протоколу WebSocket визначає дві нові схеми URI, ws: та wss:,[2] для нешифрованого і шифрованого з'єднання відповідно. Поза іменем схеми, решта складових URI визначена загальним синтаксисом URI.[3]
Реалізація WebSocket у браузерах [ред.]
Для встановлення з'єднання клієнтський скрипт створює об'єкт WebSocket, в конструктор якого передає параметр WebSocket URI, і визначає функції зворотного виклику при з'єднанні, отриманні повідомлення і розриві з'єднання.
<html> <head> <script> var webSocket = new WebSocket('ws://localhost/echo'); webSocket.onopen = function(event) { alert('onopen'); webSocket.send("Hello Web Socket!"); }; webSocket.onmessage = function(event) { alert('onmessage, ' + event.data); webSocket.close(); }; webSocket.onclose = function(event) { alert('onclose'); }; </script> </head> <body> </body> </html>
WebSocket підтримують такі браузери:
- Google Chrome (починаючи з версії 4.0.249.0);
- Apple Safari (починаючи з версії 5.0.7533.16);
- Mozilla Firefox (починаючи з версії 4);
- Opera (починаючи з версії 10.70 9067);
Також WebSocket підтримують
У кінці листопада 2010 Adam Barth опублікував[6] результати дослідження надійності протоколу, де було з'ясовано, що у випадку використання прозорих проксі-серверів можлива підміна кеша передаваних даних з тим, що користувачі замість реальних даних отримуватимуть версію даних від зловмисника. Проблема виявилася досить серйозною для того, щоб розробники Firefox та Opera оголосили[7][8][9], що в майбутніх версіях їхніх браузерів підтримка веб-сокетів буде за умовчанням відключена аж до усунення проблеми небезпеки цього протоколу (хоча залишилася можливість їх включити).
Нова версія -07 протоколу WebSocket, яка виправляє помилку протоколу, реалізована і включена по замовченню в Firefox 6 [10] та у Chrome 14.[11]
Також існує командна опція для Google Chrome (--enable-websocket-over-spdy) що дозволяє ранню екпериментальну реалізацію WebSocket через SPDY.[12]
Виноски [ред.]
- ↑ RFC 6455
- ↑ «IANA Uniform Resource Identifer (URI) Schemes». Iana.org. 2011-11-14. Процитовано 2011-12-10.
- ↑ «draft-hixie-thewebsocketprotocol-76 - The WebSocket protocol». Tools.ietf.org. Процитовано 2011-12-10.
- ↑ Katie Marsal (November 23, 2010). «Apple adds accelerometer, WebSockets support to Safari in iOS 4.2». AppleInsider.com. Процитовано 2011-05-09.
- ↑ «Web Sockets API». RIM. Процитовано 8 July 2011.
- ↑ [1]
- ↑ В Firefox 4 и Opera 11 будет заблокирована поддержка протокола WebSockets
- ↑ Chris Heilmann (December 8, 2010). «WebSocket disabled in Firefox 4». Hacks.Mozilla.org. Процитовано 2011-05-09.
- ↑ Aleksander Aas (December 10, 2010). «Regarding WebSocket». My Opera Blog. Процитовано 2011-05-09.
- ↑ Dirkjan Ochtman (May 27, 2011). «WebSocket enabled in Firefox 6». Mozilla.org. Процитовано 2011-06-30.
- ↑ «Chromium Web Platform Status». Процитовано 2011-08-03.
- ↑ «List of Chromium Command Line Switches». Peter.sh. Процитовано 2011-12-10.
Посилання [ред.]
- HLL Websocket Server Article linked to live demo and providing downloadable dhtml for running final draft protocols (submitted as standard).
- IETF Hypertext-Bidirectional (HyBi) working group
- The WebSocket protocol - Internet-Draft published by the IETF HyBi Working Group
- The WebSocket protocol - Original protocol proposal by Ian Hickson
- The WebSocket API - W3C draft specification of the API
- WebSockets.org сайт, присвячений WebSocket (підтримує тестовий луна-сервер на WebSocket)
- WebSocketsTest.org сайт, який перевіряє роботу WebSockets і Comet у вашому браузері
