[Network] 13. Websocket, WebRTC


Websocket

  • TCP 프로토콜의 일종으로 클라이언트와 서버 사이에 지속적인 완전 양방향 연결 스트림을 만들어 주는 기술이다.
  • Websocket 프로토콜은 HTTP 폴링과 같은 반이중방식에 비해 더 낮은 부하를 사용하여 실시간 양방향 대화방식을 가능하게 한다.
  • 즉 HTTP 통신은 요청을 보내면 응답을 받는 단방향 통신만 가능했지만, WebsocketTCP 기반으로 양방향 통신이 가능하다.
  • HTTP 는 문자 메시지와 비슷하다. 즉 선톡은 없고, 문자를 보내야 답장이 온다.
  • Websocket은 요청하지 않아도 먼저 메시지를 받을 수 있고 요청을 먼저할 수도 있다.

Websocket 작동방식

  • 서버와 브라우저 간 커넥션은 new WebSocket 을 호출하며 만들어지는데 ws(or wss)라는 특수 프로토콜을 사용한다.
  • 최초 소켓 생성 후 서버가 Websocket 통신을 지원할 수 있다면 프로토콜을 업데이트하여 HTTP 가 아닌 Websocket 프로토콜을 사용해 서버-브라우저 간 통신을 진행한다.
  • 소켓이 정상적으로 만들어지면 다음의 이벤트를 사용할 수 있게된다.
    • open : 커넥션 생성
    • message : 데이터 수신(서버로부터)
    • send : 데이터 전송(서버로)
    • error : 에러 발생
    • close : 커넥션 종료
  • HTTP 와는 다른 TCP 프로토콜이지만 포트 80 및 443을 사용해 HTTP 를 통해 작동한다.
  • 기존 방화벽 규칙을 재사용할 수 있도록 설계되었다.
  • 연결순서
    1. 유저가 HTTP 형식으로 Websocket 통신을 요청한다(Handshaking). 이 때 반드시 GET method를 통해서만 진행해야한다.
    2. 클라이언트와 서버 간의 신원확인(인증)
    3. 서버에서 Websocket으로 업그레이드, 즉 프로토콜이 ws로 변환된다.
    4. 양방향 Websocket 통신 시작. 이 때 인코딩 utf-8 형식을 따른다.
  • Websocket 은 HTTP 호환 가능하도록 설계되었고 HTTP 요청으로 시작하지만 두 프로토콜의 아키텍처와 어플리케이션 프로그래밍 모델이 매우 다르다.
  • 일반적인 HTTP + REST 의 Application 은 여러 URL 로 모델링하고 서버는 URL, HTTP Method, Header 를 기반으로 요청을 라우팅한다.
  • 반면 Websocket은 초기 연결을 위한 하나의 URL 만 존재한다. 그리고 HTTP 와 달리 메세지 내용에 의미를 규정하지 않는 저수준 전송 프로토콜이다.
    • Websocket 은 연결 요청에 대해 HTTP 를 통해 Switching 및 HandShaking 이 이루어진다.
    • TCP 는 이진(Binary)데이터만 주고 받을 수 있으나, Websocket 은 Binary 와 Text 데이터도 주고 받을 수 있다.

