ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로페셔널 node.js 웹소켓 이해
    My-Book(History) 2017. 4. 8. 16:38

    소켓 이 나오기 까지.... 


    수년간 HTTP 실시간 애플리케이션은 서로 궁합이 맞지 않았다. 그 이유는 HTTP 프로토콜의 성격에 있다.

    즉 HTTP 프로토콜은 무 상태이며 요청,응답 주기를 기반으로 한다.

    HTTP 서버는 클라이언트의 요청에만 반응하여 상태를 유지하는 클라이언트에 대한 커넥션을 갖고 있지 않다.


    HTML 및 자바스크립트 기반 애플리케이션은 클라이언트 이벤트에 반응하고 이를 서버로 보낼 수 있지만 그 반대는 쉽지 않다.

    서버에서 이벤트가 일어나면 서버는 실시간으로 이벤트에 대해 클라이언트에게 알려줄 수 있는 방법이 없다.

    다만 클라이언트가 현재 상태를 서버에게 요청할 때만 서버는 클라이언트에게 정보를 전달할 수 있다.

    전통적인 웹 채팅에 이와 같은 기능을 실시간으로 달성하거나 최소한 실시간에 가깝게 구현 하려고 할때는 우회적인 방법을 주로 사용했다.

    가장 간단한 형태의 방법은 전통적인 요청,응답 흐름을 사용하는 것이다

    즉, 모든 채팅 사용자의 브라우저가 정기적인 주기로 새 메시지를 가져오게끔 HTTP 서버를 폴링하는 것이다.

    예를들어 1초 미만의 주기로 빠르게 폴링하면 거의 실시간으로 상호 작용하는 것 같은 인상을 받게 된다.


    하지만 이 기술은 효율성이 크게 떨어졌다. 클라이언트는 가져올 메시지가 없을떄도 매 초 마다 풀링을 해야 하고

    서버는 전달할 메시지가 없더라도 연결된 채팅 사용자의 요청을 매초마다 모두 처리해야 하기 떄문이다.




    웹소켓 동작원리 이해


    기본적으로 웹소켓 커넥션은 HTTP 서버와 HTTP 클라이언트 사이의 TCP 커넥션일 뿐이다.

    이 커넥션은 HTTP 핸드셰이크와 매우 유사한 헨드셰이크 프로토콜을 사용해 설정한다.


    클라이언트는 커넥션을 초기화 한다 이를 위해 브라우저는 특수 HTTP / 1.1 요청을 서버로 보내고 

    이 요청의 커넥션을 웹소켓 커넥션으로 변환할지 묻는다.

    시작은 일반 HTTP 커넥션 처럼 진행되지만 클라이언트는 이 커넥션을 웹소켓 커넥션 업그레이드 하도록 요청하게되면

    핸드셰이크가 끝나게 되고 커넥션은 데이터 전송모드로 전환된다.


    이제 양측 모두 HTTP 오버헤드나 추가 핸드세이크 없이 메시지를 주고 받을 수 있으며, 클라이언트와 서버가 상대방을 기다리지 않고

    아무떄나 메시지를 주고 받을 수 있는 양방향 통신 커넥션이 만들어진다.

Designed by Tistory.