quic原理
1、quic优点
1)建联延迟低,基于UDP协议,低延迟建联1RTT(首次)或者0RTT,对比于HTTPS需要3RTT(TCP握手1.5RTT+TLS握手1.5RTT),在首包指标方面优势非常大
2)多路复用,类似于HTTP2的多路复用,但因为基于UDP协议,不存在队头阻塞问题,会比HTTP2效果更好
2、quic建联原理(怎么实现1RTT和0RTT)
所用算法:DH 算法,大概意思是,通讯双方可以用自己的私钥和对方的公钥算出密钥K,且是一样的,所以只要知道对方的公钥就能完成加密建联
建联过程:
0. server 生成一个质数 p和一个整数 g,其中 g是 p 的一个生成元,同时随机生成一个数Ks_pri 作为私钥,并通过g、p、Ks_pri计算出公钥Ks_pub,将 {g、p、Ks_pub} 三元组打包成 config,等待 client 连接
1. client 首次发起连接,简单发送 client hello给 server
2. server 将已经生成好的config 返回给 client
3. client 随机生成一个数 Kc_pri作为自己的私钥,并根据config中的 p 和 g计算出公钥得出Kc_pub
4. client 计算通信使用的密钥 K=算法(Kc_pri,Ks_pub})
5. client 用 K加密需要发送的业务数据,并带上自己的公钥Kc_pub 一起发送给 server
6. server 计算 K=算法(Ks_pri ,Kc_pub),根据笛福赫尔曼密钥交换的原理可以证明两端计算的 K是一样的
首次建联是1、2、3步(从第4步开始,客户端已经使用密钥加密传数据了),所以只花费1个RTT
第2次建联,因为client端已经保存了config配置,所以可以直接从第3步开始,所以建联花费0RTT(就是不需要建联了)
quic测试
1、测试工具
quic_client 是google的quiche库中的测试工具
常用选项介绍
--disable_port_changes : 禁止切换端口,可以用于测试链接迁移
--drop_response_body : 丢弃响应体
--host : 指定要连接的IP或者主机名
--num_requests : 发送的请求数量
--one_connection_per_request : 每个请求完成后关闭连接,可以用来测试 0-RTT
--port : 指定连接的目的端口
--quic_version : 指定quic版本 (Q043、Q046、Q050、H3-29、H3),一般alt-svc响应头会带服务端支持的quic版本
2、常用测试方法
1)quic版本支持测试
通过--quic_version参数,测试quic版本,gquic版本有:Q043、Q046、Q050,iquic版本有h3、h3-29,,一般alt-svc响应头会带服务端支持的quic版本
quic_client --drop_response_body --host=125.64.6.52 --port=443 --num_requests=1 --quic_version=h3 "url"
2)0RTT测试
添加 --one_connection_per_request 参数,发送两个请求(--num_requests=2),两个请求都成功,则测试成功。
quic_client --drop_response_body --host=125.64.6.52 --port=443 --num_requests=2 --quic_version=h3 --one_connection_per_request "url"
3)连接迁移功能
修改请求数量 --num_requests=2 , 两个请求都成功,则支持连接迁移。
quic_client --drop_response_body --host=125.64.6.52 --port=443 --num_requests=2 --quic_version=h3 "url"