버전별 HTTP의 특징
HTTP란?
Hyper Text Transfer Protocol의 약자로 HTML을 전송하기 위해 만들어 졌지만 현재는 게임 등 특별한 경우를 제외하고 IMAGE, 영상, 파일, JSON 등 대부분의 리소스를 전송하는 용도로 사용된다.
HTTP는 클라이언트 - 서버 구조를 가지며, Stateless, 비연결성의 특징을 갖는 프로토콜이다.
HTTP/1.0
HTTP는 기본적으로 연결을 유지하지 않는 프로토콜이다. 그래서 HTTP의 초기 버전은 1.0에서는 하나의 요청에 연결/종료 과정을 거치는 방식으로 동작했다. 즉, 매 요청마다 TCP의 3 Way HandShake를 거치기 때문에 RTT가 증가되는 단점이 있었다.
*RTT(Round Trip Time): 패킷이 목적지에 도달한 이후 다시 출발지로 돌아오기 까지 걸리는 시간. 즉, 패킷의 왕복 시간을 의미한다.

요청을 많이 할 수록 RTT가 늘어나기 때문에 이를
해결하기 위한 방법으로는 다음 방법들이 사용되었다.
이미지 스프리팅(Image Spriting)
여러개의 이미지를 하나로 합쳐져 있는 이미지(Sprite Image)를 다운받아 background-image의 background-position값을 이용하여 이미지를 표시하는 방법이다.
*Sprite 이미지란? 특정 이미지를 자주 사용하거나 사용하는 이미지가 많을 경우 그때마다 서버로 요청하게 되면 대역폭을 비효율적으로 사용하게 된다. 이 때 여러 이미지를 단일 이미지로 합쳐 보내면 대역폭을 효율적으로 사용할 수 있는데, 여기서 단일 이미지로 합친 이미지를 'Sprite 이미지'라고 한다.


코드 압축
코드의 개행 문자, 빈칸을 없애 코드의 크기를 최소화하는 방법.
HTTP/1.1
HTTP/1.0에서 발전한 버전
매 요청마다 TCP 연결을 새로 맺어 RTT가 증가되던 문제를 지속 연결(Persistenet Connections)로 해결했다.
HTTP 지속 연결은 한번 연결을 맺으면 일정 시간 동안 연결이 해제되지 않도록 함으로써 단한번의 연결만으로 수많은 리소스를 주고 받을 수 있게 한다.
*Keep-Alive vs Persistent Connetions: Keep-Alive는 HTTP/1.0에서 사용되었던 용어로 HTTP/1.1에서는 Persistent Connections라는 용어를 대신 사용한다.

단점
- 무거운 헤더구조: HTTP1.1의 헤더에는 수 많은 메타데이터가 들어 있고 압축이 되지 않아 무겁다는 단점이 있다.
- HOL(Header Of Line) Blocking: HTTP/1.1의 요청-응답 쌍은 항상 순서를 유지하고 동기적으로 수행되어야 한다. 이 때문에 하나의 요청이 지연된다면 다음 요청들은 이전 요청이 처리되기 전까지 하염없이 기다릴 수 밖에 없다. 이러한 성능 저하 현상을 HOL Blocking이라고 한다.


HTTP/2
HTTP/2는 이전 버전보다 지연시간을 줄이고 응답 시간을 더 빠르게 할 수 있다는 특징이 있고, 멀티플렉싱, 헤더 압축, 서버 푸시, 요청의 우선순위 처리를 지원한다.
멀티플렉싱
여러 개의 스트림을 사용해 데이터를 송수신 하는 것. 이 덕분에 단일 연결을 사용해서 여러 요청과 응답을 병렬로 주고받을 수 있다. HTTP/1.1의 HOL Blocking문제를 해결할 수 있는 것이다.
헤더 압축
HTTP/2에서는 HTTP/1.1의 무거운 헤더 문제를 해결하기 위해 헤더 압축 기법을 사용한다. HTTP/2의 header압축은 내부적으로 HPACK이라는 모듈이 담당하며, 허프만 코딩 압축 알고리즘 등을 통해 압축을 수행한다.
허프만 코딩은(huffman coding) 문자열을 문자 단위로 쪼갠 뒤 그 빈도수를 세어 빈도가 높은 정보는 적은 비트 수를 사용하여 표현하고, 빈도가 낮은 정보는 비트 수를 많이 사용하여 표현해 전체 데이터 표현에 필요한 비트양을 줄이는 원리이다.

서버 푸시(Server Push)
HTTP/2에서 서버는 클라이언트의 요청을 받으면 요청에 대한 메시지 뿐만 아니라, 클라이언트에서 아직 요청하지 않았지만 클라이언트에 필요할 것으로 예상되는 다른 메시지도 함께 전송하는 기능을 제공하는데 이를 서버 푸시라고 한다.
아래 그림에서는 클라이언트는 /index.html 파일만 서버에게 요청했지만 서버는 /index.html을 그리는데 필요한 PNG 파일들도 서버 푸시를 통해 동시에 클라이언트에게 전송하는 것을 확인할 수 있다.

레퍼런스
https://ssup2.github.io/theory_analysis/HTTP2/
https://engineering.linecorp.com/ko/blog/think-differently-to-solve-problems
김영한 - 모든 개발자를 위한 HTTP 웹 기본 지식 - 3.HTTP