HTTP 2
HTTP 2는 HTTP 메시지를 바이너리 프레임으로 나누고 하나의 연결에서 여러 요청과 응답을 동시에 처리할 수 있게 한 HTTP 버전입니다.
핵심 특징
- 바이너리 프레이밍: HTTP 메시지를 프레임 단위로 나누어 전송합니다.
- 멀티플렉싱: 하나의 TCP 연결에서 여러 스트림을 동시에 처리합니다.
- 헤더 압축: HPACK으로 반복되는 헤더 전송 비용을 줄입니다.
- 스트림 우선순위: 리소스별 우선순위를 표현할 수 있습니다.
- 서버 푸시: 클라이언트가 요청하지 않은 리소스도 서버가 먼저 전송할 수 있습니다.
멀티플렉싱
HTTP 1.1에서는 응답 순서 때문에 앞선 요청이 느리면 뒤 요청도 기다릴 수 있었습니다. HTTP 2는 요청과 응답을 스트림으로 나누고 프레임 단위로 섞어 전송할 수 있어 애플리케이션 계층의 Head-of-Line Blocking을 줄입니다.
하나의 TCP 연결
├─ Stream 1: HTML
├─ Stream 3: CSS
└─ Stream 5: JS
서버 푸시
클라이언트가 HTML 문서를 요청하면, 서버는 해당 페이지에 필요할 것으로 예상되는 CSS나 JavaScript 파일을 클라이언트가 별도로 요청하지 않아도 함께 전송할 수 있습니다. 이를 통해 왕복 요청을 줄여 초기 페이지 렌더링 속도를 개선할 수 있습니다.
한계
HTTP 2는 TCP 위에서 동작하므로 TCP 패킷 손실이 발생하면 같은 연결의 여러 스트림이 함께 영향을 받을 수 있습니다. 이 문제를 더 줄이기 위해 QUIC 기반의 HTTP 3가 등장했습니다.
핵심 정리
HTTP 2는 바이너리 프레임, 멀티플렉싱, 헤더 압축으로 HTTP 1.1의 성능 한계를 개선했습니다.
다만 TCP 계층의 HOL Blocking은 남아 있어 HTTP 3의 배경이 되었습니다.