HTTP 초기 버전에는 버전 번호가 없었다. HTTP/0.9는 이후에 차후 버전과 구별하기 위해 0.9로 불리게 되었다.
HTTP/0.9는 극히 단순하다. 요청은 단일 라인으로 구성되며 리소스에 대한 (프로토콜, 서버 그리고 포트는 서버가 연결되고 나면 불필요 하므로 URL은 아닌) 경로로 가능한 메서드는 GET이 유일했다.
응답 또한 극도로 단순했다. 오로지 파일 내용 자체로 구성된다.
그 이후 버전과는 다르게, HTTP 헤더가 없었는데 이는 HTML 파일만 전송될 수 있으며 다른 유형의 문서는 전송될 수 없음을 의미한다. 상태 혹은 오류 코드도 없었다. 문제가 발생한 경우, 특정 HTML 파일이 사람이 처리할 수 있도록, 해당 파일 내부에 문제에 대한 설명과 함께 되돌려 보내졌었다.
두 번째 커넥션에 의한 이미지를 내려받기 위한 요청과 그에 대한 응답
재사용하여 탐색된 단일 원본 문서 내로 첨부된 리소스들을 표시하기 위해 사용된 커넥션을 다시 열어 시간을 절약하게 하였다.
HTTP/1.0은 요청 컨텐츠마다 TCP 세션을 맺어야 했지만, HTTP/1.1은 한개의 TCP 세션을 통해 여러개의 컨텐츠 요청이 가능하다.
이 때문에 서버는 TCP 세션 처리 부하를 줄일 수 있었고, 클라이언트도 응답속도가 개선되었다.
그래서 첫번째 요청에 대한 응답이 완전히 전송되기 이전에 두번째 요청 전송을 가능케 하여, 커뮤니케이션 지연 시간을 낮췄다.
즉, 응답 속도를 높혀 페이지 뷰의 속도를 빠르게 할 수 있는 기능이다.
즉, 한번 응답할 때 모든 정보를 담지 않고 분할 응답을 할 수 있다는 뜻이다.
그래서 동일 IP 주소에 다른 도메인을 호스트하는 기능을 가능하게 했다.
HTTP/1.0 에서는 하나의 IP에 여러 개의 도메인을 운영할 수 없다. 도메인마다 IP를 구분해서 준비해야 한다. 즉, 도메인만큼 서버의 개수도 늘어날 수 밖에 없는 구조이다.
하지만 HTTP/1.1에서 호스트 헤더의 추가를 통해 버츄얼 호스팅이 가능해졌다.
연결 당 하나의 요청과 응답을 처리하기 때문에 동시 전송 문제와 다수의 리소스를 처리하기에 속도와 성능 이슈가 존재한다.
HOL(Head Of Line) Blocking (특정 응답 지연)
RTT(Round Trip Time) 증가 (양방향 지연)
헤더가 크다 (특히 쿠키 때문)
Multiplexed Streams
요청이 커넥션 상에서 다중화 되므로 HOL(Head of Line) Blocking 이 발생하지 않는다.
Stream Prioritization
Header Compression
Server Push
프로토콜 협상 메커니즘 - 프로토콜 선택, (ex. HTTP/1.1, HTTP/2 또는 기타)
HTTP/1.1 과의 높은 수준의 호환성 - 메서드, 상태 코드, URI 및 헤더 필드
페이지 로딩 속도 향상
차이점을 얘기하기 전에 알아야 할 단어들이 몇가지 있다.
즉, 정리하자면
특징으로는
HTTP/1.1은 많은 문제를 갖고 있었다.
기존 HTTP는 바디가 문자열로 이루어져 있지만, HTTP/2.0 부터는 binary framing layer 라고 하는 공간에 이진 데이터로 전송된다.
HTTP 요청 메서드, 헤더 등은 여전히 문자열로 전송되지만, 바디 부분이 변경되는 것이 가장 큰 변경이다.
위 이미지를 보자.
좌측은 HTTP/1.1 로 구성된 메시지이고, 우측은 HTTP/2.0 으로 만들어진 메시지이다.
헤더와 바디 프레임으로 나뉘어 들어간다는 것을 알 수 있다.
1.0에서 1.1로 넘어오며 파이프라이닝 기술을 도입하였지만, 여전히 HOL(Head-Of-line) Blocking 문제가 있다.
- HOL(Head-Of-line) Blocking?
패킷이 순서대로 도착해야 하므로, 패킷이 도착할 때까지, 그 이후의 패킷은 전송되지 못하는 것을 의미한다.
위의 스트림의 개념을 사용하자면, 1.x 버전에서는 1개의 TCP 연결 당 1개의 스트림만 이용 가능하다.
따라서 하나의 메시지가 응답될 때까지 다른 메시지를 요청하지 못한다.
그래서 여러 TCP 연결을 수립하여 여러 요청을 수행한다.
하지만 HTTP/2.0 을 이용하면 스트림을 이용하여 다음과 같은 장점이 있다.
사실 이건 Optional한 기능이다.
이제 1개의 TCP에 여러 개의 스트림을 사용할 수 있게 되었으므로, 각각의 스트림에 우선순위를 둘 수 있게 되었다.
이것을 이용하여 전송 순서를 임의로 고정시킬 수는 없으나, 중요한 데이터를 먼저 보낼 수 있도록 설정하는 것이 가능하다.
HTTP 1.x 에서는
이러한 성능 이슈를 해결하기 위해 HTTP/2 는 HPACK 압축을 이용해 헤더를 압축하여 보낸다.
클라이언트에게 필요한 데이터가 있을 때, 직접 요청하기 전에 서버가 미리 데이터를 전송하여 받아볼 수 있게 하였다.
HTTP/2 를 도입하면서 여러 TCP 연결을 1개로 합치고, HOL 문제도 해결했지만
TCP 프로토콜 자체의 한계 때문에 더이상 성능 개선에도 한계가 오게 되었다.
그래서 하얀 도화지 같은 UDP를 사용하여 성능을 개선시켰다.
- QUIC?
Quick UDP Internet Connection의 약자로, 말 그대로 UDP를 사용하여 인터넷 연결을 하는 프로토콜
멀티플렉싱을 지원하며, 이로 인해 HOL Blocking이 없다.
- 멀티플렉싱 : 단일 연결로 여러 신호를 전송하는 것
참고 : https://pjh3749.tistory.com/170
매 요청마다 클라이언트 - 서버의 아이피가 필요한 것이 아니고, QUIC는 Unique connection ID를 사용해서 모든 패킷이 잘 구별될 수 있도록 하였다.
따라서 휴대폰으로 인터넷을 할 때, 중간에 와이파이에서 LTE로 변경해도 스트림이 계속 유지가 된다.
(TCP의 경우에는 처음부터 다시 데이터를 받아야 한다.)
참고
https://goldfishhead.tistory.com/26
https://bbubbush.tistory.com/21
https://it-mesung.tistory.com/159
https://velog.io/@zzzz465/HTTP1.1-2-3-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90