바이너리 포멧 계층: 애플리케이션 계층 ↔ 전송 계층 사이에 바이너리 포맷 계층이 추가됨
- HTTP/2는 텍스트 형태로 전달되는 HTTP 메시지가 아닌 binary 형태로 인코딩되어 전송
- HTTP/1.0 : 텍스트 & 줄바꿈 형태로 데이터를 전달
- HTTP/2.0 : 0과 1로 이루어진 바이너리 형태로 데이터를 전달
→ 더 작은 메세지가 프레임 단위로 캡슐화 되어 전달
→ 10바이트만 있으면 1024개의 정보를 표현
멀티플렉싱: 단일 TCP 연결을 통해 여러 HTTP 요청과 응답을 병렬로 처리할 수 있는 스트림 전송 방식
- 스트림 내에서 오브젝트들을 프레임 단위로 쪼개어(Framing) 번갈아가며 수행함으로써 HOL 문제를 해결
- 비교
- HTTP/1.x: 병렬 요청을 처리하기 위해 다중 TCP 연결을 사용
→ TCP 연결비용↑- HTTP/2.0: 바이너리 프레임의 스트림 전송 방식을 도입하여 하나의 TCP 연결을 통해 병렬 처리
- 특정 패킷이 손실되었다고 하더라도 해당 스트림에만 영향을 미침
- 작은 단위로 나뉘어 다운로드되어도 각각의 프레임에는 스트림 ID와 해당 청크의 크기가 포함되어 있으므로 응답 데이터를 올바른 순서로 재조립할 수 있다.
서버 푸시: 서버가 클라이언트의 요청 없이 연관된 객체를 함께 클라이언트에게 전송할 수 있는 기능을 제공
- 예를 들어, 요청한 html에 css가 포함되어 있다면:
- HTTP/1.0: 아래 그림과 같이 html, css 각각 요청
- HTTP/2.0: html 요청시에 별도의 요청 없이 css와 같이 클라이언트에게 PUSH
헤더 압축
- 서버: 리소스를 클라이언트에게 전달 할 때, 중복되는 헤더의 내용은 제거하고 전송
- 중복되지 않은 값들은 허프만 인코딩 압축을 사용해 데이터를 전달
→ 허프만 인코딩: 문자열을 문자 단위로 나누어서, 자주 사용되는 문자는 적은 비트 수로 표현하고 적게 사용되는 문자는 더 많은 비트로 표현하여 전체적인 비트 수를 줄이는 압축 기술- 클라이언트: 공통된 헤더를 재조립
우선 순위 지정: 서버에서 우선순위를 정해서 클라이언트에게 리소스를 전달
- 여전히 TCP 연결을 사용하므로, 연결 수립 및 해제를 위한 handshaking 과정에서 Response time이 증가 할 수 있다.
- TCP는 신뢰성 있는 프로토콜로 알려져 있지만, 패킷이 유실되거나 오류가 발생할 경우 재전송 기법을 사용한다.
이로 인해 패킷 지연이 발생할 수 있으며, 이러한 지연은 HOL을 유발할 수 있다.
HTTP/2.0 또한 TCP 연결을 사용하므로, 연결 수립 및 해제를 위한 handshaking 과정에서 Response time이 증가 할 수 있다.
→ 이를 해결하기 위해 HTTP/3.0 등장
HTTP 3.0에서는 UDP 위에서 동작하는 QUIC 프로토콜을 사용한다.
- 흐름제어 및 혼잡제어: UDP는 흐름제어와 혼잡제어를 지원하지 않아 데이터 전송에 제한이 없으며 이로 인해 네트워크 혼잡 상황에서 데이터 손실이 발생할 수 있다.
QUIC는 흐름제어 및 혼잡제어 기능을 통해 데이터의 안정적인 전송을 보장하며 네트워크 혼잡을 최소화한다.
- FEC(Foward Error Correction) 사용: 수신측에서 에러 정정 및 검출을하는 순방향 오류 수정 메커니즘을 사용
- 보안 및 제어 개선: QUIC은 보안 측면에서도 개선되어 있으며, TLS(Transport Layer Security) 프로토콜과 함께 사용된다.
- Zero Round-Trip Time (0-RTT): 첫 연결 설정에서 1-RTT만 소요되고, 이를 재사용하여 연결을 빠르게 설정할 수 있다.