• network
  • http

HTTP/1.1, HTTP/2, HTTP/3 비교

HTTP/1.1의 HOL 블로킹을 HTTP/2의 멀티플렉싱이 어떻게 개선했는지, QUIC 기반 HTTP/3는 무엇이 다른지 정리한다.

시리즈 · 네트워크11 / 12
  1. OSI 7 Layer와 계층별 역할, ARP
  2. IP 주소: IPv4와 IPv6, NAT, 체크섬
  3. 라우터: 경로 지정, 브로드캐스트 컨트롤, 라우팅과 스위칭
  4. DHCP 동작 방식과 UDP를 사용하는 이유
  5. IP의 한계와 TCP·UDP, 3-Way Handshake
  6. TCP 4-Way Handshake와 TIME_WAIT
  7. DNS 정리: 구조, 질의 방식, 레코드, 이중화와 위임
  8. 로드 밸런서: 구성 방식, 헬스 체크, L4와 L7
  9. HTTP 메서드와 상태 코드: 멱등성, POST와 PUT의 차이
  10. HTTP의 Stateless·Connectionless와 쿠키, 세션
  11. HTTP/1.1, HTTP/2, HTTP/3 비교
  12. 소켓과 포트, 그리고 웹소켓

HTTP/1.0과 HTTP/1.1

HTTP/1.0은 요청마다 TCP 세션을 새로 맺어, 연결 수립을 중복으로 수행하는 것이 문제였다.

HTTP/1.1은 이를 Keep-Alive로 해결했다. 연결을 계속 유지하며 재사용하지만, 하나의 연결에서는 앞선 요청의 응답이 끝나기 전까지 다음 응답을 받을 수 없다.

HOL 블로킹 (Head-Of-Line Blocking)

앞의 요청이나 패킷이 지연되면 뒤따르는 것들도 함께 지연되는 현상이다. HTTP/1.1은 응답을 순서대로 받아야 하므로, 앞선 요청의 처리가 느리면 뒤의 요청이 모두 기다려야 한다.

HTTP/2

Multiplexed Streams

하나의 TCP 세션으로 여러 개의 요청을 받아 스트림으로 동시에 처리한다. 먼저 처리가 끝난 요청부터 응답을 보낼 수 있으므로 HTTP/1.1의 HOL 블로킹 문제를 해결한다.

Stream Prioritization

요청마다 우선순위를 두어 처리한다. 예를 들어 이미지보다 HTML의 우선순위가 높다. HTML이 있어야 화면을 보여 줄 수 있기 때문이다.

HPACK 헤더 압축

헤더를 압축해 속도를 개선한다.

  • 헤더 테이블을 만들어 두고, 같은 헤더를 다시 보낼 때는 값 대신 테이블의 인덱스를 보낸다.
  • 헤더 값은 Huffman coding으로 압축한다.

Huffman Coding

  • 발생 빈도가 높은 문자는 짧은 심볼로, 빈도가 낮은 문자는 긴 심볼로 표현하는 방식이다.
  • (문자, 발생 횟수) 노드를 빈도순으로 정렬한 뒤, 빈도가 낮은 노드부터 묶어 이진 트리를 만들고 트리의 경로를 2진수 코드로 사용한다.

HTTP/3

QUIC 기반 프로토콜

이전 버전과 달리 TCP가 아닌 QUIC 위에서 동작한다. QUIC은 UDP 기반 프로토콜로, TCP에 비해 연결 설정 시간이 짧고 패킷 손실을 더 효과적으로 다룬다.

다중화 (Multiplexing)

HTTP/2와 마찬가지로 하나의 연결로 여러 요청과 응답을 처리한다. 차이는 손실이 발생했을 때다.

  • HTTP/2는 하나의 TCP 연결을 쓰기 때문에, 패킷이 유실되면 그 연결 위의 모든 스트림이 함께 지연된다.
  • HTTP/3는 스트림이 서로 독립적이라, 문제가 생긴 스트림만 영향을 받고 나머지는 그대로 진행된다.

연결 핸들링 (Connectivity)

QUIC은 연결을 IP 주소와 포트가 아니라 Connection ID로 식별한다. 덕분에 네트워크가 바뀌어 IP 주소가 달라져도 연결을 다시 맺지 않고 이어 갈 수 있어, HTTP/2보다 연결을 유연하게 다룬다.

보안 (Encryption)

기본적으로 TLS 1.3을 사용해 암호화와 인증이 강화되었다.

헤더 압축: QPACK

HTTP/2의 HPACK 대신 QPACK이라는 새로운 헤더 압축 방식을 사용한다.

  • 정적 테이블과 동적 테이블로 구성된다. 정적 테이블에는 미리 정의된 헤더가, 동적 테이블에는 통신 중에 등장한 헤더가 저장된다.
  • 헤더 필드 자체를 전송하는 대신 테이블을 참조하는 인덱스 값을 전달해 요청과 응답의 크기를 줄인다.

정리

구분 HTTP/1.1 HTTP/2 HTTP/3
전송 계층 TCP TCP QUIC (UDP)
연결 사용 Keep-Alive로 연결 재사용 하나의 연결에서 멀티플렉싱 하나의 연결에서 멀티플렉싱
HOL 블로킹 응답 순서 때문에 발생 HTTP 수준에서는 해결, TCP 손실 시 발생 스트림 단위로 독립 처리
헤더 압축 없음 HPACK QPACK