CS WebSocket
업데이트:
카테고리: CS
/웹 소켓
http 와는 다르게 브라우저와 웹 서버가 실시간으로 통신을 주고 받음
기존 api 는 데이터를 요청하면 그에맞는 데이터를 보내주는 식이였지만, 웹 소켓은 한번 연결해두면 그 연결이 지속되어 주기적으로 서버에 새로운 데이터가 쌓일때마다 요청을 보내, 클라이언트는 데이터를 보여주고, 클라이언트에서 새로운 데이터를 보내면 서버에서 바로 저장해주고 하는식으로 진행한다.
이전에 사용한 기술
-
Polling
일정시간마다 요청을 보내, 데이터가 있으면 받아오고, 아니면 없다고 리턴함
데이터가 생길때보다 아닌경우가 많기에 불필요한 호출이 너무많음 실시간이라기에는 주기적으로 데이터를 받아오는 것 정도
-
Long Polling
Polling보다 서버에서 좀 더 길게 대기해서 이벤트를 받음, 대기하는 중에 데이터가 발생하면 클라이언트로 보낸다. 이벤트가 생길때까지 서버는 계속 대기하고 있는다.
많은 양의 데이터가 쏟아지면 Polling과 다를것이 없어짐
-
Streaming
클라이언트가 요청을 보내면 그 이후에는 웹 서버가 무기한 열려있어 언제든 서버 → 클라이언트로 response를 보낼 수 있다.
실시간으로 데이터를 받을 수 있을거같지만, 중간에 중재자가 연결을 끊어버릴 수도 있고, 라운드로빈 스타일로 작업을 처리하기 때문에 오래걸리면 다시 처리할 수 있어 실시간성을 보장하기가 힘들다 또한 클라이언트 → 서버로는 데이터를 보내기가 힘들기 때문에 WebSocket을 대체할 수 없다
동작 방법
- 처음에 클라이언트가 서버의 웹소켓을 연결하기 위해서 요청을 보낸다.
- 서버는 그에 맞는 응답(수락코드 : 101 Switching Protocols)을 해준다.
- 데이터가 들어있는 메세지를 클라이언트에서 보내면 서버에서는 DB에 저장 + 그에 맞는 갱신된 데이터를 보낸다.
1, 2의 과정이 클라이언트-서버의 초기 연결을 설정하기 위한 프로토콜 교환 단계(핸드쉐이킹
)이다.
Client 헤더에서 여러가지 값을 포함하여 넘기는데
Upgrade
: 프로토콜을 전환하기 위한 헤더, 웹소켓 연결을 위해서는websocket
값을 가지고 나머지 값은 다른 값이라고 인식하여 접속을 중지 시켜버린다.Connection
: 접속 요청이후 네트워크 접속을 유지에 대한 정보, 웹소켓 연결시에는Upgrade
값을 가지고 다른값일 경우 바로 접속을 중지시킨다.Sec-WebSocket-Key
: 유효한 요청인지 확인하기 위한 키값Sec-WebSocket-Protocol
: 사용하고자 하는 프로토콜 지정Sec-WebSocket-Version
: 클라이언트가 사용하고자 하는 웹소켓의 버전
3의 과정은 본격적으로 데이터를 전송하는 단계로 서버-클라이언트가 메세지
의 개념으로 데이터를 주고 받는다.
- Type : 메세지는 텍스트와 바이너리 유형이 있디. 바이너리 타입은 이미지나 영상같은 큰 사이즈의 데이터를 보낼 수 있다.
- Payload : 실제 주고받는 데이터가 포함되어 있음
주기적으로 서버-클라이언트는 서로가 살아있는지 확인하기 위해 heartbeat 패킷을 보내고, ping을 체크한다.