Quiche是IETF指定的QUIC傳輸協議和HTTP/3的實現。它提供了用於處理QUIC數據包和處理連接狀態的低級API。該應用程序負責提供I/O(例如插座處理)以及支持計時器的事件循環。
有關乳蛋餅是如何產生的更多信息以及對其設計的一些見解,您可以在Cloudflare博客上閱讀一篇文章,以詳細介紹。
Quiche Powers Cloudflare Edge Network的HTTP/3支持。 CloudFlare-Quic.com網站可用於測試和實驗。
Android的DNS解析器使用乳蛋餅在HTTP/3上實現DNS。
可以將乳蛋餅集成到捲髮中,以提供HTTP/3的支持。
可以使用非正式貼片將乳蛋餅集成到NGINX中,以提供HTTP/3的支持。
在潛入乳蛋餅API之前,以下是一些示例,介紹瞭如何使用作為蛋餅應用板條箱的一部分提供的乳蛋餅工具。
根據建築部分中提到的命令將項目克隆後,可以按以下方式運行客戶端:
$ CARGO RUN-BIN QUICHE-CLIENT-https://cloudflare-quic.com/
雖然服務器可以如下運行:
$貨物運行 - 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 :: protoct_version)?; config.set_application_protos(&[b“ example-proto'']); // //其他針對應用程序和用例的其他配置.. .
Config
對象控制QUIC連接的重要方面,例如QUIC版本,ALPN ID,流控制,擁塞控制,空閒超時以及其他屬性或功能。
QUIC是一種通用傳輸協議,有幾種配置屬性,沒有合理的默認值。例如,任何特定類型的並發流數量的允許數量取決於在QUIC上運行的應用程序以及其他特定的特定問題。
Quiche將幾個屬性默認為零,應用程序很可能需要將其設置為其他東西以滿足其需求:使用以下內容:
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)?; // connect.let conn = quiche :: cack accept(&scid,none,local,local ,peer,peer,,peer,,peer,,peer,peceer,peceer,peceer,peceer,peer,peer,peer,peer,peeer,connect,peer,peer,peer,peer,peceer,conterry.peer conn = quiche :: &mut config)?
使用連接的recv()
方法,應用程序可以處理網絡屬於該連接的傳入數據包:
lay to = socket.local_addr()。unwrap(); loop {lop {lop(read,trom)= socket.Recv_from(&mut buf).unwrap(); let recv_info = quiche :: recvinfo匹配conn.recv(&mut buf [.. read],recv_info){ok(v)=> v,err(e)=> {//發生錯誤
使用Connection的send()
方法生成傳出數據包:
loop {let(write,send_info)=匹配conn.send(&mut out){ok(v)=> v,err(quiche :: errir :: error :: dook down) e)=> {//發生錯誤, ander.break;},}; socket.send_to(&out [.. write],&send_info.to).unwrap();}
發送數據包時,該應用程序負責維護計時器以對基於時間的連接事件做出反應。可以使用連接的timeout()
方法獲得計時器到期。
讓超時= conn.timeout();
該應用程序負責提供計時器實現,該計時器可以特定於操作系統或使用的網絡框架。計時器到期時,應調用連接的on_timeout()
方法,之後可能需要在網絡上發送其他數據包:
//超時已過期,處理it.conn.on_timeout(); // // timeout.loop {let(write,send_info)= match conn.send(&mut out){ok(v)=> v, err(quiche :: errir :: down)=> {//完成寫作。break;},err(e)=> {//發生錯誤,whate it it it.break;},},}; socket.send.send. to(&out [&out [&out [&out [ .. write],&send_info.to).unwrap();}
建議應用程序的應用程序發送外發數據包,以避免創建可能導致網絡中短期擁塞和損失的數據包爆發。
Quiche通過send()
方法返回的[ SendInfo
]結構的[sendinfo]結構的[sendinfo]結構的[ at
]字段公開了提示提示。該字段表示應將特定數據包發送到網絡的時間。
應用程序可以通過人為地通過平台特定的機制(例如Linux上的SO_TXTIME
套接字選項)或自定義方法(例如,使用用戶空間計時器)來使用這些提示。
在來回進行一些方面,連接將完成其握手,並準備好發送或接收應用程序數據。
可以使用stream_send()
方法在流上發送數據:
如果conn.is_establed(){//完成握手,請在stream 0.conn.stream_send上發送一些數據(0,b“ hello”,true)?}
該應用程序可以通過使用連接的readable()
方法來檢查是否有任何可讀的流,該流可以在所有具有出色數據的流中返回迭代器。
然後,可以使用stream_recv()
方法從可讀流中檢索應用程序數據:
如果conn.is_establed(){// iTAble readable streams.for contrable()in contrable(){//流是可讀取的,請讀取直到沒有更多數據。當ok ok((read,fin,fin ))= conn.stream_recv (stream_id,&mut buf){println!(“ rack {} {}”,讀取,reats,stream_id);}}}}}}}
Quiche HTTP/3模塊提供了高級API,用於在Quic傳輸協議之上發送和接收HTTP請求和響應。
請查看[quiche/xpless/]目錄,以獲取有關如何使用乳蛋白API的更完整示例,包括有關如何在C/C ++應用程序中使用Quiche的示例(有關更多信息,請參見下文)。
乳蛋餅在Rust API頂部暴露了一個薄的C API,可以更輕鬆地將蛋餅整合到C/C ++應用程序中(以及其他語言,這些語言允許通過某種形式的FFI調用C API) 。 C API遵循與Rust One相同的設計,Modulo C語言本身施加的約束。
運行cargo build
時,將自動構建一個名為libquiche.a
的靜態庫。這是完全獨立的,可以直接鏈接到C/C ++應用程序中。
請注意,為了啟用FFI API,必須通過將--features ffi
給cargo
,必須啟用ffi
功能(默認情況下是禁用的)。
乳蛋餅需要生鏽1.67或以後才能構建。最新的穩定生鏽釋放可以使用Rustup安裝。
一旦設置了生鏽的環境,就可以使用git獲取蛋餅源代碼:
$ git克隆 - 恢復https://github.com/cloudflare/quiche
然後使用貨物建造:
$貨物建造 - 例例
貨物也可以用來運行測試儀:
$貨物測試
請注意,用於基於TLS實現Quic的加密握手的BoringsSL需要構建並鏈接到乳蛋餅。當使用貨物構建乳蛋白時,這是自動完成的,但是需要在構建過程中可用cmake
命令。在窗戶上,您還需要NASM。官方的BoringsSL文檔有更多詳細信息。
在替代方案中,您可以通過使用QUICHE_BSSL_PATH
環境變量配置boringssl目錄來使用自己的自定義boringssl構建:
$ quiche_bssl_path =“/path/to/boringssl”貨物構建 - 示例
另外,您可以使用openssl/quictls。為了使Quiche使用此供應商,可以將openssl
功能添加到--feature
列表中。請注意,如果使用此供應商,則不支持0-RTT
。
可以使用Cargo-NDK(v2.0或更高版本)進行Android的建築物乳蛋餅(NDK版本19或更高版本,建議使用21個)。
首先,需要使用Android Studio或直接安裝Android NDK,並且需要將ANDROID_NDK_HOME
環境變量設置為NDK安裝路徑,例如:
$ export android_ndk_home =/usr/local/local/share/android-ndk
然後,可以安裝為Android體系結構的Rust Tool鏈,如下所示:
$ RUSTUP目標添加AARCH64-LINUX-ANDROID ARMV7-LINUX-ANDRIDEABI I686-LINUX-ANDOAD X86_64-LINUX-ANDOED
請注意,所有目標體系結構的最小API級別為21。
還需要安裝Cargo-NDK(v2.0或更高版本):
$貨物安裝貨物-NDK
最後,可以使用以下過程來構建Quiche庫。請注意, -t <architecture>
和-p <NDK version>
選項是強制性的。
$ CARGO NDK -T ARM64 -V8A -P 21-構建-FFI -FFI
有關更多信息,請參見build_android_ndk19.sh。
要為iOS構建乳蛋餅,您需要以下內容:
安裝XCode命令行工具。您可以使用XCode或以下命令安裝它們:
$ xcode-select-安裝
為iOS體系結構安裝Rust工具鏈:
$ rusup target添加aarch64-apple-ios x86_64-apple-ios
安裝cargo-lipo
:
$貨物安裝貨物lipo
要構建Libquiche,請運行以下命令:
$ CARGO LIPO- FEATURES FFI
或者
$ CARGO LIPO - FEATURES FFI-釋放
iOS構建在Xcode 10.1和Xcode 11.2中進行了測試。
為了構建Docker圖像,只需運行以下命令:
$製造碼頭建造
您可以在以下Docker集線器存儲庫上找到Quiche Docker圖像:
Cloudflare/quiche
Cloudflare/Quiche-QN
latest
標籤將在乳蛋餅主分支更新時更新。
Cloudflare/quiche
提供安裝在/usr/local/bin中的服務器和客戶端。
Cloudflare/Quiche-QN
提供腳本來測試Quic-Interop-runner中的蛋餅。
版權(C)2018-2019,Cloudflare,Inc。
請參閱複製許可證。