大家好,我是漁夫。
今天分享主題,Cloudflare 開源的 Quiche 作為 QUIC 和 HTTP/3 的實現,提供了處理 QUIC 數據包和連接狀態管理的底層 API,允許開發者在他們的應用程序中集成 QUIC 和 HTTP/3 的功能。
Quiche 是 Cloudflare 開發的一個開源項目,它是 QUIC 協議的一個實現,用 Rust 語言編寫。
QUIC 是一種新的網絡傳輸協議,由 Google 開發,旨在提高網絡流量的安全性和性能。QUIC 協議默認進行加密,以減少數據傳輸的延遲,并提供更快的連接建立時間。
雖然,quiche 是 QUIC 實現中較新的一個,但它已經能夠與其他更成熟的實現進行互操作,并展示了 QUIC 的許多特性。Quiche 和 QUIC 本身都還在不斷完善中,隨著在互聯網上更廣泛地部署 QUIC,也將不斷發現并修復bug,實現新的功能,并在實踐中學習和進步,拭目以待。
使用 quiche 建立 QUIC 連接的第一步是創建一個 Config 對象:
let mut config = quiche::Config::new(quiche::PROTOCOL_VERSION)?;config.set_application_protos(&[b"example-proto"]);
該 Config 對象控制 QUIC 連接的重要方面,如 QUIC 版本、ALPN ID、流量控制、擁塞控制、空閑超時和其他屬性或功能。Config 還保存 TLS 配置。這可以通過現有對象上的修改器來更改,或者通過手動構建 TLS 上下文并使用with_boring_ssl_ctx_builder(),配置對象可以在多個連接之間共享。
在客戶端,connect() 實用程序函數可用于創建新連接,而 accept()用于服務器端:
// Client connection.let conn = quiche::connect(Some(&server_name), &scid, local, peer, &mut config)?;// Server connection.let conn = quiche::accept(&scid, None, local, peer, &mut config)?;
在這兩種情況下,應用程序負責生成新的源連接 ID,該 ID 將用于標識新連接。
應用程序還需要傳遞連接的遠程對等點的地址:對于客戶端來說,這是它嘗試連接的服務器的地址,對于服務器來說,這是發起連接的客戶端的地址連接。
使用連接的 recv()方法,可以處理來自網絡的屬于該連接的傳入數據包:
let to = socket.local_addr().unwrap();loop { let (read, from) = socket.recv_from(&mut buf).unwrap(); let recv_info = quiche::RecvInfo { from, to }; let read = match conn.recv(&mut buf[..read], recv_info) { Ok(v) => v, Err(quiche::Error::Done) => { // Done reading. break; }, Err(e) => { // An error occurred, handle it. break; }, };}
傳出數據包是使用連接的 send() 方法生成的。
loop { let (write, send_info) = match conn.send(&mut out) { Ok(v) => v, Err(quiche::Error::Done) => { // Done writing. break; }, Err(e) => { // An error occurred, handle it. break; }, }; socket.send_to(&out[..write], &send_info.to).unwrap();}
發送數據包時,應用程序負責維護計時器以對基于時間的連接事件做出反應。可以使用連接的方法獲取計時器到期時間 timeout()。
let timeout = conn.timeout();
應用程序負責提供計時器實現,該實現可以特定于所使用的操作系統或網絡框架。當計時器到期時,on_timeout()應調用連接的方法,之后可能需要在網絡上發送其他數據包。
// Timeout expired, handle it.conn.on_timeout();// Send more packets as needed after timeout.loop { let (write, send_info) = match conn.send(&mut out) { Ok(v) => v, Err(quiche::Error::Done) => { // Done writing. break; }, Err(e) => { // An error occurred, handle it. break; }, }; socket.send_to(&out[..write], &send_info.to).unwrap();}
更多使用,可以到官網進行查閱豐富的文檔。
本文鏈接:http://www.www897cc.com/showinfo-26-87971-0.html互聯網中,速度與安全性是永恒追求的,Rust 編寫的 QUIC 協議,到底有多強?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 絕妙 C++ 技巧:輕松掌握數值交換!