Web Socket

WebSocket

댕발바닥 2024. 3. 24. 15:23

 

WebSocket이란?

WebSocket이란 프로토콜의 일종으로 서버와 클라이언트간에 Socket Connection을 유지함으로써 언제든 양방향 통신 또는 데이터 전송이 가능하도록 하는 기술이다.

이는 통상적으로 Client가 요청을 보내는 경우에 Server가 응답을 하는 단방향 통신인 HTTP와 다르게 실시간으로 클라이언트와 서버가 원할 때 데이터를 주고 받는다.

하여, 연속된 데이터를 빠르게 노출 할 수 있음으로 실시간 네트워킹이 필요한 채팅, 주식 등에 사용되어지고 있다.

 

 

WebSocket 이전 기술

 

1. Polling

polling

  • 폴링이란 realTime 웹을 위한 기법으로, 일정한 주기를 가지고 서버와 응답을 주고 받는 방식을 말한다.
  • 폴링은 일정한 주기를 통하여 이벤트를 감지함으로 통신 발생을 정확히 예측하기 어려우며, 불필요한 요청과 connection이 발생된다.

 

2. Long Polling

long polling

  • 폴링의 단점을 보완하고자 나온 long polling은 요청을 통한 서버의 접속을 열어두어 서버의 이벤트 응답을 기다리다 응답을 진행한다
  • 이벤트들의 시간 간격이 좁게되면 polling과 큰차이가 없으며, 서버의 부담을 주는 단점을 가지고 있다.

 

3. Streaming

streaming

  • 일반적인 TCP Connection과 비슷하며, 클라이언트와 서버간 연결된 연결 통로로 데이터를 보내는 방식이다.
  • 데이터를 작은 조각으로 나누어 클라이언트에 전송하며, Transfer-Encoding: chunked 헤더가 데이터를 작은 조각으로 나누어 전송하는 데 사용됩니다.
  • http 프로토콜 통신의 한계로 통신에 오버헤드가 발생되는 단점을 가지고 있다.

 

WebSocket 동작 방식

WebSocket

  • WebSocket 최초 연결을 위하여 HTTP, HTTPS통신을 통하여 핸드 쉐이킹이 일어난다.

 

클라이언트 요청 헤더

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
  • Method: GET요청 메소드가 필수
  • Host: 웹소켓 서버 주소
  • Upgrade: 현재의 프로토콜에서 다른 프로토콜로 업그레디으, 변경하기 위한 설정 (websocket 프로토콜로 변환)
  • Connection: Upgrade 필드가 명시 되어있다면, Connection 필드도 명시해줘야 한다.
  • Sec-WebSocket-Key: 길이가 16바이트인 임의의 값으로 클라이언트와 서버가 신원을 인증하는데 사용한다.

 

서버 응답 헤더

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  • 101 Switching Protocols 응답으로 웹소켓 연결 성공 의미이다.
  • 잘못된 형식의 요청으로 인한경우, 서버의 "400 Bad Request" 응답을 통하여 소켓을 종료 시킨다.
  • 위 과정을통해 프로토콜 ws, wss(WebSocket)으로 변환되어 frame을 사용하여 데이터를 교환한다.

 

Frame

 

  • Message: 여러 frame이 모여서 구성하는 하나의 논리적 메시지 단위이다.
  • Frame: WebSocket 에 데이터 교환에 사용되는 가장 작은 단위로 데이터이며 헤더페이로드로 구성되어 있다.

 

Frame Header

  • 일반적으로는 2byte이며, 대용량 페이로드 경우 최대 14byte까지 가능하다.
1. 첫번째 byte

FIN: 해당 프레임이 메세지의 끝임을 나타내는 플래그
RSV1, RSV2, RSV3: 확장에 사용되는 예약 필드
Opcode: 페이로드 유형 지정(ex. 텍스트, 바이너리, 핑 등..) 
2. 두번째 byte

MSK: 페이로드 마스킹 여부 표시
페이로드 길이: 페이로드의 길이를 지정

 

Frame Payload

  • WebSocket 연결을 통해 전송되는 실제 데이터가 포함된 부분이며, 마스킹 된 경우 헤더에도 포함된 마스킹 키와 XOR처리 된다.
  • 페이로드 길이는 헤더에 지정된 페이로드 길이에 따라 가변적이며, 125바이트 이하면 프레임에 직접 저장되지만 그보다 크게 되면 페이로드 길이 필드는 126 혹은 127로 설정된 이후 페이로드의 실제 길이는 헤더 뒤에 오는 별도의 필드에 저장된다.

 

WebSocket 특징 정리

  • 최초 접속시는 HTTP, HTTPS 프로토콜 위에서 핸드 쉐이킹을 하여 해당 프로토콜이 사용된다.
  • 별도의 포트가 존재하지 않으며, 기존 포트를 사용하면 된다.
  • 프레임으로 구성된 논리적인 메세지 데이터 단위로 송수신을 진행한다.
  • 메세지에 포함될 수 있는 교환 가능한 메세지는 텍스트와 바이너리 뿐이다.

 

 

 

 

 

 

참조

https://jjongbin.tistory.com/entry/Web-Socket-%EC%86%8C%EC%BC%93

https://velog.io/@codingbotpark/Web-Socket-%EC%9D%B4%EB%9E%80