HTTP/1.1과 HTTP/2 비교하기
HTTP/1.1의 단점
HOL(Head Of Line) Blocking
HTTP/1.1은 기본적으로 커넥션 당 하나의 요청을 처리한다.
이러한 단점을 개선할 수 있는 기법으로 Pipelining이 있다.
Pipelining은 한 번의 커넥션으로 다수의 request와 response를 처리하는 방식이다.
하지만 순차적으로 앞의 response 처리가 완료되기 전까지 대기한 후 response를 보내기 때문에 많은 리소스를 요청하거나 리소스의 용량이 큰 경우 대기 시간이 오래 걸릴 수 있다.
이러한 현상을 HOL(Head Of Line) Blocking 이라고 한다.
RTT(Round Trip Time) 증가
HTTP는 TCP 기반 프로토콜이기 때문에 커넥션이 될 때마다 3-way Handshake가 반복적으로 일어나 성능 저하 및 RTT가 증가한다.
Header 중복 전송
매 요청시 마다 중복된 헤더값을 전송하게 되며 cookie 정보도 매번 헤더에 포함되므로 헤더의 용량이 커진다.
HTTP/2의 장점
Multiplexing
HTTP/2는 한 커넥션으로 멀티플렉싱 stream을 주고 받아 동시에 여러개의 메세지를 전송할 수 있다.
또한 독립적으로 처리되기 때문에 HOL Blocking이 발생하지 않는다.
stream : 전달되는 바이트의 양방향 흐름이며, 여러개의 메시지가 전달될 수 있다.
Binary Protocol
HTTP 메시지를 binary 형태의 프레임으로 나누고 이를 클라이언트 측에서 다시 조립한다.
텍스트가 아닌 binary로 구성하므로 파싱이 더 빠르다.
Stream Prioritization
서버에서 리소스 간의 우선순위를 지정하여 응답함으로써 사이트 렌더링을 최적화할 수 있다.
우선순위에 대한 내용은 이 글 참고
Server Push
Server push 기법으로 클라이언트가 요청하지 않아도 문서에 포함된 리소스를 미리 푸시한다.
예를 들어 클라이언트가 page.html
을 요청했을 때, 서버는 index.js, index.css
를 요청할 것이라 예측하고 Push한다.
서버가 전송한 리소스에 대해 클라이언트는 재요청을 할 필요가 없으므로 request를 최소화할 수 있다.
Header Compression
HTTP/2는 Header Table과 Huffman Encoding 기법을 사용하여 중복 요청되는 헤더를 검출한다.
중복된 헤더는 index 값만 전송하고 중복되지 않은 헤더 값은 Huffman Encoding 기법(HPACK)으로 압축하여 전송한다.