HTTP/2.0의 기본 목표는 요청과 응답 멀티플렉싱을 통하여 레이턴시를 줄이고,

HTTP header필드를 압축하여 프로토콜 오버헤드를 최소화하며,

요청 우선순위서버푸시기능을 지원하는것이다.



HTTP/2.0에는 frame이라는게 존재한다.

frame이란 http/2.0 통신에서 사용되는 가장작은 단위를 말하며,

frame 2개가 합처지면 stream이다. 예를들면 header frame, data frame 이 두개를 하나의 stream으로 부를 수 있다.

( HTTP/1.1에서  head of line blocking문제를 HTTP/2.0에서는 frame, stream으로 해결했다)


사진을보면 클라이언트가 서버에게 HEADERS frame을 보낸다. (해당 요청은 GET요청이라서 HEADERS frame만 존재한다)

그리고 괄호안에 stream1이라고 나와있는데 이것은 스트림id값을 나타낸 부분이다.

클라이언트가 만든 스트림에 대한 id값은 1,3,5...로 홀수이고

서버가 만든 스트림은 2,4,6...으로 짝수가 된다.


위 경우는 클라이언트가 스트림id 1번에 대한 응답이기 때문에 서버는 스트림id 1번으로 HEADERS frame + DATA frame = 하나의 스트림으로 응답을 했다. header에는 HTTP 상태코드, 버전, 서버 등의 정보가 있고 data프레임에는 아마 우리가 ctrl+u를 누르면 보이는 소스가 있을것이다.


그리고 HEADERS frame에서 보면 'user-agent:' 으로 표시가 된 부분이 있고 ':path:'처럼 ':' 이 표시가 앞뒤로 있는게 있는데

user-agent는 HTTP/1.1, HTTP/2.0에서 쓰는 필드이고 ':'이 표시가 앞뒤로 있는것은 HTTP/2.0에서만 쓰는 필드이다.


다음은 naver로 GET 요청을 캡처한 화면이다.


HTTP/1.1에서 메타데이터는 단순한 text이고 크기는 500~800바이트정도이다. (만약 쿠키가 포함된 경우 킬로바이트까지 올라간다)

지금처럼 naver를 요청한 상태에서 또 다른 요청을 하게되면 아마 헤더는 크게 변함이 없을것이다.

중복된 필드가 존재할것이고 (대표적으로 User-agent) HTTP/1.1에서는 이런 중복된 데이터를 다시 보낸다.

하지만 HTTP/2.0에서는 중복전송하지 않는 방식으로 header를 압축한다.


다음은 HTTP/2.0에서 요청화면이다.

첫번째 요청에서는 6개의 필드를 보냈고, 두번째 요청에서는 중복되는 5개는 제외하고 1개의 필드만을 전송했다.

이렇게 HTTP/2.0은 중복헤더 데이터를 전송하지 않으므로 매 요청마다 오버헤드를 크게 줄일 수 있다.

같은 요청을 폴링하는 경우는 헤더가 변한게 없으므로 헤더 오버헤드는 0바이트이다.


이렇게 헤더 중복을 제거하고, 과거 포스팅한 Huffman coding방식으로 또 한번 압축을 진행한다.

이런 방식으로 HTTP/2.0에서는 header필드를 압축하여 프로토콜 오버헤드를 줄일 수 있다.


헤더 압축에 대해서 자세한 사항은 RFC7541 문서를 참고하기 바란다.



'HTTP2.0' 카테고리의 다른 글

#2 HTTP/1.1 vs HTTP/2.0  (0) 2016.10.20
#1 HTTP/1.1 vs HTTP/2.0  (1) 2016.10.19
#4 http2 지원여부 확인 (keycdn)  (0) 2016.10.16
#3 http2 지원여부 확인 (curl)  (0) 2016.10.15
#2 http2 지원여부 확인 (개발자 도구)  (0) 2016.10.09

+ Recent posts