본문으로 건너뛰기
김신건의 로그

[Network] Realtime 전송 비교: Polling / SSE / WebSocket / WebRTC

· 수정 · 📖 약 1분 · 444자/단어 #realtime #network #websocket #sse #polling #webrtc #backend
realtime comparison, long polling, polling, SSE vs WebSocket, WebRTC DataChannel, push notification

정의

실시간 (서버 → 클라이언트) 데이터 전송 의 7가지 패턴 비교.

결정 트리

flowchart TD
    Q1{양방향 필요?}
    Q1 -->|아니오| Q2{영속 연결 OK?}
    Q1 -->|예| Q3{브라우저 / 네이티브?}
    Q2 -->|예| SSE[SSE]
    Q2 -->|아니오| Q4{레거시 호환?}
    Q4 -->|예| LP[Long Polling]
    Q4 -->|아니오| Poll[Polling]
    Q3 -->|브라우저| WS[WebSocket]
    Q3 -->|P2P 미디어| RTC[WebRTC]

7가지 비교

패턴방향영속프로토콜사용
Short PollingC → S짧음HTTP단순 / legacy
Long PollingC → S짧음 (hold)HTTPlegacy fallback
HTTP/2 server pushS → C(폐기)HTTP/2(deprecated)
SSES → C영속HTTP알림, 라이브 피드
WebSocket양방향영속RFC 6455채팅, 게임
WebTransport양방향 (datagrams)영속HTTP/3 + QUIC차세대 (실험적)
WebRTC DataChannel양방향 (P2P)영속DTLS + SCTP게임 P2P, 파일

Polling

sequenceDiagram
    loop 5초마다
        C->>S: GET /new
        S-->>C: 200 [] (변화 없음)
    end
    Note over C,S: 5초 후
    C->>S: GET /new
    S-->>C: 200 [msg1]
  • 가장 단순. 가장 비효율적.
  • 평균 지연 = polling 간격 / 2.
  • 메시지 없어도 매 요청 발생 → 서버 부담.

CAUTION

자주 polling = 서버 부담. 드물게 polling = 지연 큼. 둘 다 안 좋음.

Long Polling

sequenceDiagram
    C->>S: GET /new (대기 30s)
    Note over S: 이벤트 없음, hold
    Note over S: 메시지 도착!
    S-->>C: 200 [msg1]
    C->>S: GET /new (즉시 다음 요청)
    Note over S: timeout 30s
    S-->>C: 200 [] (timeout)
    C->>S: GET /new (재시도)
  • 적은 빈도, 낮은 지연.
  • legacy 환경 (옛 IE, 일부 프록시) 의 fallback.
  • connection 점유 가 polling 보다 길다 → 서버 connection pool 압박.

SSE (단방향 영속)

자세한 건 SSE 참고.

sequenceDiagram
    C->>S: GET /stream
    S-->>C: 200 (영속)
    S-->>C: data: msg1\n\n
    S-->>C: data: msg2\n\n
    Note over C: 끊김 시 자동 재연결
    S-->>C: data: msg3\n\n
  • 서버 → 클라이언트 일방향 충분하면 제일 단순.
  • 자동 재연결 + Last-Event-ID 재개.
  • 프록시 / 방화벽 친화 (HTTP).

WebSocket (양방향 영속)

자세한 건 WebSocket 참고.

sequenceDiagram
    C->>S: HTTP Upgrade (handshake)
    S-->>C: 101 Switching Protocols
    C-->>S: WS frame
    S-->>C: WS frame
  • 양방향 + 영속. 채팅 / 게임 / 협업 / 트레이딩.
  • HTTP 위에서 시작하지만 별도 프레임 프로토콜.

WebTransport (실험적, 차세대)

HTTP/3 (QUIC) 위 양방향 + unreliable datagram + bidirectional streams. WebSocket + UDP datagram 의 결합.

  • 2026 시점 모던 브라우저 지원 진입.
  • 게임 + 라이브 영상 + AR/VR.
  • 아직 대중적 도입 전.

WebRTC DataChannel (P2P)

  • 클라이언트 클라이언트 직접. 서버는 signaling 만.
  • DTLS + SCTP 위.
  • P2P 게임, 파일 전송, 영상통화 보조.
  • NAT traversal (STUN/TURN) 복잡도.

처리량 vs 지연 vs 복잡도

실시간 패턴: 처리량 vs 지연 (가상 직관)
WebSocket / WebTransport 가 처리량+지연 모두 우수. SSE 는 단방향이지만 그만큼 단순.

관련 위키

이 글의 용어 (6개)
[Django] Channels: WebSocket, Consumer, Groupdjango
정의 Django Channels는 Django에 WebSocket, 비동기 프로토콜, 백그라운드 작업을 추가하는 공식 확장. 기본 Django는 HTTP만, Channels는 …
[Network] HTTP/2: multiplexing, HPACK, server push의 종말network
정의 HTTP/2 (2015, RFC 9113) 는 HTTP/1.1 의 문법은 유지하되 전송을 바이너리 + 멀티플렉싱 으로 바꾼다. Head-of-Line Blocking (HT…
[Network] HTTP/3: QUIC 위의 HTTP, 0-RTT, connection migrationnetwork
정의 HTTP/3 (2022, RFC 9114) 는 HTTP 의 전송 레이어를 TCP → QUIC 으로 교체한 버전. UDP 위에 QUIC, QUIC 위에 HTTP. 핵심 동기:…
[Redis] Pub/Sub vs Streams: 휘발 신호 vs 영속 로그database-internals
정의 - Pub/Sub ( / ): 지금 듣고 있는 구독자 에게만 메시지가 전달되는 휘발성 신호. 영속 없음, ACK 없음. fan-out. - Streams ( / / / ):…
SIMDalgorithm
정의 SIMD (Single Instruction Multiple Data) 는 한 명령어로 여러 데이터 를 병렬 처리하는 CPU 기능. x86 의 SSE / AVX / AVX2…
Sticky Sessionconcurrency
정의 Sticky Session (= Session Affinity)은 로드밸런서가 같은 클라이언트의 요청을 항상 같은 백엔드 서버로 라우팅하도록 하는 동작이다. 서버, 즉 세션…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기