SlideShare a Scribd company logo
Follow us @boldarecom
Understanding
WebSockets
_from the ground up_
Webinar
Follow us @boldarecom
Józef
Flakus
_Senior software developer_
Follow us @boldarecom
Dawid
Yerginyan
_Senior software developer_
Follow us @boldarecom
1. HTTP a Node.js
2. Protokół WebSocket
3. Nawiązywanie połączenia
4. Podprotokoły
5. Ramki
6. Demo
7. To wszystko?
_Request_
POST /users HTTP/1.1
Host: localhost:8000
Accept: application/json
Connection: close
Content-Type: application/json
Content-Length: 23
--- empty line ---
{“id”:“ABC123”}
_HTTP/1.x_
Follow us @boldarecom
Realtime? 🤔
WebSocket (RFC6455)
❏ protokół umożliwia dwukierunkową komunikację między
klientem a serwerem
❏ wiadomości przesyłane na tym samym połączeniu TCP
Przykłady:
❏ chaty
❏ wizualizacje/wykresy real-time
❏ gry
❏ …
Implementacje:
❏ ws
❏ sockjs 🤨
❏ socket.io🤨
Client:
GET /ws HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Server:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Połączenie
❏ “handshake”
❏ request HTTP (zawsze GET)
❏ klient może zażądać
konkretnego podprotokołu
bądź rozszerzenia
❏ na tym etapie można
zastosować mechanizmy
uwierzytelniania i
autoryzacji
Client:
GET /ws HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Protocol: json, v12.stomp, plaintext
Server:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: plaintext
Połączenie
❏ “handshake”
❏ request HTTP (zawsze GET)
❏ klient może zażądać
konkretnego podprotokołu
bądź rozszerzenia
❏ na tym etapie można
zastosować mechanizmy
uwierzytelniania i
autoryzacji
Ramka
❏ FIN
❏ opcode
❏ mask
❏ payload length
❏ extended payload length *
❏ masking-key *
❏ payload data
| | | |
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+-+-+-+-+-------+-+-------------+-------------------------------+
|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 ... |
+---------------------------------------------------------------+
Ramka
❏ Ramki wysłane przez client
muszą zostać zamaskowane
prostym szyfrem XOR 🤫
❏ Ramki wysyłane przez
serwer mogą pozostać
jawne
_Client_
| | | |
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Masking-key, if MASK set to 1 |
|I|S|S|S| (4) |A| (7) | (32) |
|N|V|V|V| |S| | |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
_Server_
| | | |
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Payload Data |
|I|S|S|S| (4) |A| (7) | |
|N|V|V|V| |S| | |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+-------------------------------+
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
Opcode
❏ 4 bit
❏ informuje o typie ramki
❏ na jego podstawie jesteśmy w
stanie stwierdzić strategię
wysłanej/otrzymanej
wiadomości
0x0 (0b0000) - kontynuująca ramka
0x1 (0b0001) - ramka tekstowa (utf-8)
0x2 (0b0010) - ramka binarna
0x8 (0b1000) - zamknięcie połączenia
0x9 (0b1001) - PING
0xA (0b1010) - PONG
Maskowanie
❏ 32 bit klucz
❏ szyfr XOR
❏ alternatywa wykluczająca
10100101 11000011 00101101 00110100 (klucz)
⊕ 01101000 01100101 01101100 01101111 (payload)
-------------------------------------
11001101 10100110 01000001 01011011
Follow us @boldarecom
DEMO
_Dalsze kroki_
❏ obsługa wiadomości powyżej 126 bit
❏ obsługa wiadomości przychodzących w częściach
❏ ping/pong
❏ wiadomości binarne
❏ zarządzanie aktywnymi połączeniami
❏ broadcasting
❏ kompresowanie wiadomości
❏ wykrywanie i zamykanie martwych połączeń
❏ implementacja dedykowanych podprotokołów
❏ ...
Follow us @boldarecom
❏ DEMO
github.com/JozefFlakus/ws-playground
❏ RFC6455
tools.ietf.org/html/rfc6455
❏ WS
github.com/websockets/ws
❏ szyfr XOR
en.wikipedia.org/wiki/XOR_cipher
❏ Rejestr podprotokołów WS
iana.org/assignments/websocket/websocket.xml
Follow us @boldarecom
Q&A!
@boldarecom
www.boldare.com/career

