엄범

 

많은 곳에서 이미 사용중이다. (google은 http/2+quic/46 를 사용한다.)

 

HTTP/1.1 과의 주요한 차이점은, HTTP body 부분이 1.1에서는 text로 전송되었던 것과 달리 2.0에서는 binary로 전송된다는 점이다.

기존에는 http header와 body가 \r\n으로 구분되었으나... HTTP/2.0에서 부터는 header와 body가 layer로 구분된다.

(이를 binary framing layer라고 부르고 있다.)

 

동시에 이전에는 header-body를 묶은 http message가 전송 최소 단위였다면, 2.0에서는 전송 최소 단위가 binary frame이 된다. 우측 그림의 프레임 하나 하나가 전송 최소 단위가 될 수 있다.

왜 binary로 해야 하는가? 기존 HTTP/1.x는 다음과 같은 단점을 가지고 있다.

  • 본문은 압축이 되지만 헤더는 압축이 되지 않는다.
  • 연속된 메시지들은 비슷한 헤더 구조를 가지고 있는 경우가 많은데, 그럼에도 불구하고 메시지마다 매번 전송되어야 한다.
  • 다중전송(multiplexing)이 불가능하다. 다중 전송이라는건, 하나의 connection에 여러 요청/응답을 병렬적으로 실어 보내는 것을 의미한다. 이게 불가능하니 connection을 여러 개 열어야 한다.
    • 여기서 병렬적이란 요청을 보내고 응답을 기다리지 않고 또 다른 요청을 보내는 수준의 병렬성을 말한다. multiplexing의 의미 그 자체다.
물론 HTTP/1.x에서도 Keep-Alive를 사용하면 socket connection을 유지하기 때문에 TCP 연결을 재사용할 수는 있지만, [요청-응답]으로 이루어진 한 HTTP 연결이 끝난 다음에 다음 HTTP 연결이 가능한 식이다. 따라서 HTTP layer에서는 [요청-응답] [요청-응답]을 반복해야만 한다. [요청-요청-요청 && 응답-응답-응답]이 병렬적으로 실행되는 것은 불가능하다. 
병렬적으로 실행하려면 connection을 여러 개 열어야 한다. multiplexing은 불가능하다.

즉, 한마디로 정리하면 HTTP/1.x는 multi-connection 기반, HTTP/2는 multiplexing 기반이라고 할 수 있을 것 같다.
*** HTTP/1.0에서는 default가 close이기 때문에 켜고 싶을 때 Keep-Alive를 지정해야 하고, HTTP/1.1에서는 default가 Keep-Alive이기 때문에 끄고 싶을 때 close를 주면 된다.

 

HTTP/2 의 multiplexing

2.0에서는 하나의 connection을 여러 stream이 이용할 수 있어 다중 전송이 가능하다. (한 칸의 단위는 binary frame이다.)

*** 새로운 TCP connection을 여는 것을 cold request, 기존의 connection을 재사용 하는 것을 warm request라고 부르며 대체로 후자가 더 효율적이다. connection을 생성하는데 드는 비용을 아낄 수 있기 때문.

 

서버 푸시

-

 

h2와 h2c

h2 is HTTP/2 over TLS (protocol negotiation via ALPN).
h2c is HTTP/2 over TCP.

 

참고

https://developer.mozilla.org/ko/docs/Web/HTTP/Messages  

https://developers.google.com/web/fundamentals/performance/http2/?hl=ko  

 

'Network & Protocol & Infra' 카테고리의 다른 글

HTTP/2  (0) 2019.08.29
CentOS 7 의 firewalld (iptables 대신)  (0) 2019.05.09
VMware Shared VM 포트 개방 문제  (0) 2019.01.30
내부망, 인터넷 동시에 연결해서 사용하기  (0) 2017.11.20
Telnet : raw socket과의 차이  (0) 2017.06.27
Ethernet IEEE 802.3  (0) 2016.12.03