Facebook 메신저와 MQTT |
1. comet 정의
comet 은 브라우저에서 명시적인 요청없이 웹서버에서 브라우저로 데이터를 push 하는 웹 어플리케이션 모델이다. comet은 이 상호작용을 위한 다양한 기술을 포함하는 용어이다. |
2. 방식
Polling |
|
기본적인 http 프로토콜이다. 특정 요청에 대해 이벤트가 있던 없던 응답을 보낸다. 요청에 대한 서버 부담이 크지 않거나 실시간 메시지 전달이 크게 중요하지 않은 서비스에 적합하다. 네트워크 프로그래밍의 non-block 방식이랄까? |
Long Polling |
|
Polling 모델과 차이점은 클라이언트의 요청에 대해 서버에서 이벤트 발생시에만 응답을 준다는 것이다. Polling 과 Long Polling 의 차이점은 즉 클라이언트 요청에 대한 서버의 대처방식이다. 네트워크 프로그래밍에서 block 방식이랄까? 조금 다른 점은 네트워크 block 방식에서는 응답을 받았다고 연결을 끊지 않지만 Long Polling 에서는 응답을 받으면 연결을 끊고 다시 연결을 한다는 점이다. |
Streaming |
Streaming 은 요청후에 연결을 지속하여 계속적인 응답을 받는 것이다. Polling, Long Polling 과 다르게 응답을 받은후 연결을 종료하지 않는다. 서버는 상태변화(이벤트)시 이 스트림을 통해 응답을 지속적으로 보낸다. 이 모델의 경우 요청이 단 한번만 이루어지기 때문에 서버와 네트워크 트래픽에 부하를 덜 준다. 하지만 응답데이터의 시작과 끝을 알수 없기 때문에(스트림이니까) 데이터의 유효성을 체크하는 루틴이 필요하다. 네트워크 프로그래밍의 단방향 모델이랄까? |
3. 세부방식
모델 | 구현법 |
Polling & Long Polling | url call |
XMLHttpRequest | |
Streaming | XMLHttpRequest |
IFrame | |
Htmlfile | |
Multipart | |
Server Sent Event | |
Web Socket |
Polling 과 Long Polling 은 클라이언트에서 구현이 동일하다. Long Polling 은 서버쪽의 특별한 기능이 필요하다.(응답을 이벤트 발생시에만 보내는 것)
구현법 | 설명 |
url call (callback polling) | 가장 기본적인 브라우저 구현방식이다. |
XMLHttpRequest | XHR은 callback polling 과 다르게 script 코드 없이 필요 데이터만을 보낼수 있다. 대체로 xml, json 등으로 응답 데이터를 전달한다. |
IFrame | inner frame 은 부모 frame 내에 자식으로 frame 을 넣고 요청과 응답을 자식 frame에서 처리하도록 하는 것이다. |
htmlfile | htmlfile 이라는 ActiveX Object를 이용하는 방식으로 IFrame의 단점(클릭소리, 연결중 표시)을 해결 할 수 있다. |
Multipart | 서버에서 응답을 content-type 을 multipart/x-mixed-replace 로 보내는 방식으로 multipart/x-mixed-replace 은 서버 푸시와 http 에서 스트림 구현을 위해 개발되었다. |
Server Sent Event | HTML5 에 정의된 서버 푸시 기술의 표준이다. |
Web Socket | HTML5에 처음 도입된 WebSocket은 comet 보다 훨씬 더 최신의 기술이다. WebSocket은 양방향 전이중 통신 채널을 사용하며 많은 브라우저에서 지원하고 있다. WebSocket은 몇가지 특수 헤더와 함께 WebSocket 핸드쉐이크라고 하는 HTTP요청을 통해 연결이 열린다. 이 연결은 계속 유지되며 원시 TCP 소켓을 사용하는 것처럼 javascript에서 데이터를 쓰고 수신할 수 있다. |
FlashSocket (참고) | 장점 : FlashSocket은 HTML5 WebSocket을 지원하지 않는 브라우저에서도 WebSocket 기능을 투명하게 제공한다. 단점 : flash 플러그인을 설치해야한다.(보통 모든 브라우저에는 이미 설치 되어 있음) WebSocketJS 프로젝트는 브릿지를 제공한다. 이 프로젝트에는 최소한 Flash 10이 필요하고 Firefox 3, internet Explorer 8, 9 까지 Websocket 지원을 제공한다. |
클라이언트(브라우저)는 XMLHttpRequest 를 Polling, Long Polling, Streaming 구현시 다 사용할 수 있다. 좋다.
WebSocket 등 더 좋은 기술을 사용할 수 있지만 지원하지 않는 브라우저를 위해 차선택인 comet 모델을 지원할 수 있도록 하는 것이 좋다.
4. 예제
Long Polling - url 호출 (JSONP) |
클라이언트 요청 서버 응답 |
클라이언트는 script 를 요청하고 url 에 callback 파라미터를 통해 처리함수를 넘겨준다. 서버는 callback 파라미터로 넘어온 처리함수를 호출할수 있도록 하고 내부 인자로 JSON 혹은 XML , 일반 데이터를 얻어 보내준다. 위와 같이 JSON 데이터를 콜백함수로 감싸는 것을 JSONP 라고 한다. 클라이언트는 script 코드를 실행하므로써 자신이 원하는 처리를 할 수 있다. 구현은 간단하나 서버의 응답이 script 코드를 넘겨주므로 우리가 원하던 JSON, XML 데이터로만으로 받을 수는 없다. <script> 태그의 특성상 src에 지정한 리소스를 모두 읽어온 후에 해석하고 실행하기 때문에 스트리밍 방식을 사용할 수 없다. 하지만 <iframe> 태그는 src에 지정한 리소스를 모두 읽지 않아도 받은 데이터를 즉각즉각 해석하기 때문에 스트리밍이 가능하다. |
장점 : 여러 브라우저에서 사용 가능하며 포트, 도메인등의 제약을 받지 않는다. 단점 : 에러나 http의 상태를 다룰 수 없고 스트리밍 방식을 사용할 수 없다. |
Long Polling - XMLHttpRequest (XHR) |
클라이언트 요청 // 응답이 완료되면 서버로 // 서버로 요청 연결하기 xhr.open('POST', url, true); xhr.send(null); } 서버 응답 - XML , JSON , 일반 데이터 |
url 호출을 이용한 script 방식과 비슷하나 서버 응답 데이터가 script 로 감싸여 있지 않는다. 즉 데이터 그 자체로만으로 반환된다. XMLHttpRequest 라는 객체를 사용한다. |
장점 : 에러와 http 상태를 더 정교하게 다룰 수 있다. 단점 : 보안 제약이 있다.(몇몇 브라우저에서 XHR을 통한 스트리밍이 되지 않는다. ) |
Streaming - XHR streaming |
클라이언트 요청 function xhrStreaming(url, callback) { // 최신 텍스트를 가져오기 위한 위치 if(xhr.readyState > 2) { lastSize = xhr.responseText.length; } if(xhr.readyState == 4) { // 응답이 완료되면 xhrStreaming(url, callback); } } // 서버로 요청 연결하기 서버 응답 - XML , JSON , 일반 데이터 (Content-Length = 0) |
XHR Long Polling 과 비슷하나 readyState 상태가 완료 상태가 아닌 데이터의 일부를 받았을때 처리를 한다는 것에서 다르다. 또한 서버는 연결을 끊지 않고 계속적으로 데이터를 보낸다. 데이터의 앞과 뒤가 없어 데이터의 유효성을 체크하는 기능이 필요하고 응답 데이터는 계속적으로 쌓이므로 주기적으로 데이터를 없애거나 주기적으로 연결 해제후 다시 연결하는 방식을 사용해야한다. 원리 : |
장점 : 응답 결과의 텍스트 뿐 아니라 헤더에도 직접 접근할 수 있고 장애도 비교적 쉽게 처리할 수 있다. |
Streaming - IFrame Streaming |
클라이언트 요청 예1) function foreverFrame(url, callback) { 예2) var iframe = document.getElementById(iframe_id); iframe.style.position = 'absolute'; 서버 응답 <script>parent.foreverFrame.callback("the first message");</script> |
내부 프레임이라는 html 객체를 이용한다. iframe 은 frame 내부에서 보이지 않게 요청을 보내고 응답결과를 실행한다. 서버 응답의 경우 주기적으로 clean 코드를 두어 계속적으로 쌓이는 <script> 코드를 제거해주어야한다. |
장점 : 폭넓은 호환성이 있다. 왠만한 오래된 브라우저도 <iframe>태그를 지원한다. 단점 : 에러를 제대로 다룰 수 없다. http 상태를 다룰 수 없다 . 모바일 브라우저에서 사용할 수 없다. 웹 브라우저의 기본 보안 정책인 동일 출처 정책(same-Origin Policy)의 영향을 받으므로 도메인이나 스키마, 포트가 다른 문서간에는 사용할 수 없다. |
Streaming - htmlfile streaming |
클라이언트 요청 예1) // we were served from child.example.com but // make sure it’s really scriptable // set the iframe up to call the server for data // start communicating 예2) function foreverFrameByHtmlfile(url, callback) { transferDoc = new ActiveXObject("htmlfile"); } function foreverFrameClose() { } // 페이지가 이동되거나 |
<iframe> 대신 ActiveX 콘트롤의 htmlfile 객체를 이용하는 방법이다. 따라서 인터넷 익스플로러의 경우만 사용할 수 있다. 기본적인 내용은 iframe 와 동일하다. |
Streaming - multipart streaming (XHR multipart streaming) |
클라이언트 요청 //we create a norma xhr object (this is the mootools way but can be anything) //we active the multipart option of the xhr object 서버 응답 HTTP/1.1 200 OK [json data] ... |
멀티파트는 데이터를 구분자(위의 예제에서는 --myboundary)로 나누므로써 데이터의 시작과 끝을 정확히 표현하고 스트리밍 방식으로 데이터를 계속 넘겨주기에 좋은 방법이다. multipart 의 자세한 내용은 google 검색을 활용하라. |
장점 : 여러 브라우저에서 지원하고 , XHR 의 보안제약인 readyState 가 3 일때 응답 데이터에 접근하지 못하는 제약도 피한다. 단점 : |
streamint - Server Sent Events (the event-source object) |
클라이언트 요청 예1) document.getElementsByTagName("event-source")[0] .addEventListener(" a_specific_id ", eventHandler, false); 예2) //create the event-source object in the dom 예3) var eventSource = new EventSource("server.asp"); 서버 응답 코드 예) 예2) <?php 예3) <?php 응답 데이터 예) Content-Type: application/x-dom-event-stream |
html5 에 정의된 서버푸시 기술의 표준인 server sent events api를 사용한다. |
장점 : 심플한 자료구조와 인터페이스, 통신 매커니즘을 정의하고 있으며 일반적인 DOM 이벤트 형태로 수신 데이터를 처리 할 수 있는 등 서버푸시 구현이 매우 간단해진다. 단점 : |
Streaming - WebSocket |
클라이언트 요청 var ws = new WebSocket('ws://127.0.0.1:8080/async'); ws.onerror = function(e) { ws.onclose = function() { ws.onmessage = function(msg) { // Here is how to send some data to the server 서버 응답 jetty 컨테이너용 websocket 핸들러 public final class ReverseAjaxServlet extends WebSocketServlet { WebSocket 구현 @Override @Override @Override @Override Websocket 구현 class Endpoint implements WebSocket { Outbound outbound; @Override @Override @Override @Override @Override 메시지 보낼때 if (outbound != null && outbound.isOpen()) { |
websocket 을 이용하여 데이터 스트림을 생성하고 마치 tcp/ip 통신을 하듯이 프로그래밍을 하면 된다. |
장점 : 단점 : |
참고 : http://breathair.tistory.com/113 - XMLHttpRequest(XHR) 설명
|
'학습자료(~2017) > 네트워크' 카테고리의 다른 글
나만의 ip 할당 규칙 (0) | 2013.08.08 |
---|---|
[Virtual Lan] vlan 개념 및 설정 (0) | 2013.06.25 |
[네트워크]네트워크 이론 간략히 알아보는 좋은 자료 (0) | 2012.04.06 |
IP 네트워크 scanning 기법 - 포트 스캔, ping 참조할 곳 (0) | 2012.01.27 |
[네트워크] SSL에 관한 사이트와 OpenSSL_API를 이용한 프로그래밍 자료 (0) | 2012.01.12 |