WebSocket
или
Туда и Обратно
Трубачев Артём, 2016
Проблема?
HTTP
Comet
- polling
- long polling
- iframe без конца
- другие костыли
Comet
WebSocket — протокол полудуплексной связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером
в режиме реального времени.
Туда
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
Обратно
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Туда - Обратно
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
Туда - Обратно
Контрольные фреймы
- Close
- Ping
- Pong
Туда - Обратно
Фреймы данных
- Text
- Binary
Туда - Обратно
Зарезервированные фреймы
Безопасность
- Origin header
- нет авторизации
- wss
Расширения
Sec-WebSocket-Extensions: bar; baz=2
Sec-WebSocket-Protocol: soap, wamp
Тут
var socket = new WebSocket("ws://localhost");
socket.onopen = function() {
console.log("Соединение установлено.");
};
socket.onclose = function(event) {
console.log("Соединение закрыто.");
};
socket.onmessage = function(event) {
console.log("Получены данные " + event.data);
};
Там
EM.run {
EM::WebSocket.run(:host => "localhost", :port => 80) do |ws|
ws.onopen { |handshake|
ws.send "Hello Client, you connected to #{handshake.path}"
}
ws.onclose { |msg|
puts 'Connection closed'
}
ws.onmessage { |msg|
ws.send "Pong: #{msg}"
}
end
}
Поддержка
10
11
11
16
6
12.10
4.4
Отладка
Производительность
1000 clients
10 000 clients
100 000 clients
1 req/sec
Производительность
4ghz i7 4790Ks 16GB of RAM
Производительность
4ghz i7 4790Ks 16GB of RAM
Недостатки
- ресурсоемкость
- нет кеширования
- обрывы соединения
- отдельное приложение
- слишком круто
Преимущества
- full duplex
- меньше трафика
- меньше задержка
- не только браузер
- легко использовать
- стандарт
- одно соединение
- нет проблем с прокси
Применение
- Чаты
- Онлайн-игры
- Трейдинг
- Совместное редактирование документов
- Мониторинг
- Ваш стартап
Заключение
- хорошая поддержка технологии
- стандарт
- выигрыш в производительности
- НЕ серебряная пуля
- хороший инструмент для своих задач
Спасибо
trubachev.artem@gmail.com