【转帖】如何看待 HTTP/3 ?
如何看待 HTTP/3 ?
https://mp.weixin.qq.com/s/fC10Cyj6xjjwOCnqxX-Dvg 车小胖的公众号 转帖学习一下。
互联网通信发展史其实是人类与RTT斗争的历史,详情请继续阅读下文。
为了更好理解文章,需要解释一下什么是RTT?
RTT是Round Trip Time的缩写,通俗地说,就是通信一来一回的时间。
TCP建立连接时间
最早大家使用TCP来运输HTTP,TCP想必大家很熟悉了,需要三次握手,建立了TCP虚拟通道,那么这三次握手需要几个RTT时间呢?
一去 (SYN)
二回 (SYN+ACK)
三去 (ACK)
相当于一个半来回,故TCP连接的时间 = 1.5 RTT 。
HTTP交易时间
这意味着,用户在浏览器里输入的网址URL,直到时间流逝了1.5RTT之后,TCP才开始运输HTTP Request,浏览器收到服务器的HTTP Response,又要等待的时间为:
一去(HTTP Request)
二回 (HTTP Responses)
故HTTP的交易时间 = 1 RTT
那么基于TCP传输的HTTP通信,一共花费的时间总和:
HTTP通信时间总和 = TCP连接时间 + HTTP交易时间 = 1.5 RTT + 1 RTT = 2.5 RTT
安全加密通信
随着互联网的爆发式增长,人类发现完全明文传输的HTTP通信很不安全。做为OSI七层参考模型的现实实现的TCP/IP协议,在设计之初没有考虑安全加密的环节。
互联网先驱Netscape公司,创造性发明了SSL(Secure Socket Layer),SSL位于TCP与HTTP之间,做为HTTP的安全供应商,全权负责HTTP的安全加密工作。
IP / TCP / SSL / [HTTP]
各个通信模块之间的站位如上所示,将HTTP用[ ]括起来,表示HTTP被SSL安全加密了。
随着SSL的名气攀升,互联网标准化组织IETF,觉得SSL是一个好东西,就拿来用了。
但SSL最初只是用于加密HTTP的,IETF觉得这是一个硬伤,为什么不能用来做为所有应用层协议的安全供应商呢?来传输邮件、文件、新闻等等。实现这一点很简单,只要在协议里增加一个Application Protocol 类型字段。
在Application Protocol 有一个类型是“IP”, 意味着TLS不仅可以运输应用层协议如HTTP、FTP,还可以运输IP,这就是Cisco Any Connect的应用场景。
TLS (Transport Layer Security)
于是,IETF在SSL 3.0版本的基础上,重新设计并命名了这个协议,其全新的名字为TLS,最初的版本为1.0版本。从其名字就可以看出,其核心使命就是保证传输层的安全。各个通信部门成员的占位与SSL占位一致:
IP / TCP / TLS / [HTTP]
到目前为止,浏览器支持的TLS版本为TLS 1.0、1.1、1.2,当然版本越高越成熟、越安全。
HTTPS
通常将TLS安全保护的HTTP通信,称之为HTTPS,以区别于没有TLS安全防护的HTTP明文通信。
交待了上文的背景知识,还是要回到本文的主题,来看看自从引入了TLS安全防护,看看HTTPS通信的RTT增加到了多少?
TLS 1.2
以1.2 版本为例,看看HTTPS通信一共要消耗几个RTT时间?
1. 浏览器给服务器发送的Client Hello消息(一去)
首长好,我支持1.2版本,加密套件列表1、2、3…,以及我的随机码N1,请出示您的证件。
2. 服务器给浏览器发送的Server Hello消息(二回)
同志们好,那就1.2版本通信吧,加密套件我选用1,我的随机码N2,ECDHE密钥交换素材2,这是我的证件。
同志们辛苦了!
3. 浏览器给服务器发送的Key Exchange消息(三去)
为人民服务! 嘴里虽这么说着,私下还要偷偷验证首长的证件是否伪造的。
首长证书验证成功之后,还要给首长会话呢?会话内容如下:
首长辛苦了! 我的ECDHE密钥交换素材1,接下来我发给您的消息都要加密了(Change Spec)。
从这以后,双方的HTTP通信将使用TLS加密了。一共花费了1.5个RTT时间。
让我们来计算一下整个HTTPS通信花费的时间总和:
HTTPS通信时间总和 = TCP连接时间 + TLS 连接时间 + HTTP交易时间 = 1.5 RTT + 1.5 RTT + 1 RTT = 4 RTT
如果浏览器与服务器物理距离很近,RTT < 10 ms,即使4 RTT最大也不过40 ms的时间,用户压根感觉不到慢。
如果浏览器与服务器相隔上万公里,一个RTT时间通常在200ms以上,4RTT时间通常在1秒以上,用户会明显感觉到网速慢了。
HTTP 1.x
和很多人想象不一样的是,浏览器从服务器获取的一个页面,通常由很多资源链接所组成。
服务器给浏览器推送的第一个页面,页面里通常嵌入了图片资源文本链接、以及动态页面资源链接、或第三方网站的链接资源,还需要浏览器根据这些文本链接内容,去链接所对应的服务器,继续下载链接所对应的内容。
浏览器通常采用的流程是,重新建立一个TCP连接、TLS连接、HTTP交易。
这又是一个漫长的4RTT等待过程,用户看到浏览器完整页面的时间为
完整页面加载时间 = 4RTT *2 = 8RTT
HTTP /2
自然有人会问,既然第一次页面与第二次页面都是同一个网站服务器,为何第二次页面要重新建立一个TCP连接,一个TLS连接?
如果重用第一个TCP连接,那么就少了1.5 RTT + 1.5 RTT = 3 RTT的时间。
这是一个好主意,就是用户的多个HTTP Request请求,使用同一个逻辑通道进行运输,这样会大大减少重新建立连接所花费的时间。
但是,这样会带来一个副作用,多个HTTP流使用同一个TCP连接,遵守同一个流量状态控制。只要第一个HTTP流遭遇到拥塞,剩下的HTTP流压根没法发出去,这就是头部阻塞(Head of line Blocking)。
既然TCP不好用,那为何要吊死在TCP这一棵树上呢?
外面的世界很精彩,到外面的世界逛逛。
QUIC(Quick UDP Internet Connection)
逛下来的感受是,UDP不需要连接,不会带来附加的RTT时间,UDP是一个好的合伙人被HTTP /2拉上了贼船,各合伙人的占位如下:
IP / UDP / QUIC
这个就是Google开发QUIC协议,QUIC协议集成了TCP可靠传输机制、TLS安全加密、HTTP /2 流量复用技术,其页面的加载时间为2.5 RTT时间。
此外,完成QUIC交易的连接的Session ID会缓存在浏览器内存里,如果用户再次打开该页面,无需建立TLS连接,直接使用缓存Session ID 对应的加密参数,服务器可以根据Session ID在缓存里查找对应的加密参数,并完成加密。
换句话说,重连TLS连接是一个0 RTT 事件,用户所要等待的页面加载事件 = HTTP交易事件 = 1 RTT。
HTTP /3
这一次IETF又觉得QUIC是一个好东西,但是希望QUIC不仅可以运输HTTP,还可以运输其它协议,把QUIC与HTTP分离,最终各合伙人的占位如下所示:
IP / UDP / QUIC / HTTP
这样整体的页面加载时间为2 RTT。
TLS 1.3
IETF的QUIC标准集成了TLS 1.3版本,1.3版本更简练,建立TLS连接不再需要1.5 RTT,而只需要1 RTT,是因为浏览器第一次就把自己的密钥交换的素材发给服务器,这样就节省了第三次消息,少了0.5个RTT时间。
页面的整体加载时间 = TLS 1.3连接时间 + HTTP交易时间 = 1RTT + 1RTT = 2 RTT
重连页面的加载时间 = HTTP交易时间 = 1 RTT
上文协议的进化过程就是人类与RTT斗争史,目标是减少用户等待页面加载时间、同时保证用户看到的页面安全,没有在传输过程中被偷窥、篡改。
HTTP /3所带来的挑战
99%+以上的手机移动终端、电脑终端,都使用私有IP,都需要NAT设备来完成私有IP与全球IP的转换。这意味着NAT设备通常会记忆用户的通信状态,一旦用户完成了通信,NAT设备会释放这些记忆。
对于基于TCP的HTTP、HTTPS传输,NAT设备可以根据TCP报文头的SYN / FIN状态位,知道通信什么时候开始,什么时候结束,对应记忆的开始、记忆的结束。
但是基于UDP传输的HTTP/3,NAT设备收到流量会知道连接什么时候开始,但是却无法知道流量什么时候结束。
NAT设备的记忆如果短于用户会话时间,则用户会话会中断。
NAT设备的记忆如果大大长于用户会话时间,则意味着NAT设备的端口资源会白白被占用!
最直接的解决方案是,在QUIC的头部模仿TCP的SYN/FIN状态,让沿途的NAT设备知道会话什么时候开始、什么时候结束。但这需要升级全球所有的NAT设备的软件!
另外一个可行的方案是,让QUIC周期性地发送Keepalive消息,刷新NAT设备的记忆,避免NAT设备释放自己的记忆
为何HTTP/3不直接站在IP身上,而是站在UDP身上?
可以少8个字节的UDP头部开销不是很好嘛?
上文已经说了,全球的通信终端绝大多数位于NAT的身后,地球上任何NAT产品都支持TCP/UDP运输的货物,即可以根据端口号来识别不同的终端、不同终端的会话。
如果QUIC站在IP身上,如下所示:
IP /QUIC / HTTP
QUIC并没有端口号,意味着每一个NAT设备只能记忆一个终端的会话,一个全球IP 与一个私有IP的一一映射。
那将意味着NAT设备后只能有一个会话可以访问同一个服务器的页面,这肯定是无法接受的!
【转帖】如何看待 HTTP/3 ?的更多相关文章
- RednaxelaFX写的文章/回答的导航帖
https://www.zhihu.com/people/rednaxelafx/answers http://hllvm.group.iteye.com/group/topic/44381#post ...
- nginx负载均衡基于ip_hash的session粘帖
nginx负载均衡基于ip_hash的session粘帖 nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除 ...
- [转帖]网络协议封封封之Panabit配置文档
原帖地址:http://myhat.blog.51cto.com/391263/322378
- [转帖]零投入用panabit享受万元流控设备——搭建篇
原帖地址:http://net.it168.com/a2009/0505/274/000000274918.shtml 你想合理高效的管理内网流量吗?你想针对各个非法网络应用与服务进行合理限制吗?你是 ...
- 3d数学总结帖
3d数学总结帖,以下是对3d学习过程中数学知识的简单总结 角度值和弧度制的互转 Deg2Rad 角度A1转弧度A2 => A2=A1*PI/180 Rad2Deg 弧度A2转换角度A1 => ...
- [转帖]The Lambda Calculus for Absolute Dummies (like myself)
Monday, May 7, 2012 The Lambda Calculus for Absolute Dummies (like myself) If there is one highly ...
- [转帖]FPGA开发工具汇总
原帖:http://blog.chinaaet.com/yocan/p/5100017074 ----------------------------------------------------- ...
- 你用过这种奇葩的C#注释吗?如何看待
本人虽然不是专业开发人员,也非专业出身,但一直使用C#堆码,解决自己日常的小问题.包括自己的研究,也是用C#来实现和测试.对C#是情有独钟.虽然C#的很多高级技术不会用,也不太懂,但总归是知道,耳闻目 ...
- [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能
感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...
随机推荐
- 【leetcode】1273. Delete Tree Nodes
题目如下: A tree rooted at node 0 is given as follows: The number of nodes is nodes; The value of the i- ...
- Python 面向对象Ⅴ
基础重载方法 下表列出了一些通用的功能,你可以在自己的类重写: 运算符重载 Python同样支持运算符重载,实例如下: 以上代码执行结果如下所示: 类属性与方法 类的私有属性 __private_at ...
- 第二篇【Zabbix客户端的完整布署】
关于Zabbix服务端布署请查看 1.上传zabbix安装包(源码包默认(Server和Agent是一起的)) [root@sms-v2 ~]# ll /root/ -rw-r--r-- root r ...
- 【传输管理③】Client集团间的传输(例:开发环境300→310,300→320)
之前有提到: 每个环境可能有若干个Client(客户端/集团),且每个Client用途都不一样. 如下图所示,开发环境就有300,310和320三个Client. 假设开发人员在Client300中新 ...
- Mybatis-Plus的BaseMapper的用法
1.如何使用BaseMapper进行数据库的操作. 2.使用BaseMapper进行插入实体时如何让UUID的主键自动生成. Student实体类,其中id属性主键为UUID package com. ...
- [洛谷P1501] [国家集训队]Tree II(LCT模板)
传送门 这是一道LCT的板子题,说白了就是在LCT上支持线段树2的操作. 所以我只是来存一个板子,并不会讲什么(再说我也不会,只能误人子弟2333). 不过代码里的注释可以参考一下. Code #in ...
- 高性能JavaScript之加载和执行
JS在浏览器中的性能,可以认为是开发者所面临的最重要的可行性问题.这个问题因JS的阻塞特性变得复杂,也就是说当浏览器在执行JS代码时,不能同时做其他任何事情.事实上,大多数浏览器都使用单一进程来处理U ...
- LeetCode 15. 三数之和(3Sum)
题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...
- vue-preview 缩略图
如果我们在 vue 中想使用缩略图的话,可以使用 vue-preview 的插件 小图的缩略 大图的样式 使用方法:vue-preview 下 载: npm i vue-preview 使用方法 ...
- 阶段3 2.Spring_08.面向切面编程 AOP_6 四种常用通知类型
新建项目 复制上节课的pom.xml内的代码 复制java下的代码 测试类也复制过来 配置文件也拷贝过来 logge下增加几个方法 测试方法只需要一个saveAccount方法就可以了 增加其他三种通 ...