使用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.mzph.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…