Quiche는 IETF에 의해 지정된 quic 전송 프로토콜 및 HTTP/3의 구현입니다. Quic 패킷을 처리하고 연결 상태를 처리하기위한 낮은 레벨 API를 제공합니다. 이 응용 프로그램은 I/O (예 : 소켓 처리)와 타이머를 지원하는 이벤트 루프를 제공합니다.
Quiche가 어떻게 생겨 났는지에 대한 자세한 내용과 디자인에 대한 통찰력을 얻으려면 CloudFlare의 블로그에서 더 자세하게 설명하는 게시물을 읽을 수 있습니다.
Quiche는 CloudFlare Edge Network의 HTTP/3 지원을 제공합니다. CloudFlare-quic.com 웹 사이트는 테스트 및 실험에 사용될 수 있습니다.
Android의 DNS Resolver는 Quiche를 사용하여 HTTP/3을 통해 DNS를 구현합니다.
Quiche는 HTTP/3을 지원하기 위해 CURL에 통합 될 수 있습니다.
Quiche는 비공식 패치를 사용하여 HTTP/3을 지원하는 NGINX에 통합 할 수 있습니다.
Quiche API로 뛰어 들기 전에 Quiche-Apps 상자의 일부로 제공된 Quiche 도구를 사용하는 방법에 대한 몇 가지 예가 있습니다.
건물 섹션에 언급 된 명령에 따라 프로젝트를 복제 한 후 클라이언트는 다음과 같이 실행할 수 있습니다.
$ Cargo Run-Bin Quiche-Client- https://cloudflare-quic.com/
서버는 다음과 같이 실행할 수 있습니다.
$ CARGO RUN-- BIN QUICHE-SERVER---cert apps/src/bin/cert.crt -key apps/src/bin/cert.key
(제공된 인증서는 자체 서명되었으며 생산에 사용해서는 안됩니다)
--help
명령 줄 플래그를 사용하여 각 도구 옵션에 대한 자세한 설명을 얻으십시오.
Quiche를 사용하여 quic 연결을 설정하는 첫 번째 단계는 Config
객체를 만드는 것입니다.
mut config = quiche :: config :: new (quiche :: protocol_version)?
Config
객체는 quic 버전, ALPN ID, 흐름 제어, 정체 제어, 유휴 시간 초과 및 기타 속성 또는 기능과 같은 quic 연결의 중요한 측면을 제어합니다.
Quic은 일반 목적 전송 프로토콜이며 합리적인 기본값이없는 몇 가지 구성 속성이 있습니다. 예를 들어, 특정 유형의 허용 된 동시 스트림 수는 Quic을 통해 실행되는 응용 프로그램 및 기타 사용 사례 특정 문제에 따라 다릅니다.
Quiche는 몇 가지 속성을 0으로 기본으로하지 않으며, 응용 프로그램은 다음을 사용하여 필요를 충족시키기 위해 다른 것으로 설정해야 할 가능성이 높습니다.
set_initial_max_streams_bidi()
set_initial_max_streams_uni()
set_initial_max_data()
set_initial_max_stream_data_bidi_local()
set_initial_max_stream_data_bidi_remote()
set_initial_max_stream_data_uni()
Config
또한 TLS 구성을 보유합니다. 이는 기존 객체의 뮤티터 또는 TLS 컨텍스트를 수동으로 구성하고 with_boring_ssl_ctx_builder()
사용하여 구성을 생성함으로써 변경 될 수 있습니다.
여러 연결에서 구성 객체를 공유 할 수 있습니다.
클라이언트 측에서 connect()
유틸리티 함수는 새 연결을 생성하는 데 사용될 수 있으며 accept()
서버에 대한 것입니다.
// client connection.let conn = quiche :: connect (일부 (& server_name), & scid, local, peer, & mut config)? & mut config)?;
Connection의 recv()
메소드를 사용하여 응용 프로그램은 네트워크에서 해당 연결에 속하는 들어오는 패킷을 처리 할 수 있습니다.
let let to = socket.local_addr (). unprap (); loop {let (let, from) = socket.recv_from (& mut buf) .unwrap (); let recv_info = quiche :: recvinfo {from, to}; conn.recv (& mut buf [.. read], recv_info) {ok (v) => v, err (e) => {// 오류가 발생하여 핸들링을 처리합니다 .Break;},};}
나가는 패킷은 대신 Connection의 send()
메소드를 사용하여 생성됩니다.
loop {let (write, send_info) = match conn.send (& mut out) {ok (v) => v, err (quiche :: error :: done) => {// dide writing.break;}, err ( e) => {// 오류가 발생하여 처리를 처리합니다 .Break;},}; socket.send_to (& out [.. write], & send_info.to) .unwrap ();}
패킷이 전송되면 응용 프로그램은 시간 기반 연결 이벤트에 반응 할 타이머를 유지 관리 할 책임이 있습니다. Connection의 timeout()
메소드를 사용하여 타이머 만료를 얻을 수 있습니다.
타임 아웃 = conn.timeout ();
이 응용 프로그램은 타이머 구현을 제공하며 사용 된 운영 체제 또는 네트워킹 프레임 워크에만 해당 될 수 있습니다. 타이머가 만료되면 연결의 on_timeout()
메소드를 호출해야하며, 그 후에는 추가 패킷이 네트워크에서 전송되어야 할 수 있습니다.
// 타임 아웃 만료, hands.conn.on_timeout (); // timeout.loop {let (write, send_info) = match conn.send (& mut out) {ok (v) => v, err (quiche :: error :: done) => {// dide writing.break;}, err (e) => {// 오류가 발생하여 처리 it.break;},}; socket.send_to (& out [.. out], & send_info.to) .unwrap ();}
응용 프로그램은 네트워크에서 단기 정체 및 손실을 일으킬 수있는 패킷 버스트를 생성하지 않도록 발신 패킷을 보내는 것이 좋습니다.
Quiche는 send()
메소드에 의해 반환되는 [ SendInfo
] 구조의 [ at
] 필드를 통해 나가는 패킷에 대한 간격 힌트를 노출시킵니다. 이 필드는 특정 패킷을 네트워크로 전송 해야하는 시간을 나타냅니다.
애플리케이션은 플랫폼 별 메커니즘 (예 : Linux의 SO_TXTIME
소켓 옵션) 또는 사용자 지정 메소드 (예 : 사용자 공간 타이머 사용)를 통해 패킷 전송을 인위적으로 지연시켜 이러한 힌트를 사용할 수 있습니다.
일부가 앞뒤로 연결되면 연결이 핸드 셰이크를 완료하고 응용 프로그램 데이터를 보내거나받을 준비가됩니다.
stream_send()
메소드를 사용하여 스트림에서 데이터를 보낼 수 있습니다.
conn.is_established () {// 핸드 셰이크가 완료된 경우 스트림에서 일부 데이터를 보내십시오 0.conn.stream_send (0, b "hello", true);}
응용 프로그램은 Connection의 readable()
메소드를 사용하여 읽기 쉬운 스트림이 있는지 확인할 수 있으며, 이는 읽을 수있는 미결제 데이터가있는 모든 스트림에 반복기를 반환합니다.
그런 다음 stream_recv()
메소드를 사용하여 읽기 쉬운 스트림에서 응용 프로그램 데이터를 검색 할 수 있습니다.
conn.is_established () {// readable streams.for stream_id of conn.readable () {// stream이 읽을 수있는 경우, 더 이상 데이터가 없을 때까지 읽으십시오 ((읽기, fin)) = conn.stream_recv. (stream_id, & mut buf) {println!
Quiche HTTP/3 모듈은 Quic 전송 프로토콜 위에 HTTP 요청 및 응답을 보내고 수신하기위한 높은 레벨 API를 제공합니다.
C/C ++ 애플리케이션에서 Quiche를 사용하는 방법에 대한 예제를 포함하여 Quiche API를 사용하는 방법에 대한보다 완전한 예제는 [Quiche/examples/] 디렉토리를 살펴보십시오 (자세한 내용은 아래 참조).
Quiche는 Quiche를 C/C ++ 응용 프로그램 (일부 FFI 형태를 통해 C API를 호출 할 수있는 다른 언어)에보다 쉽게 통합하는 데 사용할 수있는 Rust API 위에 얇은 C API를 노출시킵니다. C API는 Rust One의 동일한 설계를 따릅니다.
cargo build
실행할 때 libquiche.a
라는 정적 라이브러리가 녹슬과 함께 자동으로 구축됩니다. 이것은 완전히 독립형이며 C/C ++ 응용 프로그램에 직접 연결할 수 있습니다.
FFI API를 활성화하려면 --features ffi
cargo
에 전달하여 ffi
기능을 활성화해야합니다 (기본적으로 비활성화).
Quiche는 Rust 1.67 이상이 필요합니다. 최신 안정 녹 방출은 Rustup을 사용하여 설치할 수 있습니다.
Rust 빌드 환경이 설정되면 Quiche 소스 코드를 GIT를 사용하여 가져올 수 있습니다.
$ git clone -recursive https://github.com/cloudflare/quiche
그리고화물을 사용하여 건축 :
$화물 빌드 -예입니다
화물을 사용하여 테스트 수양을 실행할 수도 있습니다.
$화물 테스트
TLS를 기반으로 Quic의 암호화 핸드 셰이크를 구현하는 데 사용되는 BoringsSL은 Quiche와 연결되어야합니다. 이는화물을 사용하여 Quiche를 구축 할 때 자동으로 수행되지만 빌드 프로세스 중에 cmake
명령을 사용할 수 있어야합니다. 창문에는 NASM도 필요합니다. 공식 BoringsSL 문서에 자세한 내용이 있습니다.
대안으로 QUICHE_BSSL_PATH
환경 변수로 BoringsSL 디렉토리를 구성하여 BoringsSL의 사용자 정의 빌드를 사용할 수 있습니다.
$ quiche_bssl_path = "/path/to/boringssl"화물 빌드 -예고 있습니다
또는 OpenSSL/Quictls를 사용할 수 있습니다. Quiche 가이 공급 업체를 사용할 수 있도록 openssl
기능을 --feature
목록에 추가 할 수 있습니다. 이 공급 업체를 사용하는 경우 0-RTT
지원되지 않습니다.
Android 용 Quiche (NDK 버전 19 이상, 21 권장)는 Cargo-NDK (v2.0 이상)를 사용하여 수행 할 수 있습니다.
먼저 Android NDK를 Android Studio 또는 직접 사용하여 설치해야하며 ANDROID_NDK_HOME
환경 변수는 NDK 설치 경로로 설정해야합니다.
$ 내보내기 Android_ndk_home =/usr/local/share/android-ndk
그런 다음 필요한 Android 아키텍처의 Rust Toolchain을 다음과 같이 설치할 수 있습니다.
$ Rustup Target은 Aarch64-Linux-Android ARMV7-Linux-Androideabi i686-Linux-Android X86_64-Linux-Android를 추가합니다
최소 API 레벨은 모든 대상 아키텍처의 경우 21입니다.
Cargo-NDK (v2.0 이상)도 설치해야합니다.
카고 설치화물 NDK
마지막으로 Quiche 라이브러리는 다음 절차를 사용하여 구축 할 수 있습니다. -t <architecture>
및 -p <NDK version>
옵션은 필수입니다.
$ Cargo NDK -T ARM64 -V8A -P 21- 빌드 -기능 FFI
자세한 내용은 build_android_ndk19.sh를 참조하십시오.
iOS 용 Quiche를 구축하려면 다음이 필요합니다.
Xcode 명령 줄 도구를 설치하십시오. Xcode 또는 다음 명령으로 설치할 수 있습니다.
$ xcode-select-설치
iOS 아키텍처 용 Rust Toolchain을 설치하십시오.
$ Rustup Target Add Aarch64-Apple-Ios x86_64-Apple-Ios
cargo-lipo
설치 :
카고 설치화물 리포
libquiche를 구축하려면 다음 명령을 실행하십시오.
$ Cargo Lipo- 기능 FFI
또는
$ Cargo Lipo -Features ffi -릴리스
iOS 빌드는 Xcode 10.1 및 Xcode 11.2에서 테스트되었습니다.
Docker 이미지를 작성하려면 다음 명령을 실행합니다.
$ Docker-Build를 만듭니다
다음 Docker Hub 리포지토리에서 Quiche Docker 이미지를 찾을 수 있습니다.
Cloudflare/Quiche
Cloudflare/Quiche-Qns
Quiche Master Branch가 업데이트 될 때마다 latest
태그가 업데이트됩니다.
Cloudflare/Quiche
/usr/local/bin에 설치된 서버 및 클라이언트를 제공합니다.
Cloudflare/Quiche-Qns
quic-interop-runner 내에서 Quiche를 테스트 할 스크립트를 제공합니다.
저작권 (C) 2018-2019, Cloudflare, Inc.
라이센스 복사를 참조하십시오.