개발/기술

HTTP 2.0 주요사항

kwony 2023. 3. 1. 19:36

Multiplexed Streams

 

HTTP1 .0 에서는 요청을 보내기 위해선 반드시 이전 요청이 완료돼야했기 때문에 속도면에서 딜레이가 있었다. 그래서 HTTP 1.1에서는 하나의 TCP 안에 두개 이상의 HTTP 요청을 담아 속도를 높일 수 있는 Pipelining을 기술을 도입했다. 동시에 여러개의 요청을 보낼 수 있기 때문에 속도면에서 HTTP 1.0 에서 발생한 딜레이를 줄일 수 있다.

 

 

그러나 순서가 보장돼야하는 한계가 있었다. 서버는 TCP에서 요청을 받은 순서대로 응답해야하기 때문이다. 그래서 앞선 요청에 의해 뒤에 있는 요청이 딜레이 되는 문제가 발생한다. 이미지 세장을 받는 경우 가장 앞선 이미지 응답이 지연되면 두, 세번째 이미지도 지연이 발생하게 된다. 이 문제를 Head Of Line Blocking이라고 한다.

 

 

HTTP 2.0 에선 요청의 순서와 상관 없이 데이터를 스트림으로 받을 수 있는 Multiplxed Streams 방식을 도입했다. HTTP 메시지를 독립적인 여러 프레임으로 구분하고 받을 때 다시 재조립 하는 방식이다. 사진을 보면 서버는 stream 1, 3 을 교차해서(interleave) 연속으로 보내고 있다. 한번에 하나를 모두 보내는 것이 아니라 여러 스트림을 쪼개서 보내는 것이다.

 

위와 같은 스트림 방식 때문에 클라이언트 입장에선 서버로부터 첫번째 이미지가 도착하지 않더라도 두번째, 세번째 이미지의 프레임이 모두 도착했다면 재조립해서 화면에 노출 할 수 있다.

 

Stream Prioritization

 

Multiplexed 방식에서 서버와 클라이언트는 HTTP 메시지를 여러개의 프레임으로 쪼게고 섞인 연속(stream)으로 데이터를 주고 받는다. stream의 앞부분부터 데이터를 먼저 받기 때문에 stream 내부에 잘게 쪼개진 프레임의 순서 또한 성능에 중요한 요소다. 예로 HTML 문서에 용량이 큰 이미지와 CSS 파일이 있는데 이미지 파일이 앞쪽 스트림을 모두 차지하고 CSS가 뒤쪽 스트림을 차지하게 된다면 클라이언트는 용량이 큰 이미지를 모두 받고 나서 CSS 파일을 받게돼 일시적으로 화면이 깨지는 문제를 겪게 될 것이다. 

 

HTTP2 에서는 스트림에 우선순위를 부여해 보내는 순서를 지정하도록 만들었다. 클라이언트가 우선순위 트리(Prioritization Tree)를 만들어 응답의 전달 방식을 전달하면 서버에서는 그 정보를 활용해서 데이터를 보낸다.

 

 

Header Compression

 

요청을 여러개 보내는 경우 똑같은 헤더를 보내지 않고 변경이 생긴 부분만 수정해서 보내도록 함으로써 중복을 줄이고 HPACK 압축 방식을 적용해 헤드 크기를 경량화했다. 크기가 줄어든 만큼 전달할 데이터도 줄어들기 때문에 속도가 최적화됐다.

 

 

 

 

Introduction to HTTP/2

HTTP/2 (or h2) is a binary protocol that brings push, multiplexing streams and frame control to the web.

web.dev