본문 바로가기
카테고리 없음

웹 소켓

by 오우지 2021. 11. 21.

웹 소켓 : 두 프로그램 간의 메시지를 교환하기 위한 통신 방법 중 하나. (HTML5에서 많이 쓰인다.)

 

 

특징 : 

1. 양방향 통신

 

- 데이터 송수신을 동시에 처리 가능하다.

- 클라이언트와 서버가 서로 원할 때 데이터를 주고받을 수 있다.

 

2. 실시간 네트워킹(Realtime networking)

-웹 환경에서 연속된 데이터를 빠르게 노출

 

3. 텍스트와 바이너리만 전송할 수 있다.

 

방법 :

1. 핸드쉐이킹

기존의 http통신이랑 똑같이 3way hand-shaking을 통해서 통신을 시작한다. 이때 헤더에 들어갈 요소들이 있다.

 

요청


GET /chay HTTP/ 1.1       -- GET 메서드를 사용해야 하며 1.1 버전 이상이어야 한다.

Host: server.example.com -- 웹소켓 서버의 주소

Upgrade: websocket        -- 현재 프로토콜에서 다른 프로토콜로 변경하기 위한 규칙, websocket이면 이제 websocket                                           프로토콜로 변경하겠다는 의미를 내포하고 있다.

Connection: Upgrade       -- Upgrade 헤더 필드가 명시되었을 경우 송신자는 반드시 Upgrade 옵션을 지정한                                                  Connection 헤더 필드도 전송

Sec-WebSocket-key: fajd... -- 길이가 16바이트인 임의로 선택된 숫자를 base64로 인코딩 한 값, 서로의 신원 인증

Origin                           -- 클라이언트로 웹 브라우저를 사용하는 경우 필수, 클라이언트의 주소

Sec-WebSocket-Protocol: chat, superchat -- 클라이언트가 요청하는 여러 서브프로토콜을 의미, 순서에 따른 우선권 부                                            여, 서버에서 여러 프로토콜, 버전을 나눠 서비스할 경우 필요


 

 응답


HTTP/1.1 101 Switching Protocols -- 101 Switching Protocols가 Response로 오면 웹소켓이 연결 

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: fjawefjalkwe -- 클라이언트로부터 받은 Sec-WebSocket-key를 사용하여 계산된 값


2. 데이터 전송

프로토콜이 요청에서 지정한 WebSocket으로 변경, 데이터 보안을 위해 SSL을 적용한 프로토콜로도 가능

Message: 여러 frame이 모여서 구성하는 하나의 논리적 메세지 단위

frame: communication에서 가장 작은 다위의 데이터, 작은헤더 + payload

웹소켓 통신에서 사용되는 데이터는 utf-8, 0x00 + data + 0xff

 

 

한계: HTML5에서 통용되는 기술이기 때문에 그 이전 버전에서는 다른 기술이 필요하다.

Socket.io, SockJS - HTML5 이전 기술로 구현된 서비스에서 웹 소켓처럼 사용할 수 있도록 도와주는 기술로 브라우저와 웹 서버 종류와 버전을 파악해 가장 적합한 기술을 선택하는 방식

 

 

비슷한 개념

Polling : 서버로 일정 주기로 요청을 송신하기 때문에 불필요한 request와 connection을 생성한다.

Long polling : 서버에 요청을 보내고 이벤트가 생겨 응답 받을때까지 연결 유지. 많은 양이 쏟아지면 Polling과 같다

Streaming : 서버에 요청 보내고 끊기지 않은 상태에서 끊임없이 데이터 수신, 클라이언트에서 서버로 데이터 통신이 어렵다.

 

 

출처:

https://www.youtube.com/watch?v=MPQHvwPxDUw

https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API/Writing_WebSocket_servers