Cloudflare가 Rust로 작성된 QUIC 구현 quiche와 Tokio 런타임을 결합한 비동기 QUIC 라이브러리 tokio‑quiche를 오픈 소스로 공개했습니다. 내부에서 수년간 실전 검증을 거치며 HTTP/3와 MASQUE 등에서 초당 수백만 요청을 처리한 아키텍처와 액터 모델 접근을 소개합니다.
2025-11-06
읽는 데 5분

6년 조금 넘는 시간 전에, 우리는 Rust로 작성한 오픈 소스 QUIC 구현체인 quiche를 소개했습니다. 오늘 우리는 quiche와 Rust의 비동기 런타임인 Tokio를 결합한, 실전에서 검증된 비동기 QUIC 라이브러리 tokio-quiche를 오픈 소스로 공개합니다. Apple iCloud Private Relay의 Cloudflare Proxy B와 차세대 Oxy 기반 프록시를 구동하는 tokio-quiche는 낮은 지연 시간과 높은 처리량으로 초당 수백만 건의 HTTP/3 요청을 처리합니다. tokio-quiche는 또한 Cloudflare WARP의 MASQUE 클라이언트를 구동하여 WireGuard 터널을 QUIC 기반 터널로 대체하고, h3i의 비동기 버전도 지원합니다.
quiche는 sans-io 라이브러리로 개발되었는데, 이는 QUIC 전송 프로토콜을 처리하는 데 필요한 상태 머신을 구현하되, 사용자가 IO를 어떻게 수행할지에 대해 아무런 가정을 하지 않는다는 뜻입니다. 즉, 약간의 수고만 들이면 누구나 quiche와 IO를 통합할 수 있다는 말이죠! 이를 위해서는 UDP 소켓에 connect하거나 listen하고, 해당 소켓에서 UDP 데이터그램의 송수신을 관리하면서 모든 네트워크 정보를 quiche에 전달해야 합니다. 이 통합을 비동기로 만들어야 하므로, 비동기 Rust 런타임과의 통합 속에서 이 모든 작업을 수행해야 합니다. tokio-quiche는 이러한 일을 대신 처리해 주므로, 기름칠은 필요 없습니다.
원래 tokio-quiche는 Oxy의 HTTP/3 _서버_의 핵심으로만 사용되었습니다. 그러나 tokio-quiche를 독립 라이브러리로 만들게 된 결정적인 계기는 MASQUE를 지원하는 HTTP/3 _클라이언트_가 필요했기 때문입니다. Zero Trust 팀과 Privacy 팀은 각각 WARP와 Privacy Proxy를 통해 데이터를 터널링할 MASQUE 클라이언트가 필요했고, 우리는 클라이언트와 서버 모두를 동일한 기술로 구축하고자 했습니다.
우리는 처음 quiche를 오픈 소스로 공개하며, 가능한 한 많은 이해관계자에게 메모리 안전한 QUIC 및 HTTP/3 구현을 공유하고자 했습니다. 당시 우리의 초점은 다양한 종류의 소프트웨어에 통합되어 널리 배포될 수 있는 저수준, sans-io 설계에 있었습니다. 이 목표는 달성되어, quiche는 다양한 클라이언트와 서버에 배포되었습니다. 그러나 sans-io 라이브러리를 애플리케이션에 통합하는 일은 오류가 발생하기 쉽고 시간이 많이 듭니다. tokio-quiche로 우리의 목표는 필요한 코드 상당 부분을 우리가 직접 제공함으로써 진입 장벽을 낮추는 것입니다.
우리 제품과 시스템과 상호 작용하길 원하는 다른 이들이 HTTP/3를 채택하지 않는다면, Cloudflare만 HTTP/3를 도입해도 큰 소용이 없습니다. tokio-quiche를 오픈 소스로 공개하면 우리 시스템과의 통합이 더 간단해지고, 업계가 새로운 HTTP 표준으로 나아가도록 돕습니다. tokio-quiche를 Rust 생태계에 다시 기여함으로써, HTTP/3와 QUIC, 그리고 새로운 프라이버시 보호 기술의 개발과 사용이 촉진되기를 기대합니다.
tokio-quiche는 이미 수년간 내부에서 사용해 왔습니다. 그동안 우리는 이를 다듬고 실전에서 검증하여, 초당 수백만 요청을 처리할 수 있음을 입증했습니다. tokio-quiche는 독립형 HTTP/3 클라이언트나 서버를 지향하는 것이 아니라, 저수준 프로토콜을 구현하고 향후 더 높은 수준의 프로젝트가 그 위에 구축되도록 돕습니다. README에는 서버와 클라이언트 이벤트 루프 예제가 포함되어 있습니다.
Tokio는 매우 인기 있는 비동기 Rust 런타임입니다. 이는 에지에서 실행되는 수십억 개의 비동기 작업을 효율적으로 관리·스케줄링·실행합니다. 우리는 Tokio를 광범위하게에서Cloudflare 전반에 걸쳐 사용하고 있으며, quiche를 Tokio와 긴밀하게 통합하기로 결정했습니다. 그래서 이름도 tokio-quiche가 되었죠. 내부적으로 tokio-quiche는 QUIC과 HTTP/3 상태 머신의 여러 부분을 구동하기 위해 _액터_를 사용합니다. 액터는 내부 상태를 가진 작은 작업으로, 보통 채널을 통한 메시지 전달로 외부 세계와 소통합니다.
액터 모델은 sans-io 라이브러리를 비동기화(Async-ify)할 때 사용하기 좋은 추상화로, 두 가지 사이에는 개념적인 유사성이 있습니다. 액터와 sans-io 라이브러리 모두 배타적으로 접근하길 원하는 내부 상태를 가지고 있습니다. 또한 둘 다 대개 “메시지”를 주고받으며 외부와 상호 작용합니다. quiche의 “메시지”는 실제로는 수신·송신 네트워크 데이터를 나타내는 원시 바이트 버퍼입니다. tokio-quiche의 “메시지” 중 하나는 수신된 UDP 패킷을 묘사하는 Incoming 구조체입니다. 이러한 유사성 덕분에, sans-io 라이브러리를 비동기화한다는 것은 다음을 의미합니다: 새로운 메시지나 IO를 기다리고, 그 메시지나 IO를 sans-io 라이브러리가 이해할 수 있는 형태로 변환하고, 내부 상태 머신을 진행시키고, 상태 머신의 출력을 메시지나 IO로 변환한 뒤, 최종적으로 그 메시지나 IO를 전송하는 것입니다. (Tokio에서의 액터에 대한 더 많은 논의는 Alice Rhyl의 훌륭한 블로그 글을 참고하세요.)
tokio-quiche의 주요 액터는 quiche와 소켓 사이에서 패킷을 이동시키는 IO 루프 액터입니다. QUIC은 전송 프로토콜이므로, 원하는 어떤 애플리케이션 프로토콜이든 실어 나를 수 있습니다. HTTP/3가 가장 흔하지만, DNS over QUIC이나 곧 등장할 Media over QUIC 같은 예도 있습니다. 심지어 자신만의 QUIC 애플리케이션을 만들도록 도와주는 RFC도 존재합니다! tokio-quiche는 애플리케이션 프로토콜을 추상화하기 위해 ApplicationOverQuic 트레이트를 제공합니다. 이 트레이트는 quiche의 메서드와 하부 I/O를 추상화하여, 여러분이 애플리케이션 로직에 집중할 수 있게 해줍니다. 예를 들어 우리의 HTTP/3 디버그 및 테스트 클라이언트인 h3i는 클라이언트 중심의, HTTP/3가 아닌 ApplicationOverQuic 구현으로 구동됩니다.
서버 아키텍처 다이어그램
tokio-quiche에는 HTTP/3에 초점을 맞춘 ApplicationOverQuic 구현인 H3Driver가 포함되어 있습니다. H3Driver는 quiche의 HTTP/3 모듈을 이 IO 루프에 연결하여 비동기 HTTP/3 클라이언트나 서버를 위한 구성 요소를 제공합니다. 드라이버는 quiche의 원시 HTTP/3 이벤트를 더 높은 수준의 이벤트와 비동기 본문 데이터 스트림으로 변환하여, 여러분이 그에 맞춰 응답할 수 있게 합니다. H3Driver 자체는 제네릭으로, 코어 드라이버의 이벤트 위에 추가 동작을 쌓는 ServerH3Driver와 ClientH3Driver 변형을 제공합니다.
내부 데이터 흐름
tokio-quiche 내부에서는 소켓에서 quiche로 데이터가 이동하도록 돕는 두 가지 중요한 태스크를 스폰합니다. 첫 번째는 InboundPacketRouter로, 소켓의 수신 절반을 소유하고 연결 ID (DCID)로 수신 데이터그램을 각 연결별 채널로 라우팅합니다. 두 번째 태스크인 IoWorker 액터는 앞서 언급한 IO 루프로, 단일 quiche Connection을 구동합니다. 이는 quiche 호출 사이사이에 ApplicationOverQuic 메서드를 끼워 넣어, 모든 I/O 상호 작용 전후에 연결을 검사할 수 있도록 합니다.
곧 tokio-quiche의 제작 과정에 대한 더 많은 블로그 글을 게시할 예정입니다. 액터 모델과 뮤텍스, UDP GRO와 GSO, Tokio 태스크 협력(coop) 예산 등 다양한 주제를 다룰 것입니다.
tokio-quiche는 Tokio용 QUIC 및 HTTP/3 생태계에 대한 Cloudflare의 투자에 있어 중요한 토대이지만, 여전히 자체 복잡성을 가진 하나의 빌딩 블록일 뿐입니다. 앞으로 우리는 오늘날 Oxy 프록시와 WARP 클라이언트를 구동하는 것과 동일한, 사용하기 쉬운 HTTP 클라이언트 및 서버 추상화를 공개할 계획입니다. Cloudflare에서 QUIC과 HTTP/3에 대해 더 많은 블로그 글을 기대해 주세요. 여기에는 우리의 Privacy Proxies 고객을 위한 오픈 소스 클라이언트와 tokio-quiche로 초당 수백만 RPS를 처리하는 완전히 새로운 서비스도 포함됩니다!
지금은 crates.io의 tokio-quiche 크레이트와 GitHub의 소스 코드를 확인해, 나만의 QUIC 애플리케이션을 만들어 보세요. 간단한 에코 서버, DNS-over-QUIC 클라이언트, 커스텀 VPN, 혹은 완전한 기능의 HTTP 서버까지 무엇이든 가능합니다. 어쩌면 우리보다 먼저 완성하실지도요?
Cloudflare의 커넥티비티 클라우드는 기업 네트워크 전체를 보호하고, 고객이 인터넷 규모의 애플리케이션을 효율적으로 구축하도록 돕고, 모든 웹사이트와 인터넷 애플리케이션을 가속하며, DDoS 공격을 차단하고, 해커를 원천 차단하며, Zero Trust 여정을 지원합니다.
어떤 기기에서든 1.1.1.1을 방문해, 인터넷을 더 빠르고 안전하게 만들어 주는 무료 앱으로 시작해 보세요.
더 나은 인터넷 구축을 돕겠다는 우리의 사명에 대해 더 알아보려면 여기에서 시작하세요. 새로운 커리어 기회를 찾고 계시다면, 채용 중인 포지션을 확인해 보세요.