WebSocket

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

У веб-застосунках доцільно використовувати протокол за необхідності відображення інформації в real-time. Альтернативна технологія Server-sent events.

Встановлення з'єднання

Щоб встановити WebSocket-з'єднання, клієнт надсилає handshake-запит — так званий запит на встановлення довіри, своєрідне, «цифрове рукостискання». Клієнт також надсилає свій відкритий ключ Sec-WebSocket-Key для шифрування повідомлень для нього. Відкритий ключ в секції параметрів HTTP-запиту кодується в форматі base64.

 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==

В разі встановлення з'єднання, сервер надсилає клієнтові відповідь. Де сервер, через правильне заповнення параметра Sec-WebSocket-Accept надає підтвердження, що він дійсно може встановлювати WebSocket-з'єднання. Алгоритм формування: до значення Sec-WebSocket-Key у вигляді як його отримав сервер, додається стрічка 258EAFA5-E914-47DA-95CA-C5AB0DC85B11; для отриманої стрічки розраховують SHA1-хеш, який кодується в форматі base64. На приклад:

 HTTP/1.1 101 Switching Protocols
 Upgrade: websocket
 Connection: Upgrade
 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

URL-схеми

Специфікація протоколу WebSocket визначає дві нові схеми URI, ws: та wss:,[2] для нешифрованого та шифрованого з'єднання відповідно. Поза іменем схеми, решта складових URI визначена загальним синтаксисом URI.[3]

Реалізація WebSocket у браузерах

Для встановлення з'єднання клієнтський скрипт створює об'єкт WebSocket, в конструктор якого передає параметр WebSocket URI, і визначає функції зворотного виклику при з'єднанні, отриманні повідомлення і розриві з'єднання.

<html>
    <head>
        <script>
            const webSocket = new WebSocket('ws://localhost/echo');

            webSocket.onopen = event => {
                alert('onopen');
                webSocket.send("Hello Web Socket!");
            };

            webSocket.onmessage = event => {
                alert('onmessage, ' + event.data);
                webSocket.close();
            };

            webSocket.onclose = 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. 14 листопада 2011. Процитовано 10 грудня 2011.
  3. draft-hixie-thewebsocketprotocol-76 - The WebSocket protocol. Tools.ietf.org. Архів оригіналу за 17 липня 2013. Процитовано 10 грудня 2011.
  4. Katie Marsal (23 листопада 2010). Apple adds accelerometer, WebSockets support to Safari in iOS 4.2. AppleInsider.com. Архів оригіналу за 17 липня 2013. Процитовано 9 травня 2011.
  5. Web Sockets API. RIM. Архів оригіналу за 17 липня 2013. Процитовано 8 липня 2011.
  6. Архівована копія. Архів оригіналу за 14 грудня 2010. Процитовано 14 грудня 2010.
  7. В Firefox 4 и Opera 11 будет заблокирована поддержка протокола WebSockets
  8. Chris Heilmann (8 грудня 2010). WebSocket disabled in Firefox 4. Hacks.Mozilla.org. Архів оригіналу за 17 липня 2013. Процитовано 9 травня 2011.
  9. Aleksander Aas (10 грудня 2010). Regarding WebSocket. My Opera Blog. Архів оригіналу за 17 липня 2013. Процитовано 9 травня 2011.
  10. Dirkjan Ochtman (27 травня 2011). WebSocket enabled in Firefox 6. Mozilla.org. Процитовано 30 червня 2011.
  11. Chromium Web Platform Status. Архів оригіналу за 17 липня 2013. Процитовано 3 серпня 2011.
  12. List of Chromium Command Line Switches. Peter.sh. Архів оригіналу за 17 липня 2013. Процитовано 10 грудня 2011.

Посилання

Статті
  • WebSockets / Виктор Клим // htmlhook.ru. — 07.05.2012, оновлено 05.11.2016.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.