More Related Content

More from Boldare

Accelerate your business's growth with product strategy and user-centric desi...
Accelerate your business's growth with product strategy and user-centric desi...Accelerate your business's growth with product strategy and user-centric desi...
Accelerate your business's growth with product strategy and user-centric desi...
Boldare
 
De–constructing leadership | Anna Zarudzka | Boldare
De–constructing leadership | Anna Zarudzka | BoldareDe–constructing leadership | Anna Zarudzka | Boldare
De–constructing leadership | Anna Zarudzka | Boldare
Boldare
 
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
Boldare
 
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #510 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
Boldare
 
GraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem ApolloGraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem Apollo
Boldare
 
Digital transformation in practice. A case study of change.
Digital transformation in practice. A case study of change.Digital transformation in practice. A case study of change.
Digital transformation in practice. A case study of change.
Boldare
 
The functional reactive nature of Marble.js
The functional reactive nature of Marble.jsThe functional reactive nature of Marble.js
The functional reactive nature of Marble.js
Boldare
 
Summary of 2018 at boldare
Summary of 2018 at boldareSummary of 2018 at boldare
Summary of 2018 at boldare
Boldare
 
Why UI & UX Design Matters? For building digital and software products
Why UI & UX Design Matters? For building digital and software productsWhy UI & UX Design Matters? For building digital and software products
Why UI & UX Design Matters? For building digital and software products
Boldare
 

More from Boldare (9)

Accelerate your business's growth with product strategy and user-centric desi...
Accelerate your business's growth with product strategy and user-centric desi...Accelerate your business's growth with product strategy and user-centric desi...
Accelerate your business's growth with product strategy and user-centric desi...
 
De–constructing leadership | Anna Zarudzka | Boldare
De–constructing leadership | Anna Zarudzka | BoldareDe–constructing leadership | Anna Zarudzka | Boldare
De–constructing leadership | Anna Zarudzka | Boldare
 
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
Tech mentoring - dlaczego łatwiej rozwijać się razem | No Exceptions #5
 
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #510 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
10 sposobów, abyś mniej nienawidził spotkań | No Exceptions #5
 
GraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem ApolloGraphQL w React z wykorzystaniem Apollo
GraphQL w React z wykorzystaniem Apollo
 
Digital transformation in practice. A case study of change.
Digital transformation in practice. A case study of change.Digital transformation in practice. A case study of change.
Digital transformation in practice. A case study of change.
 
The functional reactive nature of Marble.js
The functional reactive nature of Marble.jsThe functional reactive nature of Marble.js
The functional reactive nature of Marble.js
 
Summary of 2018 at boldare
Summary of 2018 at boldareSummary of 2018 at boldare
Summary of 2018 at boldare
 
Why UI & UX Design Matters? For building digital and software products
Why UI & UX Design Matters? For building digital and software productsWhy UI & UX Design Matters? For building digital and software products
Why UI & UX Design Matters? For building digital and software products
 

