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. {{cite web}}: Недійсний |deadurl=404 (довідка)
  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.