WebSocket: (2) 등장 배경

2024. 9. 7. 21:24iOS/네트워크

Web의 시대로 넘어오면서, 응용 계층인 HTTP를 사용하는 웹브라우저에서 실시간 통신을 구현하려는 시도가 있었다.

HTTP Polling

batch time마다 요청을 보내 새로운 이벤트를 확인한다. 실시간 보장하지 않고, 응답이 없어도 계속해서 batch time마다 응답해야하는 낭비가 있다.

HTTP Long Polling

요청을 보내고, server event가 올 때까지 대기 후, 응답한다. 낭비되는 리소스가 줄어들었지만, 이벤트가 많이 발생한다면, polling과 유사하다.

WebSocket의 등장

기존의 Socket과 유사하게 연결을 수립하고, 연결이 유지되는 동안, 실시간 메세지 교환이 가능하다.

Handshake

Client에서 Get Method로 WebSocket Key와 Upgrade Header를 통해 업그레이드 요청을 보낸다.

Server에서는 101 code와 WebSocket Accept Response를 보낸다.

Request

GET ws://websocketexample.com:8181/ HTTP/1.1
Host: localhost:8181
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: b6gjhT32u488lpuRwKaOWs==

Response

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

Data transport

Message를 Frame으로 쪼개서 전송한다.

Frame의 구조는 다음과 같다.

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 ...                |
+---------------------------------------------------------------+
  • FIN: 해당 프레임이 메세지의 끝인지 여부
  • RSV: extension에 대해 정의하지 않는 다면 0으로 고정, 아니면 연결 Fail됨
  • OpCode: 1 - text, 2 - binary, 0 - continue, 8 - close, 9 - ping, A - pong 컨틀로 프레임용

Reference

https://mingule.tistory.com/60

RFC 6455 WebSocket