WebSocket - 예엣날에 공부했던 내용 정리

# Websocket
WebSocket Tutorial with Python

웹소켓이란, HTTP 프로토콜의 단점을 극복하고 실시간 full duplex통신을 위한 기술이다.
개인적으로 웹소켓의 핵심은 Real-time dataflow라 생각한다.

1. 웹소켓이 맺어지는 흐름

Client가 TCP/IP 요청을 보내면 서버에서 TCP/IP 요청을 수락한다.
그 후 Client는 서버에게 웹소켓 handshake를 요청하고 서버는 이를 수락한다.
이렇게 하면 http에서 websocket으로 프로토콜이 전환되며 connection이 만들어지고 
이 때부터 웹소켓을 통해 데이터를 송, 수신한다.

* 웹소켓은 Http와 전혀 다르다. 다만 웹소켓을 만드는데에 http가 개입을 하는 것이다.
웹소켓이 만들어지면 서버는 응답코드 101을 보낸다. (101은 프로토콜이 전환되었음을 알리는 응답코드다)

2. 웹소켓은 왜 쓰는 것인가? Http보다 더 나은 점이 있을테니 websocket을 쓸텐데 그 점은 무엇일까?

그걸 알기 위해서는 일단 비동기 http 통신방식인 Ajax(XMLHttpRequest, 이하 htttp)에 대해 좀 알아야 한다.
AJAX의 본래 이름은 XMLhttprequest이다. 이 기술이 나오고 비동기 통신이 팍! 떡상했다.
하지만 http엔 단점이 있다. 크로스 오리진 문제와 헤더의 용량 문제다.

3. 웹소켓이 http보다 더 나은 점은?

웹소켓과 비교하면 http통신은 항상 요청헤더가 부여되기 때문에 1바이트의 정보를 송신하고 싶어도 수킬로바이트에 달하는 쓸모없는 정보를 보내야한다.
"에이 1바이트를 보낼 일이 언제 있다고" 하는 생각이 먼저 들었는데, 생각해보면 채팅같은 경우엔 말을 짧게 짧게 보내기도 한다. 
"ok" 보내면 겨우 2바이트다. 이걸 매번 http로 통신한다면 저 짧은 두 글자를 보내는데도 많은 트래픽이 소요될 것이고 이는 성능의 문제로 귀결될 것이다.
Real-time application에서는 속도가 중요하기 때문에 채팅 같은 경우엔 매 번 헤더를 보내지 않아도 되는 web-socket이 더 의미있는 것이다.

이 외에도 
1. full duplex(전이중통신, 수신과 송신을 동시에 처리할 수 있는 방식)
2. 브라우저에서(클라이언트에서) TCP통신으로 확장해야 할 경우
3. 개발하기 용이한 API가 필요한 경우
4. 일반적인 웹 환경에서 SOA로 확장해야 할 경우가 있다.  (2,3,4번은 아직 잘 모르겠음)

4. 이러한 대안은 웹소켓 이전엔 없었는가?

HTTP Comet이라는 기술이 있다.
당연히 웹소켓이 나오기 전에도 HTTP 프로토콜로 실시간 데이터 송/수신의 니즈는 있었다.
이런 니즈를 해결하기 위해 data가 갱신되면 push하는 방식을 통틀어 HTTP Comet이라 일컫는다.
주로 사용하는 방식이 Polling과 Streaming이다.
Polling은 클라이언트가 서버에게 "데이터가 갱신되면 나에게 보내줘"라는 request를 보내놓는 것을 말한다.
서버는 만약 데이터가 갱신이 되면 데이터를 담아 response를 보내고 HTTP연결은 끊어진다.
그리고 클라이언트는 다시 Request를 보낸다. (반복)
하지만 여전히 헤더를 계속해서 보내기 때문에 불필요한 트래픽이 발생한다.
클라이언트가 request를 계속해서 보내면 낭비이므로 주로 인터벌이 긴 Long Polling을 쓰는 것 같다.
이 외에도 node.js에서만 동작하는 socket.io가 있다고 한다.


참고 : http://webclub.tistory.com/463

댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용