본문 바로가기

Computer Science/Network

<네트워크> http 버전 별 특징 (0.9 / 1.0 / 1.1 / 2.0)

 

1. http/0.9

 - 초기 단계의 http 프로토콜은 버전 번호도 없었으며 매우 간단했다. 이후 버전과 구별하기 위해 0.9라고 불리게 되었다.

 

 - http/0.9 요청은 단일 라인으로 구성되며 리소스에 대한 경로로 가능한 메서드는 GET이 유일했다.

 

GET /myapp.html

 

 - 응답 또한 매우 단순하게 파일 내용 자체로 구성되어 있었다. 헤더도 없이 html파일만 전송될 수 있으며 다른 유형의 문서는 전송될 수 없음을 의미했다. 상태코드도 없어서 문제가 있을 경우 파일 내부에 문제에 대한 설명과 함께 보내곤 했다.

 

2. http/1.0

 - http/1.0은 이전에 비해 브라우저와 서버에서 확장성있게 진화되었다. 1.0이라는 버전정보가 전송되기 시작했고, 상태코드가 응답의 시작 부분에 붙어 전송되었다. 이 결과 브라우저가 요청에 대한 성공과 실패를 알 수 있어서 결과에 대한 처리를 할 수 있게 되었다.

 

 - 헤더 개념이 요청과 응답 모두를 위해 도입되었다. 메타데이터 전송을 허용하고 프로토콜을 극도로 유연하고 확장가능하도록 한 것이다. 이 덕에 html파일 외에 다른 문서들을 전송하는 기능이 추가되었다.(Content-Type)

 

GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
  <IMG SRC="/myimage.gif">
</HTML>

 

 - 위는 일반적인 http/1.0의 요청과 응답이다. 위와 같은 새로운 기능들은 1991년부터 1995년까지 일단 해보자식으로 시작되었다. 수많은 상호작용을 거쳐 1996년 일반적인 내용을 설명하는 문서(RFC 1945)가 공개되었다. http/1.0의 정의를 담고있으나 공식적인 표준은 아니다.

 

3. http/1.1

 - http/1.0 문서가 출간된지 얼마 지나지 않아 1997년 1월에 http/1.1 공개 되었다. 이전 버전에서 모호했던 내용을 개선하고 추가적인 기능들이 도입되었다.

 

 - 커넥션이 재사용될 수 있게 하였다. 단일 원본 문서 내로 임베드된 리소스들을 디스플레이하기 위해 사용된 커넥션을 다시 열어 시간을 절약한다. 청크된 응답 또한 지원되며, 추가적인 캐시 제어 메커니즘이 도입되었다.

 

 - 파이프라이닝이 추가되어 요청에 대한 응답이 끝나기 전에 다음 데이터를 미리 요청할 수 있게 되었다. 이를 통해 커뮤니케이션 레이턴시를 개선하였다.

 

GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header

200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding

(content)


GET /static/img/header-background.png HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header

200 OK
Age: 9578461
Cache-Control: public, max-age=315360000
Connection: keep-alive
Content-Length: 3077
Content-Type: image/png
Date: Thu, 31 Mar 2016 13:34:46 GMT
Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
Server: Apache

(image content of 3077 bytes)

 

 - 위는 하나의 단일 커넥션을 통한 요청의 예시이다.

 

4. http/2

* 소개

 - http/1.1 은 여전히 문제점이 존재했다. 바이너리가 아닌 텍스트로 데이터를 보내고, 하나의 TCP연결에 1개의 스트림만 이용가능하다. 게다가 요청이 동기적으로 진행되고, 헤더에 불필요하게 중복된 데이터가 있다.

 

 - http/2는 이전에 애플리케이션 내에서 수행되던 http/1.1 임시 방편들을 취소하고 이러한 문제를 전송 계층 내에서 해결할 수 있도록 하여 애플리케이션을 더 빠르고 단순하게 만들었다. 2버전의 주요 목표는 응답 다중화, 헤더의 효율적 압축, 우선순위, 서버 푸시가 있다. 이러한 성능 개선의 목표를 위해 바이너리 프레이밍 계층을 도입하였고, 이는 1.x버전과 호환되지 않으므로 버전이 2로 올라갔다.

 

 - http/2를 알아보려면 SPDY를 알아볼 필요가 있다. 이는 구글에서 2009년 발표한 시험용 프로토콜이다. 1.1의 성능제한을 해결하여 웹 페이지의 로드 지연 시간을 줄이는 것이 목표였다. 바이너리 프레이밍 계층을 도입하여 기본 TCP연결을 효율적으로 사용하였다. 결과적으로 페이지가 55% 더 빨리 로드되는 것이 확인되었고, http/2 프로토콜의 출발점으로 SPDY사양이 채택되었다.

 

 - 2015년 초 http/2 표준이 발행되었다. 이에 따라 SPDY 지원은 중단되었다.

