HTTP 프로토콜과 WebSocket 프로토콜

기존의 HTTP 프로토콜은 서버와 클라이언트 사이의 연결이 유지되지 않는다.(connectionless) 이로 인해 HTTP로 실시간 통신을 구현하는덴 어려움이 많았고 보완하기 위해 WebSocket 프로토콜이 나왔다. WebSocket은 서버와 클라이언트 사이의 연결이 계속 유지되는 특성이 있고 이로 인해 양방향 통신을 가능하게 한다.

WebSocket은 TCP 프로토콜에서 양방향 커뮤니케이션을 가능하게 하는 통신 프로토콜이다. HTTP 의 프록시를 지원할 수 있게 하기 위하여 HTTP 포트 80, 443에서 동작하도록 설계되었다. 이 때문에 HTTP 프로토콜과의 호환도 가능하다. 웹소켓을 사용하기 위해서는 HTTP Upgrade header라는 걸 사용하여 HTTP 프로토콜에서 WebSocket 프로토콜로 전환된다. 이 과정을 WebSocket HandShake라고 함.

WebSocket 프로토콜을 이용하면 이전에 서버와 클라이언트 간의 실시간, 양방향 통신을 가능하기 위해서 HTTP Polling 방식을 사용했던 것보다 overhead가 확실히 작아진다. 이는 클라이언트가 먼저 서버에게 요청하지 않고, 서버가 클라이언트에게 contents를 보내고 이 연결이 계속 열린채로 유지되기 때문에 가능하다.

그럼 socket.io는 ?

socket.io는 WebSocket 프로토콜 라이브러리는 아니다. WebSocket, FlashSocket, AJAX Long Polling, Ajax Multi part Streaming, IFrame, JSONP Polling 을 하나로 추상화한 것이다. 즉 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 실시간 웹을 구현할 수 있도록 한다. 예를 들어 브라우저에 Flash Socket을 지원하는 Flash Plugin v10.0.0 이상이 있으면 FlashSocket을 이용하고 없으면 Ajax Long Polling 방식을 이용한다.
즉 가능하면 websocket을 사용하고 그렇지 않으면 다른 통신 방법을 선택해 사용한다.

참고