HTTP Versions
What is HTTP?
HTTP (Hypertext Transfer Protocol) 는 어플리케이션 계층에 있는 통신 규약이다. 클라이언트-서버 모델을 따르고 데이터 (hypermedia documents) 를 주고 받기 위해 사용된다. 클라이언트가 요청을 보내면 서버는 해당 요청에 대한 응답을 제공한다. 대표적으로는 인터넷이다. 인터넷상에서의 대부분 통신은 HTTP를 사용한다. 인터넷에서 웹사이트를 접속할때 브라우져가 호스트 서버에 요청을 보내 돌려받은 자원으로 웹페이지를 보여준다.
HTTP Versions
HTTP 는 여러번 진화해 왔다. HTTP 가 이루고자 하는 것은 크게 변하지 않았다. 웹상에서 데이터를 주고 받을 수 있는 통신 규약. 아래는 버전마다의 특징과 문제점을 정리했다.
HTTP 1.0
이 당시 HTTP 는 하나의 connection에서 하나의 요청만 처리 할 수 있었다. 그래서 상당히 비효율적이었다고 요약 할 수 있을 것 같다. 예를 들어 어떤 웹페이지를 로드할 때 HTML 과 CSS 파일이 필요하다고 가정해보면 이 페이지를 보여주기 위해서는 클라이언트와 서버가 두번 연결 상태를 만들어야한다. 첫번째 연결에서는 HTML을 요청하고 두번째 연결에서는 CSS를 요청한다.
좀 더 구체적으로 살펴보면 한번 연결을 할때 마다 TCP handshake를 해야되는 셈이니 이 제약 때문에 쓸때없이 여러번 같은 작업을 반복했다. 이 떄문에 속도와 효율면에서 단점이 컸다.
HTTP 1.1
위 문제를 해결하고자 버젼 1.1 에서는 keep-alive
라는 metadata field 가 생기고 이런 요청 metadata를 담을 수 있는 헤더가 추가 되었다. keep-alive
플래그를 통해 이제 연결상태를 유지 할 수 있었고 여러 요청을 하나의 연결에서 해결 할 수 있었다.
여기서 추가된 단점은 헤더를 추가 함으로서 요청과 응답 payload 크기가 커졌다는것이다. 아마 이것 때문에 헤더가 큰 요청에 경우 네트워크 통신이 좀 더 오래걸렸을 것 같다.
추가적으로 한번에 하나의 요청만 처리가 가능하다는 제약이 있었다. 이 경우 요청하는 자원중에 큰 파일/데이터가 있을 경우 해당 자원 요청을 처리하는 동안 다른 자원들에 대한 요청이 이루어지지 않는다는 점에서 페이지가 렌더링되는 시간이 오래걸리는 경우가 종종 있었다. 이 현상을 head-of-line blocking (HOL blocking) 이라고 부른다.
HTTP 2.0
버전 2.0에서도 중요한 개선사항들이 만들어졌다.
첫번째는 요청에 대한 멀티플렉싱이다. 이제 하나의 TCP 연결에서 여러개의 요청과 응답을 동시에 주고 받을 수 있다. 모든 요청과 응답은 고유한 ID 를 부여받기 때문에 여러개의 요청과 응답을 동시에 보내도 ID를 통해 구별하며 처리가 가능해졌다. 이로서 위에서 언급한 HOL blocking 문제를 해결했다.
또한 HPACK 을 통한 헤더 압축을 통해 요청/응답 payload의 크기를 줄여 통신 속도를 효율성을 개선했다.
서버 푸쉬: 클라이언트가 직접적으로 요청을 하지 않아도 직접 요청한 자원과 연관된 자원은 서버쪽에서 먼저 보내줄 수 있다. 물론 클라이언트가 사용하는 HTTP 버젼이 2.0 이전이면 서버 푸쉬가 제대로 일어나지 않을 수 있다는 단점이 있다.
HTTPS 를 기본으로 사용한다. 이로써 통신의 보안성을 증가한다.
HTTP 3.0
HTTP/3.0 은 기존에 사용하던 프로토콜에 변화를 주었다. 이제 TCP 를 기반으로 하는 통신이 아닌 QUIC 이라는 프로토콜을 사용한다. QUIC 은 UDP 를 기반으로 개발이 되었다.
개선 사항중 하나는 왕복 통신 한번이면 (1RTT) 연결이 수립이 된다. 기존에 버젼 경우, TCP와 TLS handshake 가 따로 일어났기에 서버와 클라이언트가 여러번 메세지를 주고 받고서야 통신을 본격적으로 시작이 가능했다. 더 나아가서 상황에 따라 서버와 클라이언트가 연결했던 이력이있으면 handshake 없이 0RTT 도 가능하다.
TCP 층에서 생기는 HOL blocking 현상을 개선했다. 사실 2.0 에서 개선한 HOL blocking 은 HTTP 상에서 문제를 해결한 것이고 같은 현상이 TCP 층에서도 존재했다.
네트워크 변경시에 생기는 통신 방해를 해결했다. 모바일 사용이 증가하면서 자주 생기는 현상중 하는 이동시에 기기가 다양한 네트워크를 오간다는 것이다. 예를 들어 집에서 와이파이에 연결되어 있다가 외출시에는 데이터를 사용한다. QUIC 은 transport 계층의 연결과 network 계층의 IP flow 를 분리시켜 이 문제를 해결한다.
References
- [Cloudflare] What is HTTP/3.0?
- [YouTube] Hussain Nasser - Hyper Text Transfer Protocol Crash Course - HTTP 1.0, 1.1, HTTP/2, HTTP/3
- [YouTube] Hussain Nasser - How HTTP/2 Works, Performance, Pros & Cons and More
- 면접을 위한 CS 전공지식 노트 - 주홍철