HTTP는 application layer 프로토콜이다
OSI 7 layer에 따르면, 그리고 인터넷의 근간이 되는 TCP/IP stack에 따르면, application layer는 transport layer 위에서 동작한다
그렇기 때문에 application layer로 분류되는 HTTP 프로토콜은 transport layer에 속하는 프로토콜 중에 하나를 사용해서 동작할 거라고 예상할 수 있다
transport layer에는 대표적으로 두 개의 프로토콜이 존재한다
하나는 TCP, 다른 하나는 UDP다
HTTP는 이 두 개의 프로토콜 중에 어디에 기반해서 동작하는 걸까?
HTTP는 TCP 기반일까? UDP 기반일까?
아마도 많은 분들이 HTTP는 TCP를 기반으로 동작한다고 알고 있을 것이다
그게 맞다
HTTP/3 전까지는 말이다
오늘날 널리 쓰이고 있는 버전인 HTTP/1.1과 HTTP/2는 TCP 기반이다
하지만 2022년에 표준 스펙이 발표된 HTTP/3는 UDP를 기반으로 한다
왜 HTTP/3는 UDP 기반일까?
HTTP/1.1과 HTTP/2 모두 TCP 기반으로 동작했는데, 왜 갑자기 UDP일까?
사실은 TCP 동작 방식의 구조적인 한계 때문에 HTTP도 덩달아 안좋은 영향을 받는 부분이 있었다
그래서 이 문제를 해결하기 위해 TCP를 대체할 새로운 transport layer 프로토콜을 설계하게 됐는데
그게 바로 'QUIC + UDP' 조합이다
UDP는 원래부터 있었던 프로토콜이라면 QUIC은 TCP를 대체하기 위해 새로 개발된 프로토콜이라고 보면 된다
여기서 중요한 것은 UDP도 QUIC도 둘 다 transport layer에 소속된 프로토콜이라는 점이다
그렇다면 왜 QUIC 혼자가 아닌 'QUIC + UDP' 조합이 된 걸까? 이 얘기는 나중에 하기로 하고 우선 QUIC에 대해 살펴보자
HTTP와 TCP 그리고 QUIC
HTTP 표준 스펙은, HTTP가 연결 지향(connection-oriented)의 transport layer 프로토콜 위에서 동작할 것을 상정하고 있다.
그리고 이 연결 지향 프로토콜은 데이터 패킷을 신뢰할 수 있는(reliable) 방법으로 전송할 수 있는 프로토콜이라고 가정하고 있다
그렇기 때문에 HTTP/2까지는 연결 지향의 신뢰할 수 있는 프로토콜인 TCP 위에서 동작하고 있었는데 HTTP를 더 발전시키기 위해서는 TCP의 구조적인 문제를 극복할 필요가 있었고,
그래서 TCP가 제공하는 '신뢰할 수 있는 데이터 전송 기능'을 동일하게 제공하면서도 TCP의 구조적인 문제를 해결할 수 있는 QUIC 프로토콜을 개발하게 된다
TCP와 QUIC의 차이
QUIC이 TCP의 단점을 개선한 프로토콜이라는 측면 외에도 둘 사이에는 또다른 중요한 차이가 있는데,
TCP가 컴퓨터 시스템 레벨, 즉 OS 레벨에서 구현된다면, QUIC은 application level에서, 즉 (커널 스페이스가 아니라) 유저 스페이스에서 구현된다는 점이다
TCP와 UDP는 처음 표준으로 발표된 이후로도 40년이 더 지난 프로토콜이기 때문에 현재는 거의 모든 OS에서 해당 프로토콜을 지원하고 있고, 그래서 시스템의 관점에서 봤을 때 이 두 개의 프로토콜은 이미 전 세계적으로 널리 퍼져있어서 사용하는데 전혀 문제가 없다
하지만 시스템 레벨에서 동작하는 또다른 프로토콜을 새로 개발해서 TCP나 UDP처럼 전세계 어디서나 사용될 수 있게 만들려면, 일단 대다수의 OS가 해당 프로토콜을 구현해서 반영해줘야 하고, 그 이후엔 지구상에 존재하는 거의 모든 컴퓨터들이 반영된 OS로 업데이트 돼야 하는데, 실제로 이게 되기까지는 십년 이상의 꽤나 긴 시간이 필요할 것이다
그래서 새로 개발된 프로토콜을 빠르게 쓸 수 있으려면 시스템 레벨에서 동작하는 프로토콜로 구현할 것이 아니라 '애플리케이션 레벨에서 동작하는' 프로토콜로 구현할 필요가 있었다
이렇게 접근하면 해당 프로토콜을 쓰고 싶은 애플리케이션들은 이 프로토콜을 애플리케이션 레벨에서 구현만 하면, 혹은 구현한 라이브러리를 쓰기만 하면 바로 적용해서 사용할 수 있다는 장점이 생긴다
이런 이유 때문에 QUIC은 컴퓨터 시스템 레벨에서 구현되지 않고 애플리케이션 레벨, 즉, 유저 스페이스에서 구현이 된 것이다
QUIC은 UDP 기반으로 동작
대신 이런 특징 때문에 (TCP 혹은 UDP와는 다르게) QUIC은 transport layer 프로토콜이지만 '혼자서는 독립적으로 동작할 수 없는 프로토콜'이라는 특징이 있다
'QUIC은 유저 스페이스에서 구현되는 프로토콜'이라는 점과 '시스템의 도움 없이 유저 스페이스에서 네트워크 통신을 하는 것은 불가능하다'는 점 때문에, QUIC을 통해 데이터 패킷을 주고 받기 위해서는 시스템이 제공하는 transport layer 프로토콜을 반드시 거쳐야 한다는 조건이 생기게 된다
즉, 유저 스페이스에서 구현된 QUIC은 UDP든 TCP든 둘 중 하나를 기반으로 동작해야 했고, QUIC은 TCP를 대체할 목적으로 개발된 것이기 때문에, QUIC은 UDP 위에서 동작하게 된다
그래서 HTTP/3가 개발될 때 TCP를 대체할 목적으로 함께 개발된 것이 바로 'QUIC + UDP' 조합인 것이다