polling (= Ajax Polling)
- 클라이언트가 주기적으로 서버에 데이터를 요청하고 응답받는 방식
- 주기가 짧으면 서버에 부담이 되고, 길면 실시간성이 떨어진다
- 실시간으로 주는건 불가능하다
- 보낼 데이터가 없어도 계속해서 응답을 줘야하므로 서버 리소스를 낭비하게 된다 (HTTP 오버헤드 발생)
Long polling
- 서버에 요청을 보내고 서버 이벤트가 발생할 때까지 연결을 유지하고, 이벤트가 발생하면 클라이언트는 응답을 받고 연결을 끊는다. 그리고 또 다른 이벤트를 받기 위해 다시 HTTP 요청을 보낸다
- 클라이언트에서 서버에 요청을 보내고 응답이 올때까지 or time out이 될때까지 무한정 기다린다. 커넥션이 끊기면 클라에서 서버로 다시 연결을 요청한다. 항상 연결이 유지 되어 있고, 실시간 통신이 가능하다
- 이벤트가 발생하면 바로 응답이 이루어지기 때문에 실시간성이 아주 높다
Server-Sent Events (SSEs)
- 클라이언트가 HTTP를 사용해 서버에 연결하면 서버는 이벤트가 발생할때마다 클라이언트에게 데이터를 보낸다
- 한 번 연결이 맺어지면 지속되고 만약 서버와 연결이 끊어질 경우 클라이언트는 자동으로 재연결을 시도한다.
- 클라이언트에서 연결을 끊어도 서버단에서 감지가 어려움
- HTML5 표준안
- HTTP Content-Type을 application/event-stream으로 지정해야 한다.
- HTTP 프로토콜을 기반으로 하므로 로드 밸런싱과 같은 수단을 통해 확장 가능
- 최대 동시 접속 수 : 6개
- 모든 웹 브라우저는 같은 서버에 동시 활성 HTTP/1 연결 상한선이 있다. 일반적으로 RFC 2616에 따라 4~6 범위이다. HTTP/2, HTTP/3을 사용하면 기본으로 100개를 허용한다. (이를 사용하기 위해선 HTTPS를 설정해야 한다.)
- 참고 : https://stackoverflow.com/questions/16852690/sseeventsource-why-no-more-than-6-connections/62427993#62427993
- 모든 웹 브라우저는 같은 서버에 동시 활성 HTTP/1 연결 상한선이 있다. 일반적으로 RFC 2616에 따라 4~6 범위이다. HTTP/2, HTTP/3을 사용하면 기본으로 100개를 허용한다. (이를 사용하기 위해선 HTTPS를 설정해야 한다.)
- UTF-8 데이터만 전송 가능
- 서버에서 받는 푸시 위주의 작업이 적합 ex) 친구 상태 업데이트, 주식 시세, 뉴스피드, 트위터
Web socket
- HTML5 표준안, TCP/IP 스택 위에 구축된 전송 계층
- 서버-클라이언트간 웹소켓 연결은 HTTP프로토콜을 통해 이루어진다. handshake 과정이 성공적으로 끝나면 HTTP를 웹소켓 프로토콜로 바꾸는 protocol switching 과정이 진행된다. 그러면 웹소켓을 위한 ws(일반)나 wss(SSL) 소켓이 만들어지고 이소켓을 이용해 통신한다
- 웹소켓은 최초 접속을 제외하고 헤더정보를 보내지 않기에 네트워크 비용 측면에서 이득
- 연결 끊겼을 때 자동으로 연결해주는 소스 추가해야함
- 구버전 IE에서 지원되지 않기 때문에 순수 webSocket API 보다 자체 스펙으로 다시 감싼 다른 솔루션(socket.io, sockjs...) 을 이용해서 개발해야 한다