使用Github項目nghttp3的樣例學習HTTP/3

文章目錄

  • 前言
  • 一、HTTP3測試 in Ubuntu
    • 1.1. 基本軟件
    • 1.2. gcc/g++
      • 1.2.1. Ubuntu22
      • 1.2.2. Ubuntu20
        • 1.2.2.1. 必備庫
          • 1.2.2.1.1. gmp
          • 1.2.2.1.2. mpfr
          • 1.2.2.1.3. mpc
        • 1.2.2.2. 安裝
    • 1.3. libev >= 4.11(備用)
      • 1.3.1. 安裝
      • 1.3.2. 測試
    • 1.4. nghttp3
    • 1.5. ngtcp2 build with wolfSSL
      • 1.5.1. wolfSSL >= 5.7.0
      • 1.5.2. ngtcp2
      • 1.5.3. 使用
        • 1.5.3.1. server
      • 1.5.3.2. client
    • 1.6. ngtcp2 build with LibreSSL(可選)
      • 1.6.1. LibreSSL
      • 1.6.2. ngtcp2
    • 1.7. Wireshark
  • 二、HTTP3測試 in CentOS8.5


前言

nghttp3是Github上的一個基于C語言的HTTP/3庫,它使用的QUIC協議則由ngtcp2庫實現,并且可以從該庫中編譯出若干二進制文件形式的樣例以供入門,本文參考項目說明,分享個人從軟件安裝到樣例使用的全過程。

如果后續計劃使用的Linux系統為Ubuntu,建議至少為Ubuntu 22。


一、HTTP3測試 in Ubuntu

1.1. 基本軟件

名稱操作
pkg-config >= 0.20sudo apt install pkg-config -y && pkg-config --version
autoconfsudo apt install autoconf -y
automakeautomake --version
autotools-devapt search autotools-dev
libev-devsudo apt install libev-dev
libtoolsudo apt install libtool -y
makesudo apt install make

1.2. gcc/g++

后續編譯ngtcp2的項目時,正常情況下會編譯出若干個可執行文件,但這要求g++能夠支持C++20的特性,否則在編譯時會提示如下信息:

在這里插入圖片描述
因此,gcc/g++的版本至少為v11。

1.2.1. Ubuntu22

Ubuntu22.4默認使用的gcc和g++版本為v11,可以通過apt安裝的最高版本為v12,但是需要額外操作以指定版本。

首先通過apt安裝gcc-12和g+±12:

sudo apt install gcc-12 g++-12 -y

此時可以通過gcc-12命令來使用v12版本的gcc,但是使用gcc命令時仍會提示找不到該命令或者使用的舊版本。

在這里插入圖片描述

將gcc-12添加到update-alternatives工具中,設置其為gcc的軟鏈接,同時設置從屬的g++:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 20 --slave /usr/bin/g++ g++ /usr/bin/g++-12

確認版本配置:

sudo update-alternatives --config gcc

此時即可通過gcc命令來使用gcc-12。

在這里插入圖片描述

1.2.2. Ubuntu20

Ubuntu20.4通過apt可安裝的gcc版本最高為v10,因此只能使用源碼安裝gcc12。

1.2.2.1. 必備庫
1.2.2.1.1. gmp

