WebSocket

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

WebSocket — це протокол, що забезпечує двонаправлений повнодуплексний канал зв'язку через один TCP-сокет. WebSocket спроектовано для втілення у веб-браузерах та веб-серверах, але може також використовуватись будь-яким клієнт-серверним застосунком. Прикладний програмний інтерфейс WebSocket був стандартизований W3C, крім того протокол WebSocket стандартизований IETF як RFC 6455.[1] Зв'язок здійснюється через 80-ий TCP-порт, а отже, його можна застосовувати в тих середовищах, де блокуються всі інші веб-з'єднання через фаєрвол.

Встановлення з'єднання[ред.ред. код]

Щоб встановити WebSocket-з'єднання, клієнт надсилає handshake-запит, а сервер відповідає, як показано у наступному прикладі:

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. Щоб сформувати відповідь, до закодованого ключа додають рядок GUID 258EAFA5-E914-47DA-95CA-C5AB0DC85B11, а потім (! не розкодовуючи ключ) хешують через SHA1 та base64. І на завершення, результуючу відповідь вкладають в заголовок Sec-WebSocket-Accept.

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. 

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