가장 큰 특징은 TCP가 아닌 UDP를 사용한다는 것이다.
정확히 말하면 HTTP3는 QUIC라는 프로토콜 위에서 돌아가는 HTTP인데, QUIC는 Quick UDP Internet Connection의 약자로 UDP를 사용하는 프로토콜이다.
TCP는 3 way hand shake, 끝날 때 4way hand shake 등 오버헤드와 HOLB 등의 문제를 피할 수 없다.
QUIC는 TCP hand shake 과정을 최적화하는 것에 초점을 맞추어 설계되었다.
UDP는 데이터그램 방식을 사용하는 프로토콜이기에 각각의 패킷 간 순서가 존재하지 않는 독립적인 패킷이다.
UDP는 TCP에 비해 헤더가 많이 비어있기에, 커스터마이징할 수 있는 여지가 많고 이를 이용해 개발자가 구현을 어떻게 하느냐에 따라서 신뢰성을 확보할 수 있다.
RTT : Round Trip Time. 클라이언트가 요청하고 서버가 처리해 다시 응답해주는 사이클
HTTPS over TCP + TLS 소요 레이턴시 : 1RTT(TCP) + 2RTT(TLS) = 3RTT
HTTPS over QUIC 소요 레이턴시 : 1RTT
첫번째 hand shake를 할 때 연결 설정에 필요한 정보와 데이터를 함께 보내 RTT를 것이다. TCP+TLS는 데이터 보내기 전 신뢰성 있는 연결과 암호화에 필요한 정보를 교환 후 데이터를 교환한다.
TCP는 송신 측이 패킷을 보낸 후 타이머를 사용해 일정 시간 동안 응답이 오지 않으면 패킷이 손상되었다고 판단해 재전송한다. 이때 문제는 TCP가 타임아웃을 언제 낼 것인가를 동적으로 계산해야 한다. 패킷 재전송시 ACK을 받았을 때 첫 번째로 보낸 패킷의 ACK인지 두 번째로 보낸 패킷의 ACK인지 확인해야 한다. 이를 재전송 모호성이라고 한다.
QUIC는 헤더에 별도의 패킷 번호 공간을 부여해 패킷 손실 감지에 걸리는 시간을 단축한다.
여러 개의 스트림을 사용하면 특정 스트림의 패킷이 손실되어도 해당 스트림에만 영향을 미치고 나머지 스트림은 멀쩡히 사용할 수 있다.
HTTP2와 마찬가지로 멀티플렉싱을 지원해 이점을 그대로 가져간다
TCP는 발신지 IP, 발신지 port, 수신지 IP, 수신지 port로 연결을 식별해 클라이언트 IP가 바뀌면 연결이 끊어져 버린다. 이는 다시 연결을 생성하기 위해 3 way hand shake를 다시 해야하고, 레이턴시가 또 다시 발생된다.
요즘같이 모바일로 인터넷을 사용하는 경우 wifi에서 셀룰러로 전환될 때 클라이언트 IP 전환되는 경우가 많아 문제가 심각해진다.
QUIC는 connection ID사용해 서버와 연결을 생성한다. 이는 클라이언트 IP와는 전혀 무관하기 때문에 클라이언트 IP가 변경되더라도 기존의 연결을 계속 유지할 수 있다.