CS

WebSocket Protocol

dev-byul 2024. 4. 25. 19:44

작성 동기

동적으로 움직이는 사물들의 위치데이터를 실시간으로 지도에 보여주는 기능을 구현을 해야했습니다.

HTTP Polling  방식으로도 움직이는 사물들의 위치데이터를 받아올 수 있습니다. 하지만 데이터가 없는 경우 불필요한 요청과 HTTP 연결 지연시간을 고려했을 경우 WebSocket 을 이용하여 TCP 통신을 통해 데이터를 받아오는 것이 더 효율적이라 판단했습니다. 이에 Websocket Protocol이 무엇인지 정의를 조사하여 작성 하게되었습니다.

Websocket Protocol?

  • 2011년 IETF에 의해 RFC 6455로 표준화
  • 웹 IDL의 웹소켓 API는 W3C에 의해 표준화
  • 하나의 TCP 접속에 전이중(Full-Duplex) 통신채널을 제공하는 통신 프로토콜
  • OSI Layer 7계층 중 4계층 TCP에 의존
  • RFC 6455에 따르면 웹 소켓은 80과 433 포트 위에 동작하도록 설계
  • HTTP 프록시 및 중간 층을 지원하도록 설계되었으므로 HTTP 과 호환이 가능
  • 웹소켓 핸드셰이크는 HTTP 업그레이드 헤더를 사용하여 HTTP 프토콜에서 웹소켓 프로토콜로 변경

Websocket 동작 원리

Websocket은 TCP 기반 프로토콜이며, 엄연히 HTTP 프로토콜과는 다른 프로토콜입니다.

HTTP 프로토콜을 사용하는 시점은 오직 연결을 초기 설정하는 핸드셰이크 단계에서만 사용됩니다.

한번 Websocket 연결이 확립되고 나면, 데이터 교환은 Websocket 프로토콜로 이루어집니다.

Clinet 측에서 Websocket 으로 업그레이드 요청을 하고 이에 서버측에서는 이에 101 값을 전달 하는 것을 확인 할 수 있습니다.

Handshake 과정

클라이언트는 [ GET ] Connection : Upgrade 값을 요청하고,

서버측에서는 101 Switching Protocols / Connection : Upgrade 로 응답 하는 것을 볼 수 있습니다.

Data Framing

Websocket Upgrade 가 승인이 되고나면 클라이언트와 서버 양측간의 데이터 통신 단계가 시작됩니다.

클라이언트와 서버 양측 서로 통신하는 것을 전이중통신방식이라 합니다. 서로는 메세지를 보내며 통신하는데, 이 메세지는 프레임(Frame) 단위로 나뉘어 집니다.

각 프레임에는 메세지의 종류(Text, Binary, ping/pong, 종료 등), 데이터의 길이, 페이로드 데이터가 포함됩니다.

프레임

프레임의 구조는 다음과 같이 RFC 6455 Base Framing Protocol 로 정의되어 있습니다.

몇가지 간단한 설명을 첨부하면 다음과 같습니다. 보다 자세한 내용은 RFC 문서를 참조하거나 해당 블로그를 추천드립니다.

  • FIN : 현재 프레임이 메시지의 마지막 프레임인지를 나타냅니다. 1은 마지막 프레임을 나타내며 0 은 추가 프레임이 있다는 의미입니다.
  • Opcode: 프레임 종류를 나타냅니다. Text - 0x1, Binary - 0x2, Disconnectio - 0x8, ping - 0x9, pong - 0xA
  • Mask : 클라이언트에서 서버로 보내는 모든 프레임은 마스킹 처리되어야 합니다. 해당 비트는 마스킹이 되었다는 것을 의미합니다.
  • Masking-key : 데이터가 마스킹 되었다면 4바이트 마스킹 키를 제공합니다.
  • Payload Data : 실제 전송할 데이터입니다. 데이터가 마스킹 된 경우 마스킹 키를 사용하여 마스크를 해제한 후 원본 데이터를 복원합니다.

'CS' 카테고리의 다른 글

[ Web ] V8 - #2 Garbage Collector - Major GC  (0) 2024.05.18
[ Web ] V8 - #01 Javascript Engine  (0) 2024.05.04