웹의 애플리케이션 계층 프로토콜인 HTTP(HyperText Transfer Protocol) 는 웹의 중심입니다.
HTTP는 W3 상에서 정보를 주고받을 수 있는 프로토콜입니다. 주로 HTML 문서를 주고받는 데에 쓰입니다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용합니다.
HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜입니다. 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 됩니다.
3방향 핸드셰이크
1. HTTP 클라이언트는 HTTP기본 포트 80번을 통해 www.velog.io 서버로 TCP연결을 시도한다.
2. HTTP 서버는 연결을 수락한다.
3. HTTP클라이언트는 HTTP 요청메시지를 TCP소켓을 통해 서버로 보낸다.
이후과정
4. HTTP 서버는 연결 소켓을 통하여 요청 메시지를 받는다. 저장장치로부터 html, 자바스크립트, css 파일 등을 추출하여 응답 메시지에 그 객체를 캡슐화하여 보낸다.
5. HTTP 서버는 TCP에게 TCP연결을 끊으라고 한다. (클라이언트가 응답메시지를 올바르게 받을때까지)
6. 응답메시지를 받으면 연결이 중단된다.
하지만 HTTP 1.1 부터는 keep-alive가 가능해짐에 따라 지속연결이 가능해집니다. 즉, TCP 연결을 그대로 유지하고 이후 요청과 응답을 같은 연결을 통해 보낼 수 있습니다. 이후 일정 시간이 지나면 연결을 닫습니다.
문서화된 최초의 HTTP 버전은 1991년 HTTP 버전 0.9
입니다.
1996년 버전 1.0
, 그리고 1999년 1.1
이 각각 발표되었습니다. 그리고 한참 후인 2015년 HTTP/2
가 발표되었습니다.
HTTP/3
는 HTTP 프로토콜의 3번째 메이저 업데이트 버전입니다. 2020 년 10 월 현재 인터넷 초안입니다. W3Techs에 따르면 상위 1000 만 웹 사이트 중 7.3 %가 HTTP / 3를 지원합니다.
문제점 : HTTP/1.0 에서는 클라이언트와 서버 간의 요청/응답 교환을 위해서 하나의 TCP 연결이 새로 만들어 지는데, 요청을 보내기 전에 TCP와 TLS 핸드쉐이크가 완료되어야 하므로 모든 요청에 대해서 지연 패널티가 발생하게 됩니다.
1.0이 발표될 당시에 다양한 표준화가 진행되고 있었고, 1.0 발표가 된지 몇달 지나지 않아 HTTP의 첫번째 표준버전인 1.1이 발표되었습니다.
HTTP/1.1을 통해 많은 개선사항이 있었고, 그 중 keep-alive 헤더 등의 역할은 클라이언트와 서버간의 연결 비용을 줄이는데 큰 역할을 하였습니다.
클라이언트 요청 예
GET /restapi/v1.0 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMnzpdvtYYNWMSJ7CL8h0zM6q6a9ntw
서버 응답 예
HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Content-Type: text/html; charset=UTF-8 Content-Encoding: UTF-8 Content-Length: 138 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Connection: close - <html> <head> <title>An Example Page</title> </head> <body> Hello World, this is a very simple HTML document. </body> </html>
HTTP/2의 등장은 이를 해결할 해결책으로 "streams"라는 개념을 도입하였습니다. 이것은 서로 다른 HTTP 연결들을 하나의 TCP 스트림으로 다중화하여 추상화 할 수 있는 개념으로, 브라우저에서 보다 효율적으로 TCP연결을 재사용 할 수 있도록 지원하는 개념입니다.
특히, HTTP/2의 경우에는 여러개의 HTTP 스트림을 하나의 TCP 커넥션으로 처리하기 때문에 더 크게 영향을 받게 됩니다.
HTTP/3는 매우매우매우 이례적으로 기반 프로토콜을 UDP를 사용합니다. 정확하게는 UDP를 기반으로 하는 QUIC를 사용합니다. UDP를 사용하지만 그렇다고 기존의 신뢰성 있는 통신이라는 타이틀을 포기한 것은 아닙니다.
HTTP/3의 장점을 설명하기 위해서는 기존의 TCP를 포기하고 QUIC를 채택하면서 얻게 된 장점을 설명해야한다.
따라서 이러한 QUIC를 이용하는 HTTP/3는 새로운 연결에 대해서 핸드세이크로 인한 지연, 패킷 손실이 다른 스트림에 미치는 영향, 패킷 손실로 인한 지연으로부터 자유로울 수 있다.
그냥 HTTP/2를 수정하면 되지 않았을까?
HTTP/2의 일부 기능들은 QUIC 위에서도 별도의 변환 없이 그대로 적용할 수 있지만, 몇몇 기능들은 그렇지 않다. 대표적으로 예를 들자면, HPACK 이라는 HTTP/2에서 사용하던 헤더 압축 체계는 응답의 전달순서에 따라 크게 좌우되는데, QUIC는 스트림간의 순서를 보장하지 않기 때문에 사용할 수 없다.
현 진행상황
빠른 콘텐츠 전달이 생명인 CDN들은앞 다투어 서비스들을 적용하고 있고, 당연히 해당 CDN을 이용하는 서비스 제공자들은 HTTP/3를 지원한다. 구글에서 제공하는 상당수의 컨텐츠들(유튜브 포함), 페이스북 등이 지원하도록 구성되었고, 클라이언트는 크롬, 엣지 브라우저, curl 등이 이미 지원하고 있다.
youtube에 접속했을 때 h3-Q050
이 바로 http/3입니다.
추가적으로, HTTP / 3에 대한 Nginx 지원은 1.19 릴리스에 예정되어 있습니다. HTTP / 3 nginx를 지원하는 기술 프리뷰 2020 년 6 월에 발표되었다.
네트워크와 WEB 시리즈 관련해서 중복되는게 발생하는거 같아서 HTTP 관련해서는 여기서 마치도록 하겠습니다.
HTTP 각 헤더, 세션과 쿠키, 메소드 같은 내용은 WEB 시리즈에서 다루도록 하겠습니다. 다음시간에는 애플리케이션 프로토콜 2번째로 메일관련한 부분을 학습하도록 하겠습니다.