Understanding web sockets from the ground up

  • 4. Follow us @boldarecom 1. HTTP a Node.js 2. Protokół WebSocket 3. Nawiązywanie połączenia 4. Podprotokoły 5. Ramki 6. Demo 7. To wszystko?
  • 5.
  • 6. _Request_ POST /users HTTP/1.1 Host: localhost:8000 Accept: application/json Connection: close Content-Type: application/json Content-Length: 23 --- empty line --- {“id”:“ABC123”} _HTTP/1.x_
  • 7.
  • 8.
  • 10. WebSocket (RFC6455) ❏ protokół umożliwia dwukierunkową komunikację między klientem a serwerem ❏ wiadomości przesyłane na tym samym połączeniu TCP Przykłady: ❏ chaty ❏ wizualizacje/wykresy real-time ❏ gry ❏ … Implementacje: ❏ ws ❏ sockjs 🤨 ❏ socket.io🤨
  • 11. Client: GET /ws HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 Server: HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Połączenie ❏ “handshake” ❏ request HTTP (zawsze GET) ❏ klient może zażądać konkretnego podprotokołu bądź rozszerzenia ❏ na tym etapie można zastosować mechanizmy uwierzytelniania i autoryzacji
  • 12. Client: GET /ws HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 Sec-WebSocket-Protocol: json, v12.stomp, plaintext Server: HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: plaintext Połączenie ❏ “handshake” ❏ request HTTP (zawsze GET) ❏ klient może zażądać konkretnego podprotokołu bądź rozszerzenia ❏ na tym etapie można zastosować mechanizmy uwierzytelniania i autoryzacji
  • 13. Ramka ❏ FIN ❏ opcode ❏ mask ❏ payload length ❏ extended payload length * ❏ masking-key * ❏ payload data | | | | 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 +-+-+-+-+-------+-+-------------+-------------------------------+ |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 ... | +---------------------------------------------------------------+
  • 14. Ramka ❏ Ramki wysłane przez client muszą zostać zamaskowane prostym szyfrem XOR 🤫 ❏ Ramki wysyłane przez serwer mogą pozostać jawne _Client_ | | | | 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Masking-key, if MASK set to 1 | |I|S|S|S| (4) |A| (7) | (32) | |N|V|V|V| |S| | | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+-------------------------------+ | Masking-key (continued) | Payload Data | +-------------------------------- - - - - - - - - - - - - - - - + : Payload Data continued ... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Payload Data continued ... | +---------------------------------------------------------------+ _Server_ | | | | 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Payload Data | |I|S|S|S| (4) |A| (7) | | |N|V|V|V| |S| | | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+-------------------------------+ : Payload Data continued ... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Payload Data continued ... | +---------------------------------------------------------------+
  • 15. Opcode ❏ 4 bit ❏ informuje o typie ramki ❏ na jego podstawie jesteśmy w stanie stwierdzić strategię wysłanej/otrzymanej wiadomości 0x0 (0b0000) - kontynuująca ramka 0x1 (0b0001) - ramka tekstowa (utf-8) 0x2 (0b0010) - ramka binarna 0x8 (0b1000) - zamknięcie połączenia 0x9 (0b1001) - PING 0xA (0b1010) - PONG
  • 16. Maskowanie ❏ 32 bit klucz ❏ szyfr XOR ❏ alternatywa wykluczająca 10100101 11000011 00101101 00110100 (klucz) ⊕ 01101000 01100101 01101100 01101111 (payload) ------------------------------------- 11001101 10100110 01000001 01011011
  • 18. _Dalsze kroki_ ❏ obsługa wiadomości powyżej 126 bit ❏ obsługa wiadomości przychodzących w częściach ❏ ping/pong ❏ wiadomości binarne ❏ zarządzanie aktywnymi połączeniami ❏ broadcasting ❏ kompresowanie wiadomości ❏ wykrywanie i zamykanie martwych połączeń ❏ implementacja dedykowanych podprotokołów ❏ ...
  • 19. Follow us @boldarecom ❏ DEMO github.com/JozefFlakus/ws-playground ❏ RFC6455 tools.ietf.org/html/rfc6455 ❏ WS github.com/websockets/ws ❏ szyfr XOR en.wikipedia.org/wiki/XOR_cipher ❏ Rejestr podprotokołów WS iana.org/assignments/websocket/websocket.xml