HTTP 프로토콜이란?
HTTP(HyperText Transfer Protocol, 문화어: 초본문전송규약, 하이퍼본문전송규약)는 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다. 1996년 버전 1.0, 그리고 1999년 1.1이 각각 발표되었다.
출처 : https://ko.wikipedia.org/wiki/HTTP
즉 인터넷에서 데이터를 주고 받을수 있는(HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는) 프로토콜입니다.
HTTP 동작 방식
참조: https://joshua1988.github.io/web-development/http-part1/
- HTTP는 서버 사이에서 이루어지는 요청/응답(request/response) 프로토콜입니다.
HTTP 특징
- Request-Response
- 상태가 없는 Stateless 프로토콜
- Connetionless
Request - Response
- 한 컴퓨터 (클라이언트) 에서 데이터를 요청을 보내면 다른 컴퓨터(서버) 에서는 그 요청에 따른 응답을 보내는 형식
Stateless (무상태 프로토콜)
- 어떠한 이전 요청과도 무관한 각각의 요청을 독립적인 트랜젝션으로 취급하는 통신 프로토콜
Connectionless(비연결성)
- 클라이언트와 서버가 한번 연결을 맺은 후. 클라리언트의 요청에 대해 서버가 응답을 마치면 맺엇던 연결을 끊어 버리는 성질
HTTP 발전 방식
HTTP 용어 등장
- 1965년 제너두 프로젝트에서 테디 넬슨이 만듬
HTTP 0.9 - 원라인 프로토콜
- 본래 HTTP 초기버전에는 번호가 없었으나 차후 버전과 구별하기 위해 0.9로 불림
- 요청 : 요청된 방법 + 해당 경로
- Method : GET
- 응답 직후 종료
- HTTP Header x -> HyperText 이외에 다른 파일 전송 x
- 상태 / 오류코드 / 버전 x
HTTP 0.9 예시
HTTP 1.0 - 확장
- 1996년 등장
- HTTP 버전 정보가 각 요청 사이내로 전송 가능
- 상태 코드 도 응답의 시작부분에 붙어 전송 시작
-> 브라우저 요청에 대한 성공/실패 여부 확인
- 요청에 따른 결과에 대한 동작(로컬 캐시 갱신/사용) 기능
- HTTP 헤더 개념 등장
-> 메타데이터 전송을 허용 (프로토콜의 유연성 / 확장 가능성 높임)
-> 평이한 HTML 이외에 다른 문서들 또한 전송이 가능해짐(Content-Type)
- 연결 방법 : GET , HEAD, POST
- 단순한 동작이 반복되면서 통신부하 문제 발생
HTTP 1.0 예시
-
Request
Get /myPage.html HTTP/1.0
User-Agent : NCSA_Mosaic / 2.0 (Windows 3.1)
-
Response
-> HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 137582
Expires: Thu, 01 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 1 May 1996 12:45:26 GMT
Server: Apache 0.84
-
Resource
<HTML>
A page with an image
<IMG SRC="/myimage.gif">
</HTML>
HTTP 1.1 - 표준 프로토콜
- 1997년 1월 등장
- Connction 재사용이 가능 -> Keep-alive 기능
- pipelining의 등장으로 인해 Multiple Request가 처리 가능
-> 첫번째 요청에 대한 응답이 완전히 전송되기 전에 두번째 요청을 가능하게 함
- Proxy Server , 간접 접근 지역
- Caching -> 전송 및 접근 시간 절약
- 단일 IP로 Multiple Web Site 사용 가능
-> 자원 소모를 줄임
Keep-alive 및 Pipelining
- Keep-Alive
: 기존 1개의 요청/응답의 프로세스를 처리 하면 Connectionless 특성으로 인해 Connection이 close됩니다. 그에 따라서 요청/응답을 다시 요청 해야 하는데 요청/응답을 하기 전 클라이언트와 서버간의 연결을 위한 작업이 필요합니다. 그에 따라서 데이터를 주고 받는 시간이외에 나머지 추가 인증 시간이 누적되어서 Network Latency 가 증가합니다. 이를 개선 하기 위해 Keep-Alive라는 개념을 도입하여 Connection을 유지해 인증시간에 따른 레이턴시를 감소 시킵니다.
- Pipelining
: 하나의 Connection으로 다수의 Request / Response를 처리할수 있게끔 하는 기능으로서 Network Latency가 줄일수 있다.
-> 완전한 멀티플렉싱이 아닌 응답처리를 미루는 방식으로 앞선 응답이 오지 않을 경우 HOL Blocking 발생
Proxy Server
- proxy : 같은 프로토콜을 사용하는 둘 이상의 어플리케이션을 연결하는 용도
- 보안 개선
- 성능 개선 / 비용 절약
- 트래픽 개선 및 사용자 접근 차단 기능
Caching
- 브라우져가 웹 페이지 구성요소를 PC의 hard disk에 저장했다가 같은 요소가 다시 불릴 때 서버에 요청하지 않고 저장된 것을 보여주는 것
-> cache는 client와 svr 사이에 위치하여 기능을 수행함으로써 데이터의 전송을 줄여 양측의 부하를 줄이고, 보다 빨리 리소스를 얻을 수 있도록 한다.
출처: https://jaweb.tistory.com/entry/HTTP-Http-11-Cache-Header-에-대한-정리 [잡다구리 파크]
HTTP 1.1의 문제
- HOL (Head Of Line) Bloking - 특정 응답의 지연
- HTTP의 HOL Blocking 문제 : 순차적으로 데이터를 요청하고 응답을 받는 작업 진행중 먼저 받은 요청이 끝나지 않으면 뒤의 요청이 아무리 빨리 끝나도 대기해야하는 현상
- RTT(Round Trip time)의 증가
HTTP 1.1 개선
Image Spriting
- 여러개의 이미지를 하나의 이미지로 합쳐서 관리하는 이미지 (사용시 좌표범위로 구분하여 사용)
Domain Sharding
- 리소스를 여러 개의 도메인으로 나누어 저장하여, 페이지 로딩 시간을 빠르게 하는 방법
- 각 브라우저 당 최대 Connection 수가 한정이 되있기 때문에 각 도메인을 나눔으로서 페이지 로딩 시간을 개선
Minify CSS/Javascript
- CSS 및 JAVASCRIPT를 압축해서 전달
Data URI Scheme
- data: 스킴이 접두어로 붙은 URL은 컨텐츠 작성자가 작은 파일을 문서 내에 인라인으로 임베드해서 데이터를 전송
HTTP 2.0 등장
- SDPY(구글 제안프로토콜) 기반으로 2015년 IETF에 의해 HTTP 2.0 등장
HTTP 2.0 특징
Binary Framework
Stream Prioritization
Multiplexing 개선
Server Push
- 클라이언트가 요청하지 않아도 필요가 예상되는 리소스를 서버가 미리 전송
-> HTTP 1.1에서는 클라이언트가 HTML 문서를 요청했고 해당 HTML에 여러개의 리소스가 있는 경우 해석하면서 필요한 리소스를 재요청 하는 방식이며 반면 HTTP/2에서는 Server Push 기법을 통해서 클라이언트가 요청하지 않아도 리소스를 push 해주는 방식
HTTP 2.0 한계
HTTP 2.0가 HTTP 1.1에 비해 많은 기능들이 개선되었으나 HTTP2.0 또한 TCP통신을 이용하기 때문에 HTTP 1.1에 문제점에서 발생했던 문제들이 여전하게 발생하고 있습니다.
HTTP 3.0
HTTP 2.0이 2015년도에 등장하였습니다. 그런데도 불구하고 약 4년만에 HTTP3.0이 등장하였습니다. 무엇이 바뀐것일까?
The differences are in the mapping of these semantics to underlying transports. Both HTTP/1.1 and HTTP/2 use TCP as their transport. HTTP/3 uses QUIC , a transport layer network protocol developed initially by Google where user space congestion control is used over the User Datagram Protocol (UDP). The switch to QUIC aims to fix a major problem of HTTP/2 called "head-of-line blocking": because the parallel nature of HTTP/2's multiplexing is not visible to TCP's loss recovery
참조 : https://en.wikipedia.org/wiki/HTTP/3
가장 눈에 띄는 것은 기존 HTTP의 통신 방식인 TCP 에서 QUIC로 바뀐것이다.
그렇다면 QUIC란 무엇일까?
QUIC 프로토콜
QUIC (Quick UDP Internet Connection) :
구글에서 2013년 6월에서 공개한 프로토콜으로서 UDP를 채택한 프로토콜입니다.
QUIC 장점
- 연결 설정 시 레이턴시 감소
- TCP 통신을 사용하지 않으므로 통신을 시작시 번가로운 3-WAY-HANDSHAKE 과정을 거치지 않아도 된다.
- 클라이언트가 서버에 신호를 한번 주고 서버가 거기에 따른 응답만 하면 바로 통신 가능
- 흐름 제어의 속도 개선
- TCP/QUIC 둘다 통신과정에서 발생한 에러를 ARQ 방식을통해 에러를 복구하는 방식
- TCP: Stop and Wiat ARQ (수신측에서 적절한 답변을 안주면 레이턴시 발생)
- QUIC : 에러를 정정할수 있는 이레이저 코드를 같이 전송
※ 이레이저 코드 : 데이터 원본을 nn개로 나눈후 그 데이터를 가지고 kk의 패러티를 생성해서 최대 kk개가 손실이 되더라도 nn개의 데이터만 있으면 전체 제이터를 복구 가능
- 클라이언트의 IP가 바뀌어도 연결이 유지됨
참조