Web Socket(HttpSocket)

nGyu·2022년 4월 13일
0

Network

목록 보기
7/9

앞서 알아본 내용과 같은 Socket관련된 내용이다.

그런데, 뭔가 좀 다르다. 앞에서는 TCP/IP Socket이었다. 그렇다면 WebSocket은 무엇일까?

바로, Layer의 차이이다.

Web Socket 은 HTTP Layer에서 동작하여 HTTP Socket이라고도 불리지만, TCP/IP Socket의 경우, TCP/IP Layer에서 동작한다.

Web Socket HandShake 및 실행 흐름

Web Socket도 동일하게 실시간 통신을 해야하는 상황에 사용이 된다.

하지만, 동작방법은 TCP/IP Socket과 조금 다르다.

Web Socket은 HTTP로 HandShake를 한 후, ws로 프로토콜을 변환(http 혹은 https 프로토콜을 연결하는동안 ws프로토콜로 변환 시킨다.)하여 Frame을 통해 데이터를 전송한다.

이는 Full-duplex 즉, 양방향 통신을 지원하여 요청과 응답을 구분짓지 않는다.

연결수립(Opening HandShake)

연결을 수립하는 과정은 크게 어렵지 않다.

Client가 손을 내밀고 Server가 손을 내밀면 끝이다. 이 과정을 Opening HandShake라고 한다.

Client → Server

처음에는 Client가 Server에 Upgrade 요청을 보내게 된다.
이 요청을 보내는 이유는, Http 혹은 Https 프로토콜을 ws 프로토콜로 변환을 시키기위한 요청이다.

이 때 주의할 점이 있는데, 바로 HTTP 버전과 HTTP Method이다.

HTTP Version - 1.1이상
HTTP Method - GET

이 두가지는 필수로 해야한다고 MDN에 기재가 되어있다.

Server → Client

이 후 Server가 요청을 받으면 101 상태코드와 함께 응답을 보내게 된다.

해당 응답이 오게되면 프로토콜은 전환이 된 것이고, 이제부터 통신을 할 수 있게 된것이다.

데이터 프레임 교환(Data Transfer)

이 과정은 이제 Server와 Client 간의 데이터 송/수신이 가능하게 되었다.
이 부분을 이제 Data Trnasfer라고 한다.

Frame단위로 메시지를 주고받게 된다.

해당 Frame에는 Text(UTF-8), Data Binary, Controll Frame(프로토콜 레벨의 신호) 등 다양한 신호가 있다.

HandShake가 끝난 시점부터 Server와 Client는 서로 생존여부를 알기 위해 heartbeat패킷을 보내게 되며, 주기적으로 ping을 보내 체크를 한다.

이 부분은 서로 설정이 가능하다.

접속 종료(Close HandShake)

해당 단계는 말 그대로 접속을 종료하는 단계이다.

이 단계에서는 Close HandShake라고 하는데, 여기서도 HandShake가 들어가게 된다.

해당 HandShake는 서버 혹은 클라이언트 어디에서도 접속 종료 요청을 보낼 수 있으며 둘 중 어느 지점에서든지 먼저 Close 송신하면 수신측은 Close Response를 보내 서로의 연결이 끊기게 된다.

이 후, 수신되는 모든 데이터들은 처분된다.

WebSocket 한계

웹소켓은 브라우저에 따라서 한계가 확실히 존재한다.

구현이 어려우며, 너무 많은 트래픽을 요구하는 서비스의 경우 비용이 많이든다, HTML5 이전의 기술들에 대해서 지원이 어렵다 등의 문제점이 존재한다.

Socket IO , Sock JS

HTML 5이전의 서비스 부터는 적용이 어렵다.

위 문제를 해결하기 위해 Socket IO, Socket JS 가 존재한다. WebSocket의 경우 HTML5 이후에 나온 기술이기 때문에 HTML5 이전에는 적용이 매우 까다로워 지는데, 이러한 문제를 Socket IO 혹은 SockJS에서 “웹소켓 처럼 사용”할 수 있게 해준다.

이 두가지들은 Client단에서 적용을 하는것으로, JavaScript를 이용해 브라우저 상관없이 실시간 웹을 구현할 수 있게 되었으며, 브라우저나 웹 버전의 종류와 상관없이 상황에 따라 가장 적합한 기술을 선택하여 사용하는 방법이다.

STOMP - SubSocket

http는 형식이 정해져 있지만, ws는 정해져있지 않다.
WebSocket은 문자열들을 주고받을 수 있게만 해줄 뿐이다.

WebSocket은 데이터의 전송만 맡아주는 기술이며, 이로 인해 주고받은 데이터는 오로지 애플리케이션 단에서 해석을 해야한다.

하지만, 여기서 문제가 발생을 하게 되는데 HTTP는 형식이 정해져 있어 해석이 쉽다.

실제로 REST Api 를 이용한 Server와 Client의 통신을 하게 되면 response.body 혹은 request.body와 같이 body에 담기게 되었는데 WebSocket은 그렇지 않았다.

WS에는 SubProtocol이 존재하는데 위 문제를 해결하기 위해 적용된 Sub Protocole이 바로 STOMP, Simple Text Oriented Message Protocol 이다.

profile
지금보다 내일을, 모레를 준비하자

0개의 댓글