Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >HTTP/3 初体验

HTTP/3 初体验

作者头像
李俊鹏
发布于 2020-06-15 08:20:58
发布于 2020-06-15 08:20:58
2.1K0
举报
文章被收录于专栏:运维研习社运维研习社

HTTP协议经过发展,目前HTTP2.0作为主流HTTP协议,已经得到一定普及,虽然国内仍然有很多连HTTPS都没上的网站,但不影响HTTP协议的发展。

HTTP2.0我们知道相较于HTTP1.1版本的协议,进行了很多的优化,现在HTTP-over-QUIC出了也有一段时间了,虽然还是实验性协议,但是IETF HTTP和QUIC工作组主席Mark Nottingham正式提出将HTTP-over-QUIC重命名为HTTP/3.0到现在已经有一年多的时间了,所以HTTP-over-QUIC成为HTTP/3.0算是没跑了,所以还是早点认识一下这个新版本的协议

QUIC全名是(Quick UDP Internet Connections),它是google在2013年开发实现的

我们都知道,TCP和UDP最本质的区别在于可靠传输,HTTP2.0及之前的协议建立在TCP上,TCP为了达到可靠传输,必须要有确认机制,需要来回握手确认来建立链接,即便HTTP2.0中做了很多优化,但仍然摆脱不了TCP的三次握手,而且TCP协议在处理包时是有严格顺序的,当其中一个数据包遇到问题时,TCP链接需要等待整个包重传之后才能继续进行,虽然HTTP2.0中通过多个stream,使得逻辑上一个TCP链接上的并行内容,进行多路数据传输,然而这中间没有关联的数据,当stream2的帧没有收到,后面stream1的帧也会因此阻塞

所以google在QUIC协议中基于UDP协议,跳出TCP协议,它是在两个端点之间创建链接,且支持多路复用,并且在设计之初就考虑希望能够提供等同于SSL/TLS层级的安全保障的同时,减少数据传输及创建链接时的延迟时间,双向控制带宽,从而达到更快速的体验,先通过一个动图直观对比下

接着看下QUIC有什么优势,已经通过什么方法解决TCP的一些限制及问题

新定义连接机制

在TCP连接中,一条TCP连接是由四元组标识的,分别是源IP、源端口、目的IP、目的端口,一旦一个元素发生变化时,就会断开重连,重新进行三次握手,导致一定的延时

在基于UDP的QUIC中,是在自己的逻辑里面维护连接的机制,不再是以四元组标识,而是以一个64位的随机数作为ID来标识,而且UDP是无连接的,所以当IP或端口变化的时候,只要ID不变,就不需要重新建立连接

新定义重传机制

在TCP连接中,为了保证可靠性,通过使用序号和应答机制,来解决顺序问题和丢包问题,如上面说到的,即便HTTP2.0使用stream的方式,也还是存在阻塞的问题

在TCP中,任何一个序号的包发过去,都要在一定时间内得到应答,超时之后,就会触发重传,重新发送这个序号的包,而RTO(重传超时时间)的计算相对复杂,现在都是通过自适应算法设定RTO的值,而这个计算的不准确会直接导致网络的吞吐量和网络资源利用率

在QUIC中,也有个序列号PN(Packet Number),是递增的,任何一个序列号的包,只发送一次,下次就要加1,根据Packet Number值就可以计算出是重传响应还是原始响应,这样可以准确计算RTT时间

但是有一个问题,就是UDP无连接,所以没法确认两个包是否是同样的内容,也就是没有办法确定发送出去的包是不是重传包,QUIC虽然基于UDP,但它也是一个可靠数据传输协议,所以QUIC又定义了一个offset概念,在发送的数据流里面有个偏移量offset,可以通过offset查看数据发送到了哪里,这样只有这个offset的包没有来,就要重发,如果来了,按照offset拼接成一个完整的数据流

对于重传,QUIC有个特性就是关键包短时间内发送多次,这样以确保重要的节点不被Delay

没有HOL的多路复用

QUIC的多路复用和HTTP2类似,在一条QUIC连接上可以并发发送多个HTTP请求,但是QUIC的多路复用比HTTP2有一个很大的优势,那就是QUIC一个连接上的多个stream之间没有依赖,这样,假如stream2丢了一个udp packet,也只会影响stream2的处理,不会影响stream2之前以及之后的stream的处理,这就很大程度上缓解了HOL阻塞的问题

