CS - WebSocket

이한솔·2024년 6월 20일
0

Computer Science 💻

목록 보기
2/2

WebSocket

웹소켓은 HTML5 이후에 등장한 기술로 http에서 실시간 통신을 할 수 없다는 문제를 해결하기 위해 웹 브라우저와 서버 간의 양방향 통신을 가능하게 하는 프로토콜이다. 지속적인 연결을 유지하면서 실시간 데이터를 주고 받을 수 있어서 주로 실시간 웹 애플리케이션(채팅, 게임), 실시간 데이터 스트리밍(주식 거래, 스포츠 중계) 등에 사용된다.

💡 HTML5 이전에 구현된 서비스는 어떻게 해야할까?
HTML5 이전의 기술로 구현된 서비스에서 웹 소켓처럼 사용할 수 있도록 도와주는 기술인 Socket.io, SockJS를 사용해서 실시간 통신이 가능하게 구현할 수 있다.



Socket과 WebSocket의 공통점과 차이점

공통점

소켓과 웹소켓 모두 클라이언트와 서버 간에 양방향 통신을 가능하기 때문에 실시간 데이터 전송을 지원하여 실시간 애플리케이션 개발에 적합하다.

차이점

  1. 프로토콜
    소켓은 TCP/IP 프로토콜을 기반으로 한다. 클라이언트와 서버가 직접적으로 연결되어 데이터를 주고받는다.
    웹소켓은 HTTP 프로토콜을 기반으로 하지만, HTTP와는 다른 방식으로 동작한다. 클라이언트와 서버 간에 단일 TCP 연결을 유지하며, HTTP Handshake 후에 웹소켓 프로토콜을 사용하여 데이터를 전송한다.

  2. 용도
    일반적으로 네트워크 통신의 기본 요소로 사용되며, 다양한 네트워크 애플리케이션에서 데이터 전송을 담당한다.
    웹소켓은 웹 기반의 실시간 애플리케이션 개발에 주로 사용된다. 채팅 애플리케이션, 실시간 게임, 주식 시장 데이터 전송 등에 사용된다.

  3. 프로그래밍 인터페이스
    일반적으로 소켓 프로그래밍을 위한 별도의 API가 필요하다. 웹소켓은 브라우저와 서버 간의 API를 사용하여 웹 애플리케이션에서 쉽게 사용할 수 있다.



WebSocket 동작 방식

웹소켓은 HTTP를 통해 초기 핸드셰이크를 수행한 후, 지속적인 연결을 유지하면서 실시간 데이터를 주고받을 수 있다.

  1. 웹소켓 핸드셰이크
    웹소켓 연결은 HTTP 프로토콜을 통해 시작된다. 웹브라우저 등 클라이언트는 서버에 웹소켓 연결을 요청하기 위해 HTTP 요청(WebSocket Handshake)을 보낸다.

  2. 서버 응답
    서버는 클라이언트의 업그레이드 요청을 수락하고, 웹소켓 연결을 설정하는 응답을 보냅니다.

  3. 데이터 프레임 전송
    웹소켓 연결이 설정된 후, 클라이언트와 서버는 데이터를 프레임(Frame) 단위로 주고받는다. 웹소켓 프레임은 텍스트 프레임(UTF-8 인코딩된 문자열), 바이너리 프레임(데이터 그 자체), 제어 프레임(연결 상태를 확인하기 위한 핑 프레임과 퐁 프레임) 등 다양한 유형의 데이터를 포함할 수 있다.

  4. 연결 종료
    웹소켓 연결을 종료하려면 클라이언트 또는 서버가 연결 종료 프레임(Close Frame)을 전송해야 한다. 이 프레임을 수신한 상대방은 종료 절차를 시작하고, 응답으로 또 다른 종료 프레임을 전송한다.



WebSocket 이전의 기술

  1. Polling
    폴링은 클라이언트가 일정한 간격으로 서버에 HTTP 요청을 보내어 새로운 데이터를 요청하는 방법이다. 서버는 클라이언트의 요청에 응답하여 현재 상태나 새로운 데이터를 전달한다.
    클라이언트가 주기적으로 요청을 보내기 때문에 불필요한 트래픽이 발생할 수 있고, 실시간성에 한계가 있다.

  2. Long Polling
    롱 폴링은 폴링의 단점을 개선한 방법으로, 클라이언트가 서버에 HTTP 요청을 보내면, 서버는 새로운 데이터가 있을 때까지 응답을 지연시키다가 새로운 데이터가 생기면 서버는 응답을 보내고, 클라이언트는 즉시 새로운 요청을 보낸다. 불필요한 트래픽을 줄일 수 있고, 실시간 통신에 가까운 효과를 얻을 수 있지만 여전히 HTTP 요청/응답 사이클을 반복해야 하므로, 서버에 부담을 줄 수 있다.

  3. streaming
    클라이언트는 서버에 요청을 보내고 끊기지 않은 연결상태에서 끊임없이 데이터를 수신한다. 하지만 클라이언트에서 서버로의 데이터 송신은 어렵다.

0개의 댓글