본문 바로가기

Deprecated/HTTP

[Web/HTTP] HTTP/0.9, HTTP/1.x 그리고 HTTP/2

HTTP/0.9(원-라인 프로토콜)

초기 HTTP는 버전 번호가 없었습니다. HTTP/0.9는 차후 버전과의 구별하기 위해서 부여된 이름입니다. 초기의 HTTP는 단일 라인(원-라인)으로 구성되며 리소스에 대한 경로로 가능한 메소드는 GET이 유일했습니다.

GET /mypage.html

웹 서버의 응답 또한 단순한 형태였는데, 다음과 같이 오로지 파일 내용 자체로 구성되어 있었습니다.

<HTML>
This is a mypage
</HTML>

초기 HTTP에는 헤더가 없었기에 다음과 같은 결함이 있었습니다.

  • HTML 파일만을 전송 할 수 있습니다.
  • 응답으로 상태 또는 오류 코드를 전송 할 수 없습니다.

HTTP/1.0

초기 HTTP 사용 방법은 제한적이었기에 HTTP/1.0은 웹 브라우저와 웹 서버 모두에서 기능을 확장하기 위한 시도로서 설계되었습니다.

  • HTTP 헤더 개념이 요청과 응답 모두에 추가되어 HTTP를 더 유연하고 확장 가능하도록 만들었습니다.
  • HTTP/0.9 또는 HTTP/1.0과 같은 버전 정보가 추가되었습니다.
  • HTML 파일 외에도 다른 유형의 파일을 전송 할 수 있습니다.
  • 응답으로 상태 또는 오류 코드를 전송 할 수 있고, 이에 대한 웹 브라우저의 실패 처리 등이 가능합니다.

초기 HTTP에 비해 여러 기능들이 보안되었으나, 요청 또는 응답이 발생할 때마다 새로운 연결을 맺기 위한 3-Way Handshake가 발생하는 문제가 여전히 남아있습니다.

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.1

HTTP/1.0에서 확장성에 대한 실험적인 시도 후에 HTTP/1.1이 공개되었습니다. HTTP/1.1은 HTTP의 첫 번째 표준 버전에 해당합니다. 기존 HTTP/1.0과의 핵심적인 차이는 연속성의 향상에 있습니다. 이제는 연결을 한 번 맺으면 필요한 모든 데이터를 전송한 뒤에 연결 종료함으로써 3-Way Handshake의 발생 횟수를 현저히 줄이게 됩니다.

  • 오늘날 가장 많이 사용하는 HTTP 버전입니다.
  • 커넥션이 재사용하여 연결에 필요한 시간을 단축합니다.
  • 파이프라이닝(Pipelining)을 추가하여 첫 번째 요청이 완료되기 이전에 다음 요청을 전송할 수 있도록 합니다.
  • 결과적으로 웹 브라우저와 웹 서버 간의 커뮤니케이션에 필요한 시간을 단축합니다.
  • GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS와 같은 여러 가지 메소드 유형을 제공합니다.
  • 언어와 인코딩 유형, 컨텐츠 유형을 포함하여 웹 브라우저와 웹 서버간 주고 받는 데이터에 대한 협의를 가능하게 합니다.
  • 청크된 응답을 지원합니다. 청크를 사용하면 단일 응답이 여러 개의 Chunk로 쪼개어 전송됩니다.
  • Host 헤더를 사용하여 동일한 IP 주소에 다른 도메인을 호스트 할 수 있어 서버 코로케이션이 가능합니다.

HTTP/2

웹 서버가 제공하는 데이터 품질이 향상되기 시작하고, 웹 브라우저의 기능이 다양해짐에 따라서 HTTP/1.1은 점점 더 많은 복잡도와 오버헤드를 갖게 되었습니다. HTTP/2는 기존 데이터 교환 방식을 대체하고 응답성을 높이기 위한 버전입니다.

  • 텍스트 기반 프로토콜에서 이진 포멧으로 인코딩된 Message, Frame 기반의 프로토콜로 바뀌었습니다.
  • 기존의 HTTP와 달리 더 이상 사람이 읽고 쓸 수 없으나(이진 포멧이기 때문에) 경량화 되었습니다.
  • 멀티플렉스 스트림(Multiplexed Streams)을 추가하여 동일한 커넥션에서 요청이 병렬로 처리 될 수 있습니다. 요청 순서에 따라서 이전 응답이 지연되면 나머지 응답도 지연되는 파이프라이닝과 달리, 요청 순서에 상관 없이 응답이 이뤄집니다.
  • 데이터를 중복 전송하거나 불필요한 오버헤드를 제거합니다.
  • 서버 푸시를 통해 클라이언트가 요청하지 않은 리소스를 서버가 마음대로 보내줄 수 있습니다.