본문 바로가기

카테고리 없음

socket.io

728x90

 

 

1. Socket.IO 구조 개요

Socket.IO는 두 개의 계층으로 구성됩니다:

  • Engine.IO: 저수준의 연결을 담당 (전송 방식, 연결 수립 및 해제 감지 등)
  • Socket.IO: 고수준의 API를 제공 (방(Room), 네임스페이스, 자동 재연결 등)

이러한 구조는 신뢰성과 유연성을 확보하는 데 필수적입니다.

 

구분 의미 예시

저수준 (Low-level) 하드웨어나 네트워크와 더 가까운 기술, 세부 제어와 복잡도가 있음 TCP 연결, WebSocket 프레임 처리, HTTP 전송 방식 관리
고수준 (High-level) 사용자가 쉽게 접근하고 사용할 수 있도록 추상화된 API나 기능 socket.emit("msg"), 자동 재연결, Room, Namespace 기능



2. 전송 방식(Transports)

Socket.IO는 두 가지 전송 방식을 지원하며, 기본적으로 HTTP long-polling으로 연결을 시작하고 가능하다면 WebSocket으로 업그레이드합니다.

🔹 HTTP Long-Polling

  • 초기 연결 시 사용됨
  • long GET: 서버로부터 데이터를 받음
  • short POST: 클라이언트에서 서버로 데이터를 보냄
  • 일반적인 HTTP 기반으로 프록시나 방화벽 우회가 용이

🔹 WebSocket

  • 완전한 양방향 통신, 낮은 지연시간
  • 연결이 성공하면 polling을 종료하고 WebSocket으로 전환 (Upgrade)

왜 polling부터 시작하나?

WebSocket이 막힐 가능성 (회사 프록시, 방화벽, 바이러스 백신 등) 때문에 사용자 경험 보호 목적

 

 

3. 핸드쉐이크(Handshake)

처음 연결 시, 서버는 다음 정보를 포함한 JSON을 반환:

json
 
{ "sid": "세션 ID", "upgrades": ["websocket"], "pingInterval": 25000, "pingTimeout": 20000 }
{ 
  "sid": "세션 ID", 
  "upgrades": ["websocket"], 
  "pingInterval": 25000, 
  "pingTimeout": 20000 
 }
  • sid: 클라이언트의 세션 식별자
  • upgrades: 사용할 수 있는 고급 전송 방식 목록 (예: WebSocket)
  • pingInterval / pingTimeout: 연결 유지 확인용 하트비트 설정

이 값은 양쪽 모두가 연결 유지를 위해 사용하는 기준값입니다.

즉,

  • 서버는 이 값을 기준으로 주기적으로 ping을 보내고,
  • 클라이언트는 이 값을 수신하여 pong 타이밍을 조절하거나
  • 반대로 클라이언트가 서버 응답이 없을 때 timeout을 감지하는 데도 사용합니다.

4. 업그레이드 메커니즘

  1. polling으로 연결 시작
  2. buffer가 비어있는지 확인
  3. WebSocket 연결 시도
  4. 성공 시 기존 polling 연결 종료

 

사용자 관점: 실패한 WebSocket 연결 시에도 빠르게 polling으로 대체 → UX 저하 최소화


5. 연결 종료(Disconnection) 감지

  • HTTP 요청 실패
  • WebSocket 종료
  • socket.disconnect() 호출
  • Heartbeat 실패 (PING → PONG 응답 없음)

하트비트는 pingInterval, pingTimeout 설정을 기반으로 작동


6. Socket.IO 상위 기능

Engine.IO 위에 구성된 Socket.IO는 다음과 같은 기능을 제공합니다:

기능설명
자동 재연결 연결 실패 시 자동으로 재연결 시도
버퍼링 연결 복구 중 패킷 저장
Ack socket.emit 후 응답 기다리기 (callback 사용)
브로드캐스트 같은 방(Room) 또는 네임스페이스 내 사용자에게 메시지 전송
네임스페이스 /chat, /game 같은 URI를 통해 논리적 채널 분리
 

🎯 이 내용을 통해 배워야 할 실전적 관점

항목중요 이유
WebSocket과 polling의 차이 및 용도 다양한 네트워크 환경 대응
하트비트 메커니즘 실시간 서비스에서 중요한 연결 안정성 확보
업그레이드 과정 성능과 UX의 균형 설계
Socket.IO 기능의 활용 대규모 채팅 앱, 게임, 실시간 알림 시스템 구현에 핵심