웹 소켓 : 두 프로그램 간의 메시지를 교환하기 위한 통신 방법 중 하나. (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