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. 업그레이드 메커니즘
- polling으로 연결 시작
- buffer가 비어있는지 확인
- WebSocket 연결 시도
- 성공 시 기존 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 기능의 활용 | 대규모 채팅 앱, 게임, 실시간 알림 시스템 구현에 핵심 |