서버 부하 비용 상승: RTT(Round Trip Time, 패킷이 목적지에 도달하고 나서 다시 출발지로 돌아오기까지 걸리는 시간)가 오래 걸린다.
하나의 Connection 당 하나의 요청을 처리하도록 설계
하나의 IP에 여러 개의 도메인 운영 불가: IP 기반의 호스팅 방식에 의존하며, 도메인 기반 가상(버츄얼) 호스팅을 지원하지 않아 IP 주소가 부족해지는 문제가 발생한다.
▶ HTTP/1.1
🔽 특징
지속적 연결(Persistent Connection): 매번 TCP 연결을 설정하는 것이 아니라, TCP를 연결을 재사용하도록 하는 것이다. keep-alive 헤더를 통해 일정 시간(time out 전까지) 동안 연결 상태를 유지한다.
파이프라이닝(Pipelining): 클라이언트가 앞 요청을 기다리지 않고 순차적으로 요청을 전송하며, 서버는 요청이 들어온 순서대로 응답을 반환한다.
가상 호스팅 가능: Host 헤더를 통해 가상(버츄얼) 호스팅(하나의 IP에 여러 개의 도메인)이 가능하다.
캐시 제어: Cache-Control 헤더를 통해 세밀한 캐시 제어가 가능하다. 반복적인 요청에 대해 성능을 개선할 수 있다.
🔽 문제점
HOL(Head of Line) Blocking: 앞선 요청에 대한 응답이 지연되면 이후 발생한 요청들은 모두 blocking되어 응답이 지연된다.
무거운 헤더: 많은 HTTP 요청들은 헤더 정보가 대부분 동일한데, 이런 헤더를 중복 사용한다. 이러한 불필요한 데이터를 주고받는 데 네트워크 자원이 소비되는 문제가 발생한다.
▶ HTTP/2.0
🔽 특징
멀티플렉싱(Multiplexing)
하나의 Connection에서 여러 요청과 응답을 동시에 처리할 수 있다. 각 응답은 요청 순서에 상관없이 스트림으로 받기 때문에 HOL Blocking 문제도 해결이 가능하다.
헤더 압축(Header Compression)
HPACK이라는 압축 기술을 사용하여 헤더 정보를 효율적으로 압축한다. 이를 통해 데이터 전송량이 줄어들고 성능이 향상된다.
서버 푸시(Server Push)
서버가 클라이언트의 요청 없이도 응답을 보낼 수 있다. 예를 들어, 하나의 HTML 문서에 CSS 및 JavaScript 파일이 있다고 가정하면 기존에는 HTML 문서 요청 후 다시 각 리소스들을 요청했는데 Server Push를 통해 클라이언트 요청을 최소화하고 서버가 미리 리소스를 보내줄 수 있도록 개선했다.
스트림 우선순위(Stream Prioritization)
응답의 우선순위를 설정하여 중요한 리소스부터 먼저 전송할 수 있다.
1. 스트림(Stream): 구성된 Connection 내에서 독립적으로 데이터가 흐를 수 있는 양방향 통로로, 동시에 여러 요청과 응답을 주고받을 수 있다. 2. 메시지(Message): 요청 또는 응답에 해당하는 프레임의 전체 시퀀스이다. 메시지는 여러 개의 프레임으로 구성된다. 3. 프레임(Frame): HTTP/2.0 통신에서의 최소 단위로, 데이터와 메타데이터를 포함하는 단일 통신 블록이다. 각 프레임에는 하나의 프레임 헤더가 포함된다.
▶ HTTP/1.1과 HTTP/2.0의 차이점
HTTP/1.1
HTTP/2.0
요청과 응답 처리 방식
단일 연결, 파이프라이닝
멀티플렉싱, 스트림
헤더 압축
X, 각 요청과 응답에 대해 헤더 정보가 매번 반복 전송
O, HPACK을 사용하여 헤더 정보를 효율적으로 압축
서버 푸시
X, 클라이언트의 요청에 대해 서버는 응답만을 전송
O, 클라이언트의 요청 없이도 서버가 관련 리소스를 클라이언트에게 푸시 가능
속도 및 성능
비교적 느림
비교적 빠름
연결 유지
keep-alive를 통해 연결을 재사용하지만, 연결 수에 제한이 있음
하나의 연결로 여러 응답을 동시에 처리 가능
✅ HOL Blocking에 대해 설명해 주세요.
HOL(Head of Line) Blocking은 네트워크에서 특정 패킷이 처리되기 전에 뒤에 있는 패킷들이 처리되지 못하고 대기해야 하는 현상이다. 이로 인해 전체 처리 속도가 저하되어 전제 데이터 전송의 지연(latency)이 증가하게 된다.
🔽 HTTP/1.1과 HTTP/2.0에서의 HOL Blocking
하나의 연결에서 한 번에 하나의 요청만 처리할 수 있는 HTTP/1.1에서 HOL Blocking 문제가 특히 두드러진다.
HTTP/2.0은 HOL Blocking 문제를 해결하기 위해 다음과 같은 기술을 도입했다.
스트림: 하나의 연결에서 여러 개의 스트림을 동시에 처리할 수 있다. 이는 요청과 응답이 독립적으로 처리되도록 하여 하나의 스트림에서 발생한 HOL Blocking이 다른 스트림에 영향을 미치지 않도록 한다.
프레임: 데이터 전송을 프레임 단위로 나누어 처리한다. 각 프레임은 스트림 내에서 독립적으로 전송되며, 스트림 간의 병목 현상을 줄여준다.
✅ HTTP/3.0의 주요 특징에 대해 설명해 주세요.
가장 큰 특징은 TCP가 아닌 UDP, 정확히 말하면 QUIC(Quick UDP Internet Connections)을 사용한다는 것이다. TCP는 신뢰성을 확보하지만 지연을 줄이기 힘든 구조인데, 반면에 QUIC는 TCP Handshake 과정을 최적화하는 것에 초점을 맞춰 설계되었다.
HTTP/3.0는 TCP 대신 QUIC(Quick UDP Internet Connections) 프로토콜을 기반으로 한다. QUIC는 UDP 위에서 작동하며, UDP의 장점을 활용하면서, TCP와 UDP의 문제점들을 해결하기 위해 설계되었다.
신뢰성
데이터 확인: QUIC은 각 데이터 패킷이 제대로 수신되었는지 확인하기 위해 ACK 패킷을 사용한다.
재전송: 송신 측은 특정 시간 동안 ACK을 받지 못하면 패킷이 손실된 것으로 간주하고 해당 패킷을 재전송한다.
순서 제어: 헤더에 별도의 패킷 번호 공간을 부여해 순서를 보장한다.
멀티플렉싱(Multiplexing)
HTTP/2.0의 강점인 멀티플렉싱을 QUIC에서도 지원한다. 하나의 연결 내 여러 개의 스트림을 독립적으로 전송할 수 있어, 한 스트림의 손실이나 지연이 다른 스트림에 영향을 주지 않는다.
연결 지향
TCP는 클라이언트 IP가 바뀌면 연결을 끊어버리는데, 다시 연결을 생성하려면 3-way Handshake를 다시 해야 하고, latency가 발생된다.
QUIC는 Connection ID를 사용해 연결 지향적인 기능을 구현한다. 이는 클라이언트 IP와 무관하기 때문에 네트워크 경로가 변경되더라도 연결을 계속 유지할 수 있다.
헤더 압축
HPACK을 사용하는 HTTP/2.0와 달리, HTTP/3.0는 QPACK이라는 새로운 헤더 압축 방식이 적용된다.
연결 지연(latency) 감소
QUIC는 0-RTT(Zero Round Trip Time) 연결 설정을 지원하여, 연결 설정 시간을 단축시키고 빠른 데이터 전송이 가능하다.
Zero round-trip time (0-RTT): 한 번 HTTP 연결이 이루어지고 나면, 클라이언트는 더 이상 Handshake를 통해 통신 방법을 확인하려 서로를 확인하는 프로세스를 진행하지 않는다. 지속적인 확인이 필요한 TCP가 아닌 QUIC을 통해 빠르게 동작하는 것이 가능해진다.