목차
- HTTP 0.9
- HTTP 1.0
- HTTP 1.1
- HTTP 2.0
HTTP (HyperText Transfer Protocol)
다양한 형태의 정보를 전송하는 어플리케이션 프로토콜
역사
| 연도 | 간단 설명 | |
|---|---|---|
| HTTP/0.9 | 1991년 | GET 메서드만 지원 오류 코드 X HTTP 헤더 X HTML 파일만 전송 |
| HTTP/1.0 | 1996년 | 메서드, 헤더, 오류코드 추가 여러 타입의 파일도 전송 가능 매 요청마다 연결 및 연결 종료 |
| HTTP/1.1 | 1997년 | Keepalive 기능 default로 추가 pipelining 기능 추가 |
| HTTP/2.0 | 2015년 | 1.1버전 한계인 HOL block 보완을 위해 등장 Multiplexing |
| HTTP/3.0 | ~ing | QUIC (UDP) 프로토콜을 사용 궁금하면 https://evan-moon.github.io/2019/10/08/what-is-http3/ | |
1. HTTP 0.9
- 메소드 : GET
- 보내줄 수 있는 데이터 : HTML
GET /mypage.html
<HTML>
Simple HTML page
</HTML>
2. HTTP 1.0
이전 세대에서 추가된 점
- 헤더 추가
- 상태 코드, 컨텐츠 타입 등 메타 데이터 포함
- 응답 HTML 이외에도 추가
- 메소드 추가 : HEAD, POST
주요 특징!
- 매 번 요청마다 hand shake
- ⇒ 굉장히 느림
일반적인 요청과 응답
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>
두 번째 커넥션에 의한 이미지를 내려받기 위한 요청과 그에 대한 응답
GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(image content)
3. HTTP 1.1
이전 세대에서 달라진 점
- 메서드 추가 : OPTIONS, PUT, DELETE, TRACE
- 헤더 몇가지 기능 추가
* Via : 중계서버(프록시, 게이트웨이 등)의 지원 프로토이름 * Accept : ex. application/json, text/plain, */* ...
- 매 요청마다 hand shake 하지 않도록 Keep alive 기능 추가
- 파이프라이닝 기능 추가
Keep-alive
- 클라이언트와 서버 사이 연결을 일정 기간동안 기억해서 반복적으로 일어나는 통신의 연결 횟수를 줄임

Pipe Lining
- 여러개의 요청을 보낼 때 서버로부터 이전 요청에 대한 응답을 받기까지 기다리지 않고 바로 요청을 보내는 것

한계
HOL block (Head-Of-Line block)
- 먼저 처리된 요청이 있어도 먼저 서버로 도착한 응답이 처리 될 때 까지 Block 상태가 되는 것
⇒ 해결은 가능 tcp 연결을 만들어 병렬적으로 이용하는 방식
⇒ 이또한 메모리, cpu리소스를 낭비하는 단점 존재!
하나의 단일 커넥션을 통한 요청의 전형적인 전체 흐름의 예시
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.0
첫 시작은 구글이 만든 시험용 프로토콜 SPDY
달라진 점
- HTTP 1.1 프로토콜을 계승해서 성능 향상에 초점을 맞춤

- 요청 메시지를 작은 프레임으로 쪼갬
- 헤더와 컨텐트 부분을 각각의 프레임으로 분리
- 평문을 사용하던 이전 버전과 달리 바이너리 포맷으로 인코딩된 Message, Frame으로 구성
HTTP 2.0 특징들
HOL Block 해결 (Multiplexed Streams)

Stream Prioritization
- 전송 리소스 간에 우선순위를 설정할 수 있다.
Server Push
- 클라이언트의 요청에 대해 요청하지 않은 리소스를 마음대로 보내줄 수 있다.
- 클라이언트가 요청하기 전에 필요하다고 예상되는 리소스를 Server에 서 먼저 요청
- ex) 하나만 요청했는데 css, js, image를 함께 전송
Header Compression
- header table과 HPAC 압축 방식을 이용해 압축
- 이전 Header의 내용과 중복되는 필드를 전송하지 않아 데이터를 절약
