이 글은 보초님 깃허브 레포를 참고해서 공부한 글입니다
HTTP/1.1 의 문제점을 개선하기 위해 2010년 초중반, 구글에서 SPDY 프로토콜을 기반으로 HTTP2.0 이 등장했다.
HTTP/2 에 대해 설명하기 전에 알아야 할 단어들이 몇 가지가 있다.
- 스트림
구성된 연결 내에서 전달되는 바이트의 양뱡향 흐름이며, 하나 이상의 메시지가 전달 가능하다.- 메시지
요청/응답에 해당하는 프레임의 전체 시퀀스- 프레임
HTTP/2 통신에서의 최소 단위이며, 각 프레임에는 하나의 프레임 헤더가 포함된다.
스트림은 하나 이상의 메시지를 전송하고, 메시지는 한 개 또는 여러 개의 프레임으로 구성될 수 있고, 각 프레임은 프레임 헤더를 가지고 있으며, 프레임 헤더를 이용하여 어느 스트림에 속하는 지를 알아낸다.
기존 HTTP 는 바디 가 문자열로 이루어져있지만 HTTP/2 부터는
binary framing layer
라는 공간에 이진 데이터로 전송된다.
HTTP Request Method, 헤더 등은 여전히 문자열로 전송되지만 바디 부분이 변경되는 것이 가장 큰 변경점 중 하나다.
HTTP/2.0은 헤더와 바디 프레임으로 나뉘어 들어가는 것을 볼 수 있다.
1.0 에서 1.1 으로 넘어오며 pipelining 기술을 도입하였지만, 여전히
HOL(Head-of-line) Blocking
문제가 있다.
HOL Blocking
은 패킷이 순서대로 도착해야 하므로, 패킷이 도착할 때까지, 그 이후의 패킷은 전송되지 못하는 것을 의미한다.
위의 스트림의 개념을 사용하자면, 1.1 버전에서는 1개의 TCP 연결 당 1개의 스트림만 이용 가능하다. 따라서 하나의 메시지가 응답될 때까지 다른 메시지를 요청하지 못한다. 그래서 여러 TCP 연결을 수립하여 여러 요청을 수행한다. 하지만 2.0 을 이용하면 스트림을 이용하여 다음과 같은 장점이 있다.
3-way-handshake
오버헤드가 없다.1개의 TCP 에 여러 개의 스트림을 사용할 수 있게 되었으므로 각각의 스트림에 우선순위를 둘 수 있게 되었다. 이것을 이용하여 전송 순서를 임의로 고정시킬 수는 없으나, 중요한 데이터를 먼저 보낼 수 있도록 설정하는 것이 가능하다.
1.0 에서는 헤더가 문자열로 전송된다. 적게는 500~800바이트 크게는 수 KB를 소모한다. 이러한 성능 이슈를 해결하기 위하여 2.0 에서는 HPACK 압축을 이용하여 헤더를 압축하여 보낸다.
클라이언트에게 필요한 데이터가 있을 때, 직접 요청하기 전에 서버가 미리 데이터를 전송하여 받아볼 수 있게 한다.
이를 통해 여러 TCP 연결을 1개로 합치고, HOL 문제도 해결했다.
하지만 TCP 프로토콜 자체의 한계 때문에 더 이상 성능 개선에도 한계가 오게 된다.
예를 들어 HTTP/2.0 에서 HOL Blocking 문제를 상당 부분 해결하였지만, TCP 프로토콜 자체에의 HOL Blocking 문제가 존재한다.
그러면 TCP 를 쓰지 않는다면 무엇을 쓸까? 같은 전송 계층에 있는 UDP 를 쓰게 될 것이다.
HTTP/3.0 프로토콜의 가장 큰 특징은 TCP 가 아닌 UDP 를 사용한다는 것이다.
그전에 TCP, UDP 의 차이점을 간단하게 알아보자
TCP | UDP | |
---|---|---|
전송속도(상대적) | 느림 | 빠름 |
혼잡제어 | O | X |
헤더크기 | 20바이트 | 8바이트 |
정확히 말하면 HTTP/3.0 은 QUIC 이라는 프로토콜 위에서 돌아가는 HTTP 이다.
Quick UDP Internet Connection 의 약자로 UDP 를 사용하는 프로토콜이다.
TCP 는 3-way-handshake, 끝날 때 4-way-handshake 등 오버헤드와 HOL Blocking 등의 문제를 가진다.
QUIC 은 TCP handshake 과정을 최적화하는 것에 집중하여 설계되었다.
HTTPS over TCP + TLS 에서의 소요되는 레이턴시 : 1 RTT(TCP) + 2 RTT(TLS) = 3 RTT 이다.
HTTPS over QUIC 에서의 소요되는 레이턴시 : 1 RTT
멀티플렉싱을 지원하며, 이론 인하여 HOL Blocking 이 없다.
매 요청마다 클라이언트 - 서버의 IP 가 필요한 것이 아니고, QUIC 는 Unique connection ID 를 사용해서 모든 패킷이 잘 구별될 수 있도록 한다. 예를 들어 휴대폰으로 인터넷을 할 때, 중간에 와이파이에서 LTE 로 변경해도 스트림이 계속 유지가 된다. (TCP 의 경우에는 처음부터 다시 데이터를 받아와야 한다.)