HTTP 1.0에서는 한 개의 요청마다 TCP 커넥션을 만듭니다. 이를 비연결성(Connectionless)이라고 합니다. 매번 커넥션을 만들 때마다 TCP 3-way handshake를 거치고 이 때문에 매번 비용이 발생하는 문제가 있습니다.
HTTP 1.1에서는 Keep-Alive 헤더를 사용한 지속 커넥션를 사용해 1.0에 있던 문제를 해결합니다. Keep-Alive의 값만큼 커넥션을 종료하지 않고 재사용합니다.
추가로 파이프라이닝을 사용해 응답 속도를 개선했습니다. 기존에는 A 요청을 보내고 A` 응답이 올 때까지 기다렸다면, 파이프라이닝 사용 이후에는 차례대로 서버에 요청을 보낸 뒤 기다린 뒤 모든 응답을 한 번에 받습니다.
A, B, C 순서로 요청을 보낸다고 가정할 때 A 요청이 오래 걸린다면 B, C 요청을 보내기 위해 계속 기다려야 하는 문제가 발생합니다. 이를 Head-of-Line Blocking(HOL Blocking)이라고 합니다.
HTTP 2.0에서는 Frame 단위로 분할하고 Binary 형태로 바꿔서 보냅니다. 이 때문에 기존 HTTP 버전보다 전송 속도가 올라갔습니다. 멀티플렉싱(Multiplexing) 방법을 사용하여 요청과 응답을 병렬로 처리합니다. 병렬로 처리하면서 HTTP 레벨의 HOL Blocking 문제를 해결했습니다.
추가로 HPACK 헤더 압축을 사용해서 대역폭을 절약하고 Server Push 기능을 사용해 클라이언트 요청 없이도 서버가 미리 데이터를 보내는 기능을 제공합니다.
HTTP 레벨의 HOL Blocking 문제와 별개로 TCP 레벨에서는 HOL Blocking 문제가 존재합니다. A, B, C 순서로 요청을 보낼 때 B 요청이 손실됐다면 C 요청이 완료되더라도 B 요청이 재전송 될 때까지 기다려야 하는 문제가 발생합니다.
TCP 레벨의 HOL Blocking 문제를 해결하기 위해 HTTP 3.0에서는 UDP 기반의 QUIC 프로토콜을 사용합니다.