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 підтримують

  • мобільна версія Safari в iOS 4.2[4]
  • BlackBerry Browser в OS7[5]

У кінці листопада 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]

Виноски[ред.ред. код]

  1. RFC 6455
  2. «IANA Uniform Resource Identifer (URI) Schemes». Iana.org. 2011-11-14. Процитовано 2011-12-10. 
  3. «draft-hixie-thewebsocketprotocol-76 - The WebSocket protocol». Tools.ietf.org. Архів оригіналу за 2013-07-17. Процитовано 2011-12-10. 
  4. Katie Marsal (2010-11-23). «Apple adds accelerometer, WebSockets support to Safari in iOS 4.2». AppleInsider.com. Архів оригіналу за 2013-07-17. Процитовано 2011-05-09. 
  5. «Web Sockets API». RIM. Архів оригіналу за 2013-07-17. Процитовано 2011-07-08. 
  6. [1]
  7. В Firefox 4 и Opera 11 будет заблокирована поддержка протокола WebSockets
  8. Chris Heilmann (2010-12-08). «WebSocket disabled in Firefox 4». Hacks.Mozilla.org. Архів оригіналу за 2013-07-17. Процитовано 2011-05-09. 
  9. Aleksander Aas (2010-12-10). «Regarding WebSocket». My Opera Blog. Архів оригіналу за 2013-07-17. Процитовано 2011-05-09. 
  10. Dirkjan Ochtman (May 27, 2011). «WebSocket enabled in Firefox 6». Mozilla.org. Процитовано 2011-06-30. 
  11. «Chromium Web Platform Status». Архів оригіналу за 2013-07-17. Процитовано 2011-08-03. 
  12. «List of Chromium Command Line Switches». Peter.sh. Архів оригіналу за 2013-07-17. Процитовано 2011-12-10. 

Посилання[ред.ред. код]