
현재 우리가 쓰는 http로 완성되기까지 여러 단계의 스텝과 버전을 지나면서 발전해왔다!
진짜 원시적인 프로토콜. 하지만, 기본적인 통신의 기반이 잡힌 버전.
우리가 알고있는 대부분의 기능과 모습이 이때 정형화 되었다.
문제는, 모든 통신에 커넥션을 새로한다는 것. -> tcp 핸드셰이크를 매번 하게 된다.
화면에 들어가는게 html, js, css, 및 이미지, 사운드, 비디오,.. 라고 생각하면 엄청난 오버헤드가 발생
핸드 셰이크를 통해 커넥션을 오픈하는 시기에 Connection, Keep-Alive를 추가해 서버와의 연결을 끊지 않고 유지할 수 있는 방법.
GET / HTTP/1.1
Host: www.example.com
Connection: keep-alive
Keep-Alive: timeout=10, max=100
반대로 Connection: close 를 사용하면 연결을 단발성으로 유지할 수 있다.

응답이 제대로 갔다는 것을 확인하지 않고, 일단 보내는 기술 -> 듣기만해도 불안정
파이프라이닝의 경우, 응답을 순서대로 보내야하는 데에서 문제가 생긴다. 만약, 서버의 작업이 많아, 먼저온 요청이 오래걸리게 된다면, 응답이 결과적으로 계속 밀리게 되는것.
HTTP 1.x 는 모든 전송 메세지가 텍스트로 가는데 반해, HTTP 2에서는 binary frame으로 변경되어 헤더 및 바디 모두 압축하여 보낼 수 있다는 장점이 있다.


특히 Stream 이라는 방식을 통해 멀티플랙싱을 구현하게 된다.
다중 Stream을 통해서 프레임을 병렬적으로 받아 하나의 메세지를 완성하는 방법.
gif가 너무 좋은데 퍼올수가 없음ㅎㅎ;;
요청이 오기 전에 예상되는 응답을 미리 보내 캐싱하는 방법.
예를 들어, index.html에 대한 요청이 왔으면, 단순히 그 응답만 처리하는게 아닌 index.css, index.js, 및 이미지들을 미리 응답으로 보내는 기술.
특정 메세지를 빠르게 받기 위해 Stream간에 우선순위를 두는 기술.
그래서 html, js, css는 최대한 빠르게 받고, 에셋은 느리게 받아 빠르게 랜더링을 시킬 수 있게 됨
우선순위 트리를 통해서 상위 노드일수록 높은 우선순위를 갖는 구조.
HOLB는 멀티플랭식/스트림 우선순위를 통해 해결한게 아니였나?
TCP만의 문제 - 오류나 유실되는 패킷을 재요청하면, 뒤에 오는 패킷의 처리가 늦어진다.
그래서! 3 버전부터는 tcp를 버리고, udp 기반의 QUIC 프로토콜을 사용한다. 좀 더 엄밀히 말하면, 구글에서 TCP의 고유한 문제를 해결한 QUIC을 만들고 이를 새로 적용한 프로토콜이 http 3.0이 되겠다.
http 3.0은 http의 통신 문제보다, low network 프로토콜 개선에 중점을 두게 된다.
UDP는 TCP와 다르게 데이터그램 방식을 활용해 도달하는 속도가 빠른반면, 신뢰성이 낮다고 알려져 있다. 하지만, 신뢰성이 없는 것이 아니고 설정이 안되어 있다는게 더 맞는 표현이다.
그래서, QUIC는 UDP를 사용하여 한번의 핸드셰이크를 통해 TLS 및 TCP 핸드셰이크를 모두 끝내어 연결에 필요한 시간을 최대한 단축했다.


QUIC는 여러개의 독립 스트림을 통해 패킷을 병렬적으로 받을 수 있다. 하나의 패킷이 오류가 나도 해당 스트림만 작업이 중지 되는 상황이 되어 전체적인 작업이 밀리지 않는다.
보통 클라와 서버가 서로의 연결을 구분하기 위해서는 클라 IP, 포트, 서버 IP, 포트가 필요해서 만약 핸드폰으로 와이파이를 잡고 쓰다가, 데이터로 바꾸는 순간 새로운 연결이 필요해 진다. 하지만, QUIC에서는 Connection ID를 통해 서로를 식별하게 된다. 첫 연결시 서로에게 커넥션 ID가 임의로 설정이 되고, 네트워크가 달라져도 저장되어 있는 아이디를 통해 서로를 식별한다. 또한, 캐싱을 하여 오래 통신을 안해도 바로 연결 할 수 있다.