從官網(https://gmplib.org/download/gmp/)下載最新的源碼包:

wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz

解壓:

tar -xvf gmp-6.3.0.tar.xz

進入解壓后的文件夾:

cd gmp-6.3.0

編譯:

./configure
make -j16
sudo make install

返回上一級目錄:

cd ..
1.2.2.1.2. mpfr

從官網(https://www.mpfr.org/)下載最新的源碼包:

wget https://www.mpfr.org/mpfr-4.2.1/mpfr-4.2.1.tar.xz

解壓:

tar -xvf mpfr-4.2.1.tar.xz

進入解壓后的文件夾:

cd mpfr-4.2.1

編譯:

./configure
make -j16
sudo make install

返回上一級目錄:

cd ..
1.2.2.1.3. mpc

從官網(https://ftp.gnu.org/gnu/mpc/)下載最新的源碼包:

wget https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz

解壓:

tar -zxvf mpc-1.3.1.tar.gz

進入解壓后的文件夾:

cd mpc-1.3.1

編譯:

./configure
make -j16
sudo make install

返回上一級目錄:

cd ..
1.2.2.2. 安裝

從官網鏡像(http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/)下載v12的源碼包:

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-12.4.0/gcc-12.4.0.tar.gz

解壓:

tar -zxvf gcc-12.4.0.tar.gz

進入解壓后的文件夾:

cd gcc-12.4.0

編譯:

./configure --disable-multilib
make -j16
sudo make install

編譯完成后查看版本號:

gcc -v

返回上一級目錄:

cd ..

1.3. libev >= 4.11(備用)

如果不能apt安裝libev的版本不滿足要求,則可參考該方法。本節參考來源為Libev中文手冊。

1.3.1. 安裝

從官網下載源碼包:

wget https://libev.cn/downloads/libev-4.33.tar.gz

解壓:

tar -zxvf libev-4.33.tar.gz

進入解壓后的文件夾:

cd libev-4.33

編譯:

sh autogen.sh
./configure
make && sudo make install

1.3.2. 測試

返回上一級目錄:

cd ..

新建main.c文件:

vim main.c

內容如下:

#include <stdio.h>
#include <ev.h>static ev_idle idle;static void idle_cb(struct ev_loop* loop, ev_idle *idle, int revents) {puts("idle start.");ev_idle_stop(loop, idle);
}int main(int argc, char const *argv[])
{struct ev_loop* loop = EV_DEFAULT;// Register an idle event.ev_idle_init(&idle, idle_cb);ev_idle_start(loop, &idle);ev_run(loop, 0);return 0;
}

編譯main:

cc -o main main.c -L/usr/local/lib -I/usr/local/include/ -lev -Wl,-rpath,/usr/local/lib

運行main:

./main

輸出"idle start."證明安裝成功。

1.4. nghttp3

克隆源代碼倉庫:

git clone --recursive https://github.com/ngtcp2/nghttp3

進入源代碼目錄:

cd nghttp3

編譯:

autoreconf -i
./configure --prefix=$PWD/build --enable-lib-only
make -j$(nproc) check
make install

返回上一級目錄:

cd ..

1.5. ngtcp2 build with wolfSSL

1.5.1. wolfSSL >= 5.7.0

構建ngtcp2中的樣例文件需要至少一種TLS庫,這里使用的是wolfSSL。

克隆源代碼倉庫:

git clone --depth 1 -b v5.7.4-stable https://github.com/wolfSSL/wolfssl

進入源代碼目錄:

cd wolfssl

編譯:

autoreconf -i
./configure --prefix=$PWD/build --enable-all --enable-aesni --enable-harden --enable-keylog-export --disable-ech
make -j$(nproc)
make install

返回上一級目錄:

cd ..

1.5.2. ngtcp2

克隆源代碼倉庫(翻墻非必須):

git clone --recursive https://github.com/ngtcp2/ngtcp2

--recursive參數用于下載項目中的子項目。
ngtcp2需要兩個子項目:munit和urlparse,將分別下載到tests/和third-party/下。
在這里插入圖片描述urlparse也需要兩個子項目:munit和http-parser,將分別下載到主目錄下。
在這里插入圖片描述正常情況下,所有子模塊都應檢出:
在這里插入圖片描述在這里插入圖片描述如果任何一個子模塊下載失敗,例如:
在這里插入圖片描述解決方法是刪除已下載的項目:
rm -r -f ngtcp2
重新克隆源代碼倉庫,直到一切正常。

進入源代碼目錄:

cd ngtcp2

編譯:

autoreconf -i
./configure PKG_CONFIG_PATH=$PWD/../wolfssl/build/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig --with-wolfssl
make -j$(nproc) check

編譯成功后在examples中會多出兩個二進制文件wsslclient和wsslserver,它們使用HTTP/3。此外,還有兩個二進制文件h09wsslclient和h09wsslserver,它們使用HTTP/0.9。

./examples/wsslclient -h
./examples/wsslserver -h

如果運行wsslclient和wsslserver時出現如下問題:
error while loading shared libraries: libev.so.4: cannot open shared object file: No such file or directory
在這里插入圖片描述原因是在安裝libev時,默認安裝在/usr/local/lib中,而二進制文件在/usr/lib中找不到該庫。解決方案是重新編譯libev,指定安裝路徑:
cd ~/libev-4.33
sh autogen.sh
./configure --prefix=/usr
sudo make && sudo make install

1.5.3. 使用

1.5.3.1. server

進入wsslserver所在目錄:

cd ~/ngtcp2/examples

為服務端生成私鑰和證書:

openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 3650

啟動服務端:

./wsslserver 192.168.202.129 4433 server.key server.crt

之后服務端就會在對應端口監聽請求,注意輸出Using document root /home/csb2/ngtcp2/examples/,說明服務端是以當前目錄為文件的根目錄。

1.5.3.2. client

進入wsslclient所在目錄:

cd ~/ngtcp2/examples

啟動客戶端,下載由URL指定的文件:

./wsslclient --download=./ 192.168.202.129 4433 https://192.168.202.129:4433/clash.tar.gz

這里URI中的路徑是服務端根目錄的相對路徑。

1.6. ngtcp2 build with LibreSSL(可選)

這里使用LibreSSL庫而非wolfSSL。

1.6.1. LibreSSL

克隆源代碼倉庫(翻墻非必須):

git clone --depth 1 -b v4.0.0 https://github.com/libressl/portable.git libressl

進入源代碼目錄:

cd libressl

編譯:

export LIBRESSL_GIT_OPTIONS="-b libressl-v4.0.0" #必須,不然下一步會報錯
./autogen.sh
./configure --prefix=$PWD/build
make -j$(nproc) install

返回上一級目錄:

cd ..

1.6.2. ngtcp2

進入源代碼目錄:

cd ngtcp2

編譯:

autoreconf -i
./configure PKG_CONFIG_PATH=$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../libressl/build/lib/pkgconfig
make -j$(nproc) check

編譯成功后在examples中會多出兩個二進制文件qtlsclient和qtlsserver。

1.7. Wireshark

使用apt命令安裝Wireshark:

sudo add-apt-repository universe
sudo apt install wireshark

安裝過程中會詢問是否允許非超級用戶捕獲數據包,選擇yes。

將當前用戶添加到 wireshark 組:

sudo usermod -aG wireshark $(whoami)

在服務端所在的虛機上打開Wireshark,點擊“編輯-首選項”。

設置QUIC UDP端口為服務端啟動時的端口:

在這里插入圖片描述
設置TLS的(Pre)-Master-Secret log filename為examples中的sslkeylog.log:

在這里插入圖片描述

選擇正確的網絡接口(即,服務端IP所在的網卡),設置過濾器:

udp.port==4433

點擊“開始捕獲分組”即可抓包。


二、HTTP3測試 in CentOS8.5

名稱操作
pkg-config >= 0.20yum install pkg-config && pkg-config --version
autoconfyum install autoconf
automakeyum install automake
libtoolyum install libtool
makeyum install make
gcc-11 / g+±11yum install -y gcc-toolset-11 && source /opt/rh/gcc-toolset-11/enable && gcc -v
libev-dev詳見1.3節
nghttp3詳見1.4節
wolfSSL詳見1.5.1節
ngtcp2詳見1.5.2節

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73687.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp 在app上 字體如何不跟著系統字體大小變

在UniApp開發中&#xff0c;默認情況下App的字體可能會跟隨系統字體設置而變化。如果你希望保持固定的字體樣式&#xff0c;不隨系統字體設置改變&#xff0c;可以采用以下幾種方法&#xff1a; 方法一&#xff1a;全局CSS設置 在App.vue的樣式中添加以下CSS&#xff1a; /*…

跨域問題的解決方案

一、跨域問題的本質 1.1 同源策略的三要素 瀏覽器的同源策略&#xff08;Same-Origin Policy&#xff09;要求請求的 協議、域名、端口 完全一致&#xff0c;否則視為跨域&#xff1a; 協議不同&#xff1a;http 與 https域名不同&#xff1a;a.com 與 b.com端口不同&#x…

Linux 上使用 Docker 部署 Kafka 集群

在 Linux 上使用 Docker 部署 Kafka 集群的步驟如下 1. 準備工作 確保已安裝&#xff1a; Docker Docker Compose 2. 創建 Docker Compose 文件 (docker-compose.yml) version: 3.8services:zookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperports:- &quo…

【性能優化點滴】odygrd/quill 中一個簡單的標記位作用--降低 IO 次數

在 StreamSink 類中&#xff0c;成員變量 _write_occurred 的作用是 跟蹤自上次刷新&#xff08;Flush&#xff09;以來是否有寫入操作發生&#xff0c;其核心目的是 優化 I/O 性能。以下是詳細解析&#xff1a; _write_occurred 的作用 1. 避免不必要的刷新&#xff08;Flush…

Ubuntu Linux安裝PyQt5并配置Qt Designer

一 安裝 PyQt5 借助 apt 包管理器來安裝 PyQt5 及其相關的開發工具&#xff1a; sudo apt install python3-pyqt5 pyqt5-dev-tools 假如報錯&#xff0c; You might want to run apt --fix-broken install to correct these. 直接執行&#xff1a; sudo apt --fix-…

2025清華大學:DeepSeek教程全集(PDF+視頻精講,共10份).zip

一、資料列表 第一課&#xff1a;Deepseek基礎入門 第二課&#xff1a;DeepSeek賦能職場 第三課&#xff1a;普通人如何抓住DeepSeek紅利 第四課&#xff1a;讓科研像聊天一樣簡單 第五課&#xff1a;DeepSeek與AI幻覺 第六課&#xff1a;基于DeepSeek的AI音樂詞曲的創造法 第…

容器C++

string容器 string構造函數 #include<iostream> using namespace std; #include<string.h> void test01() {string s1;//默認構造const char* str "hello world";string s2(str);//傳入char*cout << "s2" << s2 << endl;s…

【2.項目管理】2.4 Gannt圖【甘特圖】

甘特圖&#xff08;Gantt&#xff09;深度解析與實踐指南 &#x1f4ca; 一、甘特圖基礎模板 項目進度表示例 工作編號工作名稱持續時間(月)項目進度&#xff08;周&#xff09;1需求分析3▓▓▓???????2設計建模3?▓▓▓??????3編碼開發3.5???▓▓▓▓??…

C++List模擬實現|細節|難點|易錯點|全面解析|類型轉換|

目錄 1.模擬代碼全部 2.四大塊代碼理解 1.最底層&#xff1a;ListNode部分 2.第二層&#xff1a;ListIterator部分 3.第三層&#xff1a;ReserveListIterator部分 4最終層&#xff1a;List 1.模擬代碼全部 using namespace std; template<class T> struct ListNode …

【深度學習與實戰】2.1、線性回歸模型與梯度下降法先導

import numpy as np# 數據準備 X np.array([1, 2, 3]) y np.array([3, 5, 7])# 參數初始化 w0, w1 0, 0 alpha 0.1 n len(X)# 迭代10次 for epoch in range(10):# 計算預測值y_pred w1 * X w0# 計算梯度grad_w0 (1/n) * np.sum(y_pred - y)grad_w1 (1/n) * np.sum((y_…

銳捷EWEB路由器 timeout.php任意文件上傳漏洞代碼審計(DVB-2025-9003)

免責聲明 僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 一:產品介紹 銳捷EWEB路由器是銳…

flask開發中設置Flask SQLAlchemy 的 db.Column 只存儲非負整數(即 0 或正整數)

如果你想控制一個 Flask SQLAlchemy 的 db.Column 只存儲非負整數&#xff08;即 0 或正整數&#xff09;&#xff0c;你可以在模型中使用驗證來確保這一點。一種常見的方法是使用模型的 validate 方法或者在執行插入或更新操作時進行檢查。 以下是實現這一目標的幾種方法&…

sqlmap 源碼閱讀與流程分析

0x01 前言 還是代碼功底太差&#xff0c;所以想嘗試閱讀 sqlmap 源碼一下&#xff0c;并且自己用 golang 重構&#xff0c;到后面會進行 ysoserial 的改寫&#xff1b;以及 xray 的重構&#xff0c;當然那個應該會很多參考 cel-go 項目 0x02 環境準備 sqlmap 的項目地址&…

vscode連接服務器失敗問題解決

文章目錄 問題描述原因分析解決方法徹底刪除VS Code重新安裝較老的版本 問題描述 vscode鏈接服務器時提示了下面問題&#xff1a; 原因分析 這是說明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…

企業網站源碼HTML成品網站與網頁代碼模板指南

在當今數字化時代&#xff0c;企業網站已成為展示品牌形象、吸引客戶和提供在線服務的重要工具。對于許多企業來說&#xff0c;使用現成的HTML網站源碼模板是快速搭建網站的高效方式。本文將詳細介紹企業網站源碼、HTML成品網站以及網頁代碼模板的相關內容&#xff0c;幫助你快…

計算機網絡 - OSI 七層模型

OSI 七層模型 OSI&#xff08;Open System Interconnection&#xff0c;開放系統互聯&#xff09;模型由 ISO&#xff08;國際標準化組織&#xff09; 制定&#xff0c;目的是為不同計算機網絡系統之間的通信提供一個標準化的框架。它將網絡通信劃分為 七個層次&#xff0c;每…

flutter-實現瀑布流布局及下拉刷新上拉加載更多

文章目錄 1. 效果預覽2. 結構分析3. 完整代碼4. 總結 1. 效果預覽 在 Flutter 應用開發中&#xff0c;瀑布流布局常用于展示圖片、商品列表等需要以不規則但整齊排列的內容。同時&#xff0c;下拉刷新和上拉加載更多功能&#xff0c;能夠極大提升用戶體驗&#xff0c;讓用戶方…

在 Ubuntu 下通過 Docker 部署 Nginx 服務器

1. Docker 和 Nginx 簡介以及實驗環境 Docker 是一個開源的容器化平臺&#xff0c;允許開發者將應用程序及其依賴項打包成一個輕量級的、可移植的容器。通過 Docker&#xff0c;開發者可以在任何支持 Docker 的環境中運行應用&#xff0c;從而實現一致的開發和生產環境。Docke…

IoT平臺實時監測機器人狀態的實現方案

通過IoT平臺實時監測機器人狀態的實現方案與可執行路徑 一、整體架構設計 #mermaid-svg-6xMlDfFSZM4Wc8tA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6xMlDfFSZM4Wc8tA .error-icon{fill:#552222;}#mermaid-sv…

mybatis里in關鍵字拼接id問題

我們一般會把ids集合用StrUtil.join(‘,’)轉成"1,2,3"這種形式 然后放入in中 我們會這么寫: select id, nick_name, icon from tb_user where id in (#{ids}) order by FIELD(id, #{ids})結果發現sql執行是這樣的: select id, nick_name, icon from tb_user where…