When to Use Websocket

  • Websocket을 활용하면 동적이고 실시간 대화를 만들어낼 수 있다.
  • 하지만 무조건 Websocket을 쓸 필요는 없고 Ajax, HTTP 스트리밍, polling, Long polling과 같은 방법으로도 효과적인 서비스를 제공 할 수 있다.
    1. Polling

      u출처 : https://rubberduck-debug.tistory.com/123

      • 클라이언트가 평범한 HTTP Request 를 서버로 계속 요청해 이벤트 내용을 전달받는 방식이다.
      • 가장 쉬운 방법이지만 클라이언트가 지속적으로 Request를 요청하기 때문에 클라이언트의 수가 많아지면 서버의 부담이 급증한다.
      • HTTP Request Connection 을 맺고 끊는 것 자체가 부담이 많은 방식이고, 클라이언트에서 실시간 정도의 빠른 응답을 기대하기 어렵다.
    2. Long Polling

      u출처 : https://rubberduck-debug.tistory.com/123

      • 클라이언트에서 서버로 일단 HTTP Request 를 요청한다.
      • 이 상태로 계속 기다리다가 서버에서 해당 클라이언트로 전달할 이벤트가 있다면 그 순간 Response 메세지를 전달하며 연결이 종료된다.
      • 곧이어 클라이언트가 다시 HTTP Request 를 요청해 서버의 다음 이벤트를 기다리는 방식이다.
      • polling 보다 서버의 부담이 줄겠으나, 클라이언트로 보내는 이벤트들의 시간 간격이 좁다면 polling 과 별 차이 없게 되며, 다수의 클라이언트에게 동시에 이벤트가 발생될 경우 서버의 부담이 급증한다.
    3. Streaming

      s출처 : https://rubberduck-debug.tistory.com/123

      • Long Polling 과 마찬가지로 클라이언트에서 서버로 HTTP Request 를 요청한다.
      • 서버에서 클라이언트로 이벤트를 전달할 때 해당 요청을 해제하지 않고 필요한 메세지만 보내기(Flush)를 반복하는 방식이다.
      • Long Polling 과 비교하여 서버에 메세지를 보내지 않고도 다시 HTTP Request 연결을 하지 않아도 되어 부담이 경감된다고 한다.
  • 예를 들어 뉴스나 메일, SNS 피드는 동적으로 업데이트하는 것은 맞지만, 몇 분마다 업데이트하는 것이 좋다.
  • 반면에 협업, 게임, 금융 앱은 훨씬 더 실시간으로 작용해야 한다.
  • 대기 시간만이 결정적인 요소는 아니다. 메세지의 크기가 상대적으로 적은 경우(ex. 네트워크 장애 모니터링) HTTP streaming 이나 polling 이 효과적이 솔루션이 될 수 있다.
  • Websocket 을 사용하는데 가장 적합한 경우는 짧은 대기 시간고주파수대용량의 조합인 경우이다.
  • 실시간으로 반응하기 위해 무지성으로 Websocket 을 사용하는 것은 효과적이지 않을 수 있다.

WebRTC

  • 스트리밍 프로토콜 중 하나다.

    Untitled

  • WebRTC웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API이다.
  • WebRTC는 다음 구성요소를 통해 작동을 활성화한다.
    • getUserMedia : 장치에 접근하여 오디오와 비디오 미디어를 가져온다.
    • RTCPeerConnection : 피어 간 오디오, 비디오 통신을 활성화한다.
    • RTCDataChannel : 임의의 바이너리 데이터 교환을 할 수 있게한다.
  • WebRTC 구축을 위해 알아야 할 개념
    1. ICE (Interactive Connectivity Establishment)

      • ICE 는 두 장치가 서로를 찾고 연결을 설정할 수 있게 대기 시간이 가장 짧은 경로를 찾을 수 있게끔 해주는 프레임워크이다.
      • 다른 피어와 연결을 설정하려면 엔드포인트가 다른 사람과 공유할 공용 IP 주소를 알아야 한다.
      • 웹 브라우저가 피어와 연결할 수 있도록 하는 프레임워크, 방화벽이 있는 경우, 공용 IP 주소가 없는 경우 등의 문제로 피어간 연결을 하지 못하는 경우가 있다.
      • 이 때 STUN/TURN 서버를 이용하여 이 문제를 해결한다.
    2. STUN (Session Traversal Utilities for Nat)

      • STUN 서버는 다른 사람과 통신할 수 있는 공용 IP 주소를 제공한다. 하지만 때때로 실패한다.
      • symmetric NAT 을 사용하는 경우에는 또 다른 보안 계층을 엔드포인트에 더하고, IP 주소 뿐만 아니라 port 까지 바꾸어버려 연결할 수 없게 한다.
      • 이 경우 TURN 서버를 사용해야 한다.
    3. TURN (Traversal Using Relays around Nat)

      • 피어 간 직접 통신이 실패할 경우 엔드포인트들 사이에 데이터 릴레이를 수행하는 TURN 서버를 사용한다.
      • TURN은 리소스 낭비가 크기 때문에, STUN 을 수행 후 실패할 때 사용한다.
    4. NAT (Network Address Translate)

      • IPv4 의 주소 부족 문제를 해결하기 위한 방법이다. 사설 네트워크 주소를 사용하는 망에서 외부(공인)와의 통신을 위해 네트워크 주소를 변환하는 것이다.
      • 외부 인터넷망과 연결하는 장비인 라우터에 NAT 을 설정할 경우, 라우터는 자신의 공인 IP 주소만 외부로 알려지게 하여 내부 네트워크를 보호할 수 있는 이점이 있다.
맨 위로 이동 ↑

댓글 남기기