当然并不是所有的QUIC数据丢失都不会受到HOL阻塞影响,比如QUIC使用Hpack压缩算法的时候,由于算法的限制,丢失一个头部数据时,可能遇到HOL阻塞

流量控制

UDP没有流量控制机制,由于QUIC的多路复用机制,其流量控制分为Stream和Connection两种级别的控制

Stream就可以理解为一条HTTP请求

Connection可以理解为一条TCP连接

具体的实现机制是

  • 通过window_update帧告诉对端自己可以接收的字节数,这样发送方就不会发送超过这个数量的数据
  • 通过BlockFrame告诉对端由于流量控制被阻塞了,无法发送数据

QUIC的流量控制和TCP的有点区别,TCP是使用了滑动窗口机制来进行流量控制,为了保证可靠性,窗口左边沿向右滑动的长度取决于已经确认的字节数,如果中间出现丢包,就算接收到了更大序列号的Segment,窗口也无法超过这个序列号,但是QUIC不同,就算此前有些Packet没有接收到,它的滑动只取决于接收到的最大偏移字节数

对于Connection级别的流量窗口,其接收窗口大小就是各个stream接收窗口大小之和

而在Connection中,不同的stream互相独立,不会引起HOL阻塞

所以在弱网环境下,QUIC优势更明显

HTTP/3.0综上所述,有这么多优点,必须要体验一下,下面介绍下Nginx支持HTTP/3.0

Nginx原生不支持HTTP/3.0,这里需要借助Cloudflare提供的一个补丁来让Nginx支持HTTP/3.0

这里因为要补丁编译安装,所以需要下载nginx源码包,我这里仍然用nginx1.17.7版本来测试,下载包解压包就不说了

接着通过git下载QUIC补丁

然后因为要用patch打补丁,所有通过yum安装patch

接着就开始打补丁

这里只有nginx1.16的补丁,我也不确定,看着是打上了,编译试一下

重要的是with-http_v3_module、openssl用quiche/deps下面的boringssl,另外就是--with-quiche指向quiche目录

接着make,这里因为没有cmake报了个错误,通过yum安装cmake3,

注意要用cmake3.0以上版本,所以用yum install cmake3,这个要开启epel源

然后重新make,这里还需要安装gcc-c++,cargo、golang环境,否则在编译boringssl的时候会报错,编译不过去

接着是漫长的等待,如果服务器性能好的话,可以用make -j加速编译

在后面使用cargo编译的时候,因为默认是creates.io的仓库,实在太慢了,所以这里建议更换为中科大的源,在/root/.cargo下面新建config文件,内容如下:

更多cargo的可以查看cargo中文社区

另外就是编译boringssl的时候,编译出的库为静态库,最后ld链接的时候无法连接,需要在nginx编译之后生成的objs/Makefile中修改cmake编译参数,设置为-fPIC,生成共享库,否则编译失败

之后即可编译成功

在objs下面将nginx二进制文件覆盖掉原来的nginx,开始配置nginx配置文件

在quiche中通过cargo构建客户端,通过http3-client测试请求

客户端请求

请求日志查看

抓包查看

如果是chrome浏览器开启QUIC

需要重启chrome才能生效

当然如果不想像我一样折腾,直接用docker就可以体验了

