웹 소켓은 HTTP와 구분되는 통신 프로토콜이다
HTTP 통신은 Request 와 Response이 존재한다
-> 요청은 클라가, 응답은 서버가
고로 서버는 먼저 클라에게 데이터 전송 못함!
서버는 클라가 요청을 해야 수동적으로 응답해주는 반 이중 통신
웹소켓은 전이중 통신으로 요청없이 능동적으로 메시지 보내기 가능
고로 실시간 네트워킹이 보장 되는 환경에서 유용하다!!
HTTP Polling
주기적으로 클라가 서버로 HTTP 요청을 보내고 즉시 응답을 받는 방식으로 실시간성 구현
서버가 클라에 제공할 데이터가 없어도 클라이언트는 그 사실을 모르므로 오버헤드 발생!
HTTP Long-Polling
서버가 요청에 대한 연결을 즉시 닫고 응답하지않고, 일정 시간동안 연결을 열어두는 기법!
연결이 열려있으면 서버가 클라로 제공할 데이터가 있으면 바로 전송 가능해서 오버헤드가 비교적적다
그래도 메시지 많으면 일반 폴링과 다를게 없다
HTTP Streaming
서버에 요청을 보내고 HTTP연결을 끊지 않은채 계속 서버로부터 데이터를 수신하는 기법
단 연결을 안끊어서 클라가 서버로 데이터 송신하는데 어려움 존재
위 3가지 방법 모두 HTTP 프로토콜 기반으로 이루어지는데 애초에 HTTP 패킷 자체의 크기가 작지 않기 때문에
실시간성을 보장하기 위해 사용 되기에는 그리 적합하지 않다
연결 수립
최초 연결 요청시 클라이언트에서 HTTP를 통해 웹서버에 요청 -> 이를 핸드 쉐이크라고 함
핸드 쉐이크 성공시 둘 간의 통신 프로토콜은 websocket으로 전환된다
(status 101이 성공이고 이게 프로토콜을 websokcet으로 바꾼다)
전 이중 통신
서로는 메시지를 보내면 통신하는데 이 메시지는 프레임 단위로 이루어진다
ping 패킷을 언제든지 보낼수 있다 -> 가능한 빨리 ping 패킷 다시 전송해줘야함!
서로 살아있는지 확인 => Heartbeat
연결 종료 - 클라 서버 둘다 연결 종료 가능 => close Frame 상대쪽으로 보내면 끝