* 용어

 - http/2 의 용어를 간단하게 알아보자

 

 - 프레임은 http/2에서 통신의 최소 단위이며, 각 최소 단위에는 하나의 프레임 헤더가 포함된다.

 - 메시지는 논리적 요청 또는 응답 메시지에 매핑되는 프레임의 전체 시퀀스이다.

 - 스트림은 구성된 연결 내에서 전달되는 바이트의 양방향 흐름이며, 하나 이상의 메시지가 전달될 수 있다.

 

 - 모든 통신은 단일 TCP연결을 통해 수행되며 전달될 수 있는 양방형 스트림의 수는 제한이 없다. 각 스트림에는 고유 식별자와 우선순위가 있다. 각 메시지는 하나의 논리적 http메시지이며 하나 이상의 프레임으로 구성된다.

 

* 바이너리 프레이밍

 - http/2의 핵심이다. 바이너리 프레이밍 계층은 http메시지가 캡슐화되어 클라이언트와 서버 사이에 전송되는 방식을 규정한다. 참고로 여기서 "계층"은 새로운 인코딩 메커니즘을 도입하기 위한 디자인이다.

https://developers.google.com/

 

 - 기존 http는 body가 문자열로 이루어졌지만 http/2 부터는 바이너리 프레이밍 계층에 이진 데이터로 전송된다. 헤더는 여전히 문자열이지만 바디는 바이너리 데이터로 변경된 것이 가장 큰 특징이다. 기존과 달리 줄바꿈으로 구분되는 텍스트를 없애고, 더 작은 메시지와 프레임으로 전송되게 되었다.

 

* 요청 및 응답 다중화

 - 위의 소개에서도 잠깐 알아봤었던 내용이다. http/2는 하나의 연결에 하나의 스트림만 사용가능했던 http/1.1의 문제를 해결하였다. 1 버전에서는 HOL(Head of line)문제가 있었다. 이는 패킷이 순서대로 도작해야 하므로, 패킷이 도착할 때까지 그 이후 패킷은 전송되지 못하는 것이다. 이에 의해 1개의 스트림만 이용가능했었던 것이다. 결과적으로 여러 TCP 연결을 사용하게 된다.

 

 

 - http/2 버전에서는 하나의 TCP연결에 여러 스트림을 사용하고, 요청과 응답을 병렬로 처리할 수 있게 되었다. 클라이언트와 서버가 http메시지를 독립된 프레임으로 세분화하고, 다른 쪽에서 다시 조립하도록 하였다.

 

 - 결과적으로 TCP연결이 하나이므로 3-way-handshake 오버헤드가 없고, 네트워크 가용성이 증가하여 속도 상승을 기대할 수 있다.

 

* 서버푸시

 - HTTP/2 에서는 서버가 클라이언트 요청에 대해 여러 응답을 보낼 수 있다. 즉 원래 요청에 대한 응답과 더불어 서버가 추가적인 리소스를 클라이언트에 푸시할 수 있게된 것이다.

* 헤더압축

 - http 전송에서는 전송되는 리소스와 그 속성을 설명하는 헤더 세트를 전달한다. http/1.1 에서는 항상 일반 텍스트로 전송되고, 전송당 500~800바이트, 쿠키까지 사용하면 KB 단위로 추가되었다. 이를 개선하기 위해 http/2에서는 HPACK 압축 방식을 사용하였다 이는 크게 두가지 기술을 사용한다.

 

 - 첫째로 헤더 필드를 Huffman 코드로 인코딩하여 필드의 전송 크기를 줄여준다. 둘째는 이전에 표시된 헤더 필드의 색인 목록을 클라이언트와 서버가 유지하고 업데이트하도록 한다. 이 목록을 참조로 중복 값을 인코딩 한다.

 

 

 


참고

 

 

 

HTTP의 진화 - HTTP | MDN

HTTP는 월드 와이드 웹에 내재된 프로토콜입니다. Tim Berners-Lee에 의해 1989년부터 1991년에 발명된 HTTP는, 본래의 단순함의 대부분을 지키면서 확장성 위에서 만들어지도록, 많은 수정을 거쳐왔습

developer.mozilla.org

 

 

HTTP/1.1, /2, /3 의 차이점

HTTP /1.x, /2, /3 에 대해 간략히 공부한 내용을 정리했습니다.

velog.io

 

HTTP/2 소개  |  Web Fundamentals  |  Google Developers

HTTP/2(또는 h2)는 푸시, 다중화 스트림 및 프레임 제어를 웹에 구현하는 바이너리 프로토콜입니다.

developers.google.com