docker run -it -p 443:443 -p 443:443/udp \ -v $PWD/nginx.conf:/usr/local/nginx/conf/nginx.conf \ -v /root/cert/haid.com.cn.pem:/etc/ssl/certs/server.crt \ -v /root/cert/haid.com.cn.key:/etc/ssl/private/server.key \ nwtgck/nginx-http3

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Http3基础
http2.0的出现确实给互联网带来了很多的好处,相比于http1.0已经好很多很多了。
epoos
2022/06/06
4850
Http3基础
「知识拾遗」 http2/http3总结
在HTTP1.1的协议中,我们传输的request和response都是基本于文本的,这样就会引发一个问题:所有的数据必须按顺序传输,比如需要传输:hello world,只能从h到d一个一个的传输,不能并行传输,因为接收端并不知道这些字符的顺序,所以并行传输在HTTP1.1是不能实现的。
winty
2019/12/20
2K0
HTTP探索之路 - HTTP 1 / HTTP 2 / QUIC
从1989年万维网(www)诞生,HTTP(HyperText Transfer Protocol)经历了众多版本迭代,WebSocket也在期间萌芽。1991年HTTP/0.9被发明;1996年出现了HTTP/1.0;2015年HTTP/2正式发布;2020年HTTP/3或能正式使用。以下将会简单介绍。 一、HTTP 1.1 与 HTTP 2 1.1 HTTP 1.1 的缺陷 高延迟 — 队头阻塞(Head-Of-Line Blocking) 无状态特性 — 阻碍交互 明文传输 — 不安全
用户1097444
2022/06/29
7950
HTTP探索之路 - HTTP 1 / HTTP 2 / QUIC
一文读懂 HTTP/1HTTP/2HTTP/3
作者:charryhuang,腾讯 CSIG 前端开发工程师 从 1989 年万维网(www)诞生,HTTP(HyperText Transfer Protocol)经历了众多版本迭代,WebSocket 也在期间萌芽。1991 年 HTTP0.9 被发明。1996 年出现了 HTTP1.0。2015 年 HTTP2 正式发布。2020 年 HTTP3 或能正式使用。以下将会简单介绍。 HTTP1.1 与 HTTP2 HTTP1.1 的缺陷 高延迟 — 队头阻塞(Head-Of-Line Blocki
腾讯技术工程官方号
2020/02/10
1.4K0
一文读懂 HTTP/1HTTP/2HTTP/3
未来可期的HTTP/3
2015 年 HTTP/2 标准发表后,大多数主流浏览器也于当年年底支持该标准。此后,凭借着多路复用、头部压缩、服务器推送等优势,HTTP/2 得到了越来越多开发者的青睐,不知不觉的 HTTP 已经发展到了第三代。本文基于兴趣部落接入 HTTP/3 的实践,聊一聊 HTTP/3 的原理以及业务接入的方式。
Nealyang
2020/06/04
5790
未来可期的HTTP/3
前端网络高级篇(七)协议篇
HTTP连接在很长一段时间有都是基于TCP的。 HTTP1.0中,没发起一次HTTP请求,就要经历一次TCP三次握手,四次挥手的连接过程。
娜姐
2022/04/24
3200
前端网络高级篇(七)协议篇
Quic学习心得
首先看quic的全称是(Quick UDP Internet Connections),一种快速的UDP网络连接。由此可知quic是以UDP协议为基础的快速的网络传输协议。
陌无崖
2020/07/27
1.2K0
二、《图解HTTP》- HTTP协议历史发展(重点)
这一章节基本上大部分为个人扩展,因为书中的内容讲的实在是比较浅。本文内容非常长,另外哪怕这么长也只是讲到了HTTP协议的一部分而已,HTTP协议本身十分复杂。
阿东
2022/08/12
6490
二、《图解HTTP》- HTTP协议历史发展(重点)
HTTP协议以及基于UDP实现可靠的协议QUIC
在这段时间内花了两个月重学了一遍数据结构,然后在leetcode上刷了一百多道题。
Liusy
2022/01/11
1K0
HTTP协议以及基于UDP实现可靠的协议QUIC
QUIC:下一代通信协议
一. 前言 自 2015 年以来,QUIC 协议开始在 IETF 进行标准化并被国内外各大厂商相继落地。 鉴于 QUIC 具备“0RTT 建连”、“支持连接迁移”等诸多优势,即将成为下一代互联网协议。 阅读完本文你将了解和学习到: HTTP协议发展史 HTTP各版本存在的问题,以及各版本解决了哪些问题 QUIC协议特性 再也不怕面试官问HTTP相关的问题了! 行文思路: 从历史使用最广泛的HTTP1.1开始,介绍各版本存在的问题,以及新版本如何解决旧版本存在的问题 二. HTTP协议发展史 HTTP
QQ音乐前端团队
2021/11/22
1K0
HTTP/3 原理实战
作者:billpchen,腾讯看点前端开发工程师 2015 年 HTTP/2 标准发表后,大多数主流浏览器也于当年年底支持该标准。此后,凭借着多路复用、头部压缩、服务器推送等优势,HTTP/2 得到了越来越多开发者的青睐。不知不觉的 HTTP 已经发展到了第三代,鹅厂也紧跟技术潮流,很多项目也在逐渐使用 HTTP/3。本文基于兴趣部落接入 HTTP/3 的实践,聊一聊 HTTP/3 的原理以及业务接入的方式。 1. HTTP/3 原理 1.1 HTTP 历史 在介绍 HTTP/3 之前,我们先简单看下
腾讯技术工程官方号
2020/05/27
1.8K0
HTTP1.0、1.1、2.0、3.0的区别
才疏学浅的木子
2023/10/17
3390
HTTP1.0、1.1、2.0、3.0的区别
HTTP3 RFC 9114 发布,深入剖析HTTP3协议
HTTP3是在保持QUIC稳定性的同事使用UDP来实现高速度, 同时又不会牺牲TLS的安全性.
肉眼品世界
2022/06/15
1.1K0
HTTP3 RFC 9114 发布,深入剖析HTTP3协议
网络协议 12 - HTTP 协议:常用而不简单
    网络协议五层通天路,咱们从物理层、到链路层、网络层、再到传输层,现在又进一步,来到了应用层。这也是我们五层协议里最上面的一层,关于应用层,有太多协议要了解。但要说最有名的,那肯定就是 HTTP 了。
北国风光
2019/04/11
6840
网络协议 12 - HTTP 协议:常用而不简单
HTTP/3来了!存续二十多年的TCP协议最终被抛弃!
6 月 6 日,IETF QUIC 和 HTTP 工作组成员 Robin Marx 宣布,经过 5 年的努力,HTTP/3 被标准化为 RFC 9114,这是 HTTP 超文本传输协议的第三个主要版本。同时,HTTP/2 也更新为 RFC 9113标准,HTTP/1.1 和通用 HTTP 语义和缓存概念在 RFC 9110-9112 中也得到了加强。 TCP 是 Internet 上使用和部署最广泛的协议之一,多年来一直被视为网络基石,随着HTTP/3正式被标准化,QUIC协议成功“上位”,UDP“取代”T
SDNLAB
2022/07/19
1.1K0
HTTP/3来了!存续二十多年的TCP协议最终被抛弃!
HTTP/3发布了,我们来谈谈HTTP/3
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/17
6750
HTTP/3发布了,我们来谈谈HTTP/3
科普:QUIC 协议原理分析
本文将主要介绍 QUIC 协议产生的背景和核心特性。
腾讯技术工程官方号
2018/01/10
9.1K1
科普:QUIC 协议原理分析
图解 | 为什么 HTTP 3.0 使用 UDP 协议
新的一周又开始了,大白和小黑是同事,平时俩人一起喝酒吃肉打游戏居多,当然有时候也讨论下学术和前沿技术。
cxuan
2020/09/22
2K0
图解 | 为什么 HTTP 3.0 使用 UDP 协议
天下武功,唯'QUICK'不破,探究QUIC的五大特性及外网表现
QUIC简介 QUIC(Quick UDP Internet Connections)是谷歌提出的一种传输协议,由于其建立在UDP之上,使得相对于TCP之上的SPDY、HTTP2等其他协议,QUIC的可定制和优化的空间更大.在UDP的上层,QUIC提供了可靠、有序、安全、而且更快速的传输服务.目前,在Chrome中有85%以上关于谷歌自有业务的请求响应都是通过QUIC承载,可以说QUIC已经经受住了真实复杂外网环境的考验。因其理论特性及较好的外网表现,HTTP3协议也将以QUIC为原型进行草案。 谷
腾讯移动品质中心TMQ
2019/08/15
1.4K0
天下武功,唯'QUICK'不破,探究QUIC的五大特性及外网表现
视屏面试传输协议到底是TCP还是UDP
又是一年一度的秋季校招开始了,以往的校招各个公司都会在公司现场或者学校现场安排学生进行现场面试?但是今年由于疫情的原因,不允许让同学在现场进行一个面试,所以今年的面试形式就从线下转到了线上,面试形式的转变,但是我们考核学生的方式依旧没有转变。
用户5397975
2020/09/01
2.9K0
视屏面试传输协议到底是TCP还是UDP
相关推荐
Http3基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 腾讯技术创作特训营