13. QUIC와 HTTP/3: UDP 위의 신뢰성·다중 스트림·연결 마이그레이션
난이도 상내 답안
모범답안
모범답안 — QUIC와 HTTP/3: UDP 위의 신뢰성·다중 스트림·연결 마이그레이션
난이도: 상
1. 왜 TCP 가 아니라 UDP 위에 QUIC 인가
- TCP 는 커널에 박혀 있다. 전송 로직을 바꾸려면 OS 커널·미들박스를 모두 업데이트해야 해서 진화가 사실상 멈췄다(ossification). 방화벽/NAT 가 TCP 의 특정 동작만 통과시켜, 새 TCP 옵션은 인터넷에서 자주 막힌다.
- QUIC 은 UDP 위 유저스페이스 프로토콜이다. UDP 는 어디서나 통과하므로 QUIC 은 "UDP 페이로드 안에서" 자체 신뢰성/순서/혼잡제어/암호화를 구현한다. 애플리케이션·라이브러리 업데이트만으로 전송 알고리즘(혼잡제어 등)을 배포할 수 있어 빠른 진화가 가능하다.
- TLS 가 처음부터 통합: QUIC 은 TLS 1.3 을 전송에 녹여, "암호화 없는 QUIC" 자체가 없다. 헤더 일부까지 암호화해 미들박스 간섭과 ossification 을 줄인다.
2. HOL 블로킹: TCP/HTTP2 vs QUIC
- TCP 의 HOL 블로킹: TCP 는 단일 바이트 스트림이라 순서를 보장한다. 한 세그먼트가 유실되면, 그 뒤에 이미 도착한 데이터도 재전송이 도착할 때까지 애플리케이션에 전달되지 못한다.
- HTTP/2 의 한계: HTTP/2 는 한 TCP 연결 안에 여러 논리 스트림을 다중화했지만, 그 아래 TCP 는 여전히 하나의 스트림이다. 한 패킷 유실이 모든 HTTP/2 스트림을 함께 멈춘다(전송 계층 HOL 은 그대로).
- QUIC 의 해결: QUIC 은 스트림을 전송 계층에서 인식하고 스트림별로 독립적으로 순서/재전송을 관리한다. 스트림 A 의 패킷이 유실돼도 스트림 B 는 계속 전달된다. 단, 단일 스트림 내부의 순서 보장은 그대로이므로 그 스트림은 여전히 영향을 받는다.
3. 빠른 핸드셰이크 (1-RTT / 0-RTT)
- TCP+TLS1.3: 보통 TCP 3-way(1 RTT) + TLS(1 RTT) = 연결 시작에 2 RTT.
- QUIC 1-RTT: 전송 핸드셰이크와 TLS 1.3 키 교환을 하나로 합쳐 첫 데이터를 1 RTT 만에 보낼 수 있다.
- 0-RTT: 이전에 접속한 서버라면 캐시한 세션 정보로 핸드셰이크와 동시에 애플리케이션 데이터를 보낸다(연결 비용 0 RTT).
- 0-RTT 의 위험: 0-RTT 데이터는 재전송(replay) 공격에 취약하다. 공격자가 0-RTT 패킷을 가로채 재전송하면 서버가 같은 요청을 두 번 처리할 수 있다. 그래서 0-RTT 에는 멱등(idempotent) 요청만 실어야 하고(예: GET, 상태 변경 없는 조회), 결제·구매 같은 부수효과 요청은 1-RTT 확립 후 보낸다.
4. 연결 ID와 연결 마이그레이션
- TCP 연결 = 4-튜플(출발 IP·포트, 도착 IP·포트). 모바일이 Wi-Fi→LTE 로 바뀌면 클라 IP/포트가 바뀌어 4-튜플이 깨지고 연결이 끊긴다 → 재연결·재 핸드셰이크.
- QUIC 은 연결 ID 로 식별한다. 연결은 IP/포트가 아니라 패킷에 실린 Connection ID 로 묶이므로, 클라의 IP/포트가 바뀌어도 같은 연결 ID 면 서버가 같은 연결로 이어서 처리한다(연결 마이그레이션). 핸드셰이크·암호 상태를 유지한 채 네트워크만 갈아탄다.
- 효과: 모바일 게임에서 망 전환 시 세션 끊김·재로그인 없이 매끄럽게 유지. (경로 검증으로 위장 마이그레이션은 방어.)
5. 게임 백엔드에서의 적용 판단
- QUIC/HTTP3 가 잘 맞는 곳: 로비/매치메이킹/상점·인벤토리 API, 패치/에셋 다운로드, 채팅처럼 신뢰성·순서가 필요한 요청-응답 트래픽. 모바일 망 전환이 잦은 클라이언트. 다중 요청을 한 연결로 보내며 HOL 블로킹을 피하고 싶을 때.
- 그냥 raw UDP 가 더 나은 곳: 최신 상태만 중요한 실시간 입력/스냅샷. 이런 데이터는 "잃은 패킷을 재전송"하는 것보다 다음 스냅샷을 빨리 보내는 게 낫다. QUIC 의 신뢰성/순서 보장은 이 경우 오히려 지연을 만든다(필요 없는 재전송 대기). 그래서 많은 게임은 핵심 실시간 채널은 신뢰성 없는 데이터그램(raw UDP 또는 QUIC 의 unreliable datagram 확장)으로, 메타/로비 트래픽은 QUIC 로 나눈다.
- 장점 요약: 암호화 기본·빠른 핸드셰이크·연결 마이그레이션·스트림별 독립성. 단점: 유저스페이스 처리라 CPU 사용이 TCP 보다 큼(커널 오프로드 부족, 개선 중), 일부 망에서 UDP 자체가 제한·열화될 수 있음.
- 패킷 크기: QUIC 도 결국 UDP 라 PMTU 블랙홀/단편화를 피하려고 초기엔 보수적으로 ~1200바이트 데이터그램을 쓴다(앞 문제의 PMTUD 와 동일한 이유). 큰 데이터는 QUIC 이 스트림으로 알아서 분할·재조립한다.
핵심 한 줄
QUIC 은 "TCP+TLS 를 UDP 위 유저스페이스로 다시 구현"해, 전송 계층 HOL 블로킹 제거·1/0-RTT 핸드셰이크·연결 마이그레이션을 얻었다. 게임에선 메타 트래픽엔 QUIC, 최신성이 전부인 실시간엔 비신뢰 UDP 로 나누는 게 정석.