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

HTTP/2.0을 지원하는지 확인하는 방법 4번째로 keycdn.com 사이트를 이용하는 방법이 있다.


https://tools.keycdn.com/http2-test


위 링크로 이동하면 다음과 같은 화면이 나온다.

URL에 원하는 사이트를 입력하고 test버튼을 누르면 해당 URL이 HTTP/2.0을 지원하는지 나온다.

하단 부분에는 최근에 검색한 리스트가 나온다.


HTTP/2.0을 지원하는지 확인하는 방법 3번째로 curl 명령어가 있다. (과거 포스팅자료에서 잠시 등장한적이 있다)


윈도우를 사용하는 경우에는 curl명령어를 다운받아야한다. 이 글은 윈도우 기준으로 작성한다. (다른 OS라고 크게 다르지 않다)

    리눅스, 맥OS는 기본적으로 설치되어있다

    파이썬 아나콘다를 설치한 경우 아나콘다에 curl이 포함되어있어서 별도의 다운로드가 필요 없을수도있다.


RFC7540문서에는 HTTP/2.0을 지원하기 위한 조건에 http://, https:// 두가지 모두 지원한다고 나와있다.

하지만, 우리가 사용하는 대부분의 브라우저에서 http://, HTTP/2.0 의 조합을 지원하지 않는다.

현실적으로 HTTP/2.0을 사용하기 위해선 https://로 통신해야 한다고 생각하면된다.

https://로 통신하기 위해선 인증서가 필요하다. 그러므로 curl 명령어를 위한 인증서도 준비되어 있어야한다.



curl, 인증서는 아래 링크를 통한 사이트에서 받을 수 있다.

http://winampplugins.co.uk/curl/

해당 사이트에서 32bit or 64bit 본인에게 맞는것을 다운로드 하고 압축을 풀면 인증서와 curl이 나온다.

두 파일을 C:\Windows\System32안에 넣어주면 된다.


현재 PC에 curl이 설치되어 있는지 확인하기 위해선

    1. window + r을 눌러서 실행을 킨다

    2. cmd를 입력한다

    3. curl -V 를 입력한다 (V는 대문자이다)


다음과 같이 나오면 curl이 다운로드 된 상태이다.



이 curl의 옵션을 이용해서 우리는 HTTP/2.0 지원 여부를 확인할 수 있다.

(버전이 낮은 경우에는 이 옵션이 없을수 있으니 최신 버전으로 설치할것을 권장한다.)


curl -I --http2 URL -> 이 옵션을 통해서 확인이 가능하다.

    -I (대문자 i)는 header를 보는 옵션이다.

    --http2는 http/2.0으로 통신하기위한 옵션이다. (정확히는 header의 필드값을 추가시켜준다)

    URL부분에 우리가 목표로할 사이트의 주소를 넣어주면 된다.


http://nghttp2.org 사이트를 대상으로 위 옵션을 적용해서 실행해보면


다음과 같이 노란박스 안에 HTTP/2로 나온다.

그런데 위에 HTTP/1.1 101 Switching Protocols가 먼저 응답을 했다.


이번엔 https://nghttp2.org로 테스트를 해보면 (아까와 차이점은 http , https의 차이이다)


역시 해당 사이트는 HTTP/2.0을 지원하므로 1.1이 아닌 2.0버전으로 통신하는게 보인다.


하지만 101 스위칭 프로토콜 부분은 보이지 않는다.

이 부분에 대해선 RFC7540문서에서 다음을 참조하기 바란다.

3.2.  Starting HTTP/2 for "http" URIs

3.3.  Starting HTTP/2 for "https" URIs

+ Recent posts