(Network) HTTP/1.1 VS HTTP/2
HTTP/1.1
HTTP/1.1 이란?
1996년 이후 가장 많이 사용하던 통신 프로토콜
- 연결 당 하나의 요청과 응답으로 처리하기 때문에 동시 전송 시 다수의 요청을 처리하는데 속도와 성능 이슈가 존재한다.
- 요청과 응답이 순차적으로 처리한다.
- HTTP 본문에 포함된 다수의 리소스를 처리할 요청을 처리하기 위해선
Latency가 길어지게 된다.
Head Of Line Blocking - 특정 응답의 지연
HTTP/1.1는 하나의 연결당 하나의 요청을 처리하기 때문에 위와 같은 여러 단점들이 존재한다.
이러한 단점을 개선하기 위한 방법이 PIPELINING이다.
PIPELINING 이란 하나의 연결에서 다수의 응답/요청을 할 수 있는 기법이다.
하지만 이 또한 문제점이 존재한다.
예를 들어 하나의 연결에 세 개의 이미지를 요청을 한다고 가정하면 (Image A, Image B, Image C)
해당 과정은 순차적으로 이루어지며
Image A에서 전송 지연이 발생한다면 Image B, Image C는 Image A의 요청이 끝날 때까지 기다려야 한다.
이와 같은 전송 지연을 HTTP의 Head of Line Blocking이라 한다.
RTT (Round Trip Time) 증가
하나의 연결당 하나의 요청을 처리하기 때문에 매 요청마다 connection을 만드는 것이 불가피하고
이로 인해서 TCP의 3-way handshake가 반복적으로 일어나게 된다.
https://sleepyeyes.tistory.com/4
이로 인해서 불필요한 RTT가 반복적으로 일어나며 성능을 저하시키는 원인이 된다.
HTTP/2
"HTTP/2 is a replacement for how HTTP is expressed “on the wire.” It is
not
a ground-up rewrite of the protocol; HTTP methods, status codes and semantics are the same, and it should be possible to use the same APIs as HTTP/1.x (possibly with some small additions) to represent the protocol. The focus of the protocol is on performance; specifically, end-user perceived latency, network and server resource usage. One major goal is to allow the use of a single connection from browsers to a Web site."
- HTTP/2 프로토콜은 클라이언트와 서버 간의 연결에서 HTTP가 어떻게 표현하는지로 대체되었다.
- 프로토콜의 초점은 오직 퍼포먼스에 있다.
- 커넥션을 한번 맺으면 최대한 길게 사용하길 권고
Multiplexed Streams
한 커넥션으로 동시에 여러 개의 메시지를 주고받을 수 있다.
이전에 언급하였던 HTTP/1.1의 PIPELINING의 개선이라고 볼 수 있다.
Stream Prioritization
클라이언트가 요청한 요청 본문에 CSS File , Image B, Image C 가 있다고 가정하자
CSS File의 전송이 늦어지는 경우 HTTP/2는 리소스 간의 우선순위를 판단하여 우선순위가 높은 것을 먼저 처리하여 지연을 줄인다.
Server Push
서버에서 클라이언트에서 요청하지 않은 리소스를 전송할 수 있다.
예를 들어서 클라이언트에서 css, image.. 등 여러 리소스가 포함되어있는 HTML를 전송한다면
HTTP/1.1에서는 요청한 HTML 문서를 수신 후 해당 문서를 해석한 다음 필요한 리소스를 재 요청한다.
반면 HTTP/2에서는 Server Push 기법으로 클라이언트가 요청하지 않았지만 필요한 리소스를 클라이언트에 요청하지 않고 PUSH 한다.
이는 클라이언트의 요청을 간소화시켜주기 때문에서 성능 향상을 이끌어 낸다.
이를 PUSH_PROMISE라고 하며 서버가 전송한 리소스에 대해서 클라이언트는 재전송하지 않는다.
Header Compression
HTTP/2는 header 정보를 간소화하기 위해서 Header Table과 Huffmas Encoding 기법을 사용하여 중복된 Header정보를 간소화한다.
예를 들어서 아래와 같이 두 개의 요청이 존재한다고 가정해보자
두 개의 요청이 중복되는 내용이 있다는 것을 볼 수 있다.
중복되는 내용이 있음에도 불구하고
HTTP/1.1은 중복되는 내용을 그대로 전송한다.
반면 HTTP/2는 Static/Dynamic Header Table 기법을 사용하여 중복 Header를 검출하고
중복되지 않는 Header 정보는 Huffman Encoding기법으로
인코딩하여 처리한다.
HTTP/1.1과 HTTP/2의 성능 비교
성능 비교 측면에서는 여러 가지 외부 요인들로 정확한 측정이 힘들지만
일반적인 경우 HTTP/2만 사용하더라도 HTTP/1.1에 비해 15~50%의 속도가 향상된다고 한다.
왼쪽 이미지는 동일한 용량 및 개수의 이미지를 로딩시켜
HTTP/1.1과 HTTP/2의 속도를 비교한 결과이다.
효율성 차이가 90% 이상이 나는 것을 볼 수 있다.
References
https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-http2/