728x90

websocket을 설명하기에 앞서 HTTP에 대해 간략히 설명하겠습니다.

 

HTTP에 대한 간략한 설명

HTTP(Hyper Text Transfer Protocol)은 웹상에서 정보를 주고받을 수 있는 프로토콜인데

주로 html문서를 주고받을때 사용되며 HTTP는 클라이언트와 서버 사이에 이루어지는

요청(request)과 응답(response) 프로토콜입니다 

 

HTTP의 한계점 

HTTP의 특징중하나로 클라이언트가 서버에게 요청(request)를 보내고 서버가 답(response)을 주면

그대로 연결이 끊긴다.

서버와 다수의 클라이언트가 연결을 유지한다면 서버에 많은 리소스 낭비가 생기는데

HTTP프로토콜에는 이러지 않고 요청(request)에 응답(response)를 주면 연결이 끊기기 때문에

리소스 낭비가 적다.

 

하지만 이러한 http에는 여러 단점이 존재한다.

1. 요청(request)를 보낼 때 페이지가 리로딩 된다.

2. 동일한 요청에 중복된 헤더파일을 보낸다.

3. 실시간 상호작용성이 떨어진다.  

 

-Polling(폴링)

 

 

폴링기술은 클라이언트가 서버에게 계속해서 http requests를 날려 response(응답)을 받는 방식이다.

 

딱봐도 클라이언트는 서버에게 계속 요청(request)를 날리기 때문에 서버에 부담이온다.

 

또한 유저(클라이언트)가 아무것도 하지않아도 쓸데없이 서버의 리소스를 낭비하게된다.

 

또한 클라이언트에서 실시간정도의 빠른응답을 기대하기도 힘들다

 

-Long Polling

롱폴링은 클라이언트가 서버로 일단 http 요청을 날린다. 이 상태로 계속 기다리다가 서버에서 해당 클라이언트로 전달한 이벤트가 생기면 그순간 응답 메세지를 전달하면서 연결이 종료된다. 하지만 곧바로 클라이언트는 다시 요처을 날려 서버의 다음 이벤트를 기다리는 방식이다.

 

요약하자면

  1. 클라이언트가 웹서버로 HTTP 요청을보낸다
  2. 요청을 받은 웹서버는 데이터가 있을 때 까지(이벤트가 발생할 때 까지) 기다린다
  3. 데이터 혹은 이벤트가 발생하면 클라이언트로 HTTP응답을보낸다
  4. 응답을 받은 웹브라우저(클라이언트)는 데이터를 출력하고 HTTP연결을 끊는다
  5. 그리고 웹브라우저(클라이언트)는 다시 HTTP요청을 보낸다
  6. 기다린다
  7. 반복

Streaming

클라이언트가 서버에게 http request 를 보내고 서버는 응답을 끊임없이 흘려보낸다.(trickles out)

 

각 기술들의 문제점을 요약하자면

HTTP 통신규약 : 서버에게 요청보내고 응답 받으면 연결이 끊긴다. 서버-클라이언트 실시간 상호작용이 안된다.

 

그래서 실시간 상호작용할 수 있게 효과만 내본 기술들

Polling 기술 : 서버로 계속해서 요청보내기(근데 서버에 이벤트 없어도 계속 요청보냄>서버,클라이언트 무리)

 

Long polling기술 : 서버에 요청보내고 이벤트가 생겨 응답 받을 때 까지 연결안끊기. 응답받으면 끊고 다시 새요청보냄(근데 새 이벤트 생기면 모든 사용자가 연결 끊고 동시에 새요청보내게됨>서버무리)

 

Streaming 기술 : 서버에 요청보내고 끊기지 않은 연결상태에서 끊임없이 데이터받기(근데 클라이언트가 서버로 요청을 보내기 좀 힘듬. 스트리밍에서는 하나의 포트써서 읽고 쓰기 동시에 안됨)

 

 

이러한 기술들의 문제점인 실시간네트워킹이 가능한것이 바로 WebSocket이다

 

websocket(웹소켓)은 http를 기반으로 하면서 http의 문제점해결을 목표로 나온 기술이다.

이전의 통신과 달리 이중통신(full-duplex통신) 즉 수신과 송신을 동시에 처리가 가능하다.

socket connection을 유지하기 때문에 양방향 통신, 실시간통신, 데이터 전송이 가능하고

html5에 포함되어 프로토콜로 제정되어있다.

 

기존의 TCP SOCKET과 차이점은 웹소켓은 최초 접속이 일반 http요청을 이용한

handshaking으로 이루어진다. 또한 TCP Socket에서는 바이트 스트림을 사용하지만

웹소켓을 통해  전달되는 텍스트는 UTF-8형식을 가진다.

 

웹소켓길술은 real-time web application(서버 또는 클라이언트 쪽 데이터가 실시간으로 업데이트 되는 웹 어플리케이션)에서 많이 사용한다.

 

웹소켓 작동원리

 

서버와 클라이언트간 웹소켓 연결(connect)은 http프로토콜을 통해 이루어진다

HANDSHAKE과정이 성공적으로 끝나면 HTTP를 웹소켓프로토콜로 바꾸는 Protocol switching과정이 진행된다.

그러면 웹소켓을 위한 위한 새로운 소켓이 만들어지고 이소켓을 이용해 통신을한다!(ws나 wss)

데이터의 구조는 텍스트와 바이너리 모두 양방향 통신이 가능하며 텍스트의 경우 시작 바이트가 0x00, 끝 바이트가 0xFF로 끝나며 UTF-8데이터를 포함.

 

웹소켓 주소는 ws나 wss로 시작하는데 ws는 일반 웹소켓이고 wss는 SSL이적용된 웹소켓이다(Https)

 

이슈

  • stateful한 만큼 서버와 클라이언트 연결을 계속 유지해야하고, 비정상적 연결이 끊어졌을때를 대응해야함.
  • 서버와 클라이언트간의 socket 연결을 하는 것 자체가 비용이 많이 든다(트래픽이 많은 서버 같은 경우 CPU부담이 될 수 있다)

 

파이썬 웹소켓 크롤링 예제(비트맥스에서 1분 OHLCV 가져오기)

모듈 설치

pip install websocket-client

 

코드

import websocket
def on_message(ws, message):
    print("메시지: " + message)
def on_error(ws, error):
    print("에러 : " +error)
    ws.on_close(ws)
def on_close(ws):
    print("### closed ###")
    ws.close()
def on_open(ws):
    print("### open ###")
def run(endpoint):
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp(endpoint,
                                on_open = on_open,
                                on_message = on_message,
                                on_error = on_error,
                                on_close = on_close)
    ws.run_forever()
if __name__ == "__main__":
    command = 'subscribe=tradeBin1m:XBTUSD'
    endpoint = 'wss://www.bitmex.com/realtime?'+command   
    run(endpoint)

 

728x90

+ Recent posts