Перейти до вмісту

WebSocket

Матеріал з Вікіпедії — вільної енциклопедії.

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

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

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

[ред. | ред. код]

Щоб встановити 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. Архів оригіналу за 24 серпня 2010. Процитовано 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. ↑ Архівована копія (PDF). Архів (PDF) оригіналу за 14 грудня 2010. Процитовано 14 грудня 2010.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  7. ↑ В Firefox 4 и Opera 11 будет заблокирована поддержка протокола WebSockets. Архів оригіналу за 11 січня 2011. Процитовано 25 грудня 2011.
  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. Архів оригіналу за 26 травня 2012. Процитовано 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.