网络通信 频道

五分钟技术趣谈 | HTTP演进史

  Part 01

  协议简介

  HTTP协议是当今最流行的一种网络协议,在日常生活中随处可见,无论使用手机、电脑还是其它终端设备,windows、IOS或是Android,浏览器或是APP,这背后的网络通讯都离不开它。HTTP采用客户端-服务端之间请求和应答的架构设计,是一种能够获取如 HTML这样的网络资源的通讯协议,是在 Web 上进行数据交换的基础。

  Part 02

  发展历程

  HTTP协议自1989年被英国工程师和计算机科学家蒂姆·伯纳斯·李提出后,至今经历30多年的演进,形成了五个主要版本,如下图所示:

  2.1 HTTP/0.9

  作为鼻祖版本,奠定了协议的核心内容,如确定了客户端-服务端交互的架构,域名:端口来确定目标地址,还有回车换行作为基本的分隔符等。

  0.9版本功能上只相当于后续版本的一个小小子集,不支持Header,仅支持GET方法,服务器只能回应HTML格式的字符串,不能响应别的格式。具有典型的无状态性,每个访问都独立处理,处理完成后就会关闭TCP连接。

  2.2 HTTP/1.0

  1.0版本在0.9版本基础上做了大量的扩展,增加了POST和HEAD方法,引入了请求头、返回码,还支持了多字符集和多行请求,传输不仅仅局限于文本能力,如图像、视频、二进制文件。可谓是麻雀虽小五脏俱全,是第一个具备广泛实际应用价值的协议版本。

  1.0版本与0.9版本存在相同的缺陷,由于都是无状态连接,建立的TCP连接不能被复用,并且前一个请求响应到达之后下一个请求才能发送,容易造成队头阻塞影响性能。

  2.3 HTTP/1.1

  1.1版本在1.0版本上做了功能扩展以及传输性能的优化。

  功能包括新增了PUT、PATCH、OPTIONS、DELETE方法,丰富了响应状态码,引入了range断点续传,增加了TLS的支持,以及更多的连接模型支持,如短连接、长连接、websocket模型等;此外还引入了Host请求头,用来指定服务器域名,这样一台主机上就可以部署多个域名服务端,这为虚拟化技术的兴起打下了坚实的基础。

  性能方面引入长连接,设置请求头Connection: keep-alive可以保持连接不断开,使得连接能被多个请求复用,但每个请求是串行执行,仍然存在队头阻塞问题。为了优化该问题,在长连接的基础上引入了管道化技术,可以不等待上一个请求响应而继续发送后续的请求,进一步提升传输效率,然而服务端响应是严格按照顺序返回的,队头阻塞问题依然没有解决。

  2.4 HTTP/2.0

  2.0版本与其说是对1.x版本的优化,倒不如说是一次革新,主要的调整主要包含:二进制化分帧、多路复用、头部压缩、服务端推送。

  - 二进制化分帧

  1.x是文本协议,然而2.0是以二进制帧为基本单位,将所有传输的信息分割为消息和帧,并采用二进制格式的编码,一帧中包含数据和标识符,使得网络传输变得高效而灵活。

  - 多路复用

  1.x中建立多个连接的消耗以及效率都存在问题,2.0版本借助于二进制帧中的标识进行区分,实现多个请求可以同时在一个TCP连接上并发的链路复用。

  - 头部压缩

  1.1版本每次发送请求都要带相同的header,2.0版本使用HPACK算法对header进行压缩,且对header信息进行增量更新,有效减少了数据量从而提高了传输效率。

  - 服务端推送

  和1.x版本采用的一问一答交互模式不同,2.0版本允许服务器主动向客户端发送资源,从而可以有效减少额外的延迟时间。

  HTTP/2.0的传输示意图如下所示:

  2.0版本虽然大幅提升了1.1版本的性能,然而基于TCP的实现却遗留下3个问题:

  1.有序字节流引出的队头阻塞,使得2.0版本的多路复用能力大打折扣;

  2.TCP与TLS叠加了握手时延,建连接时长还有1倍的下降空间;

  3. 基于TCP四元组确定一个连接,这种诞生于有线网络的设计,并不适合移动状态下的无线网络,这意味着IP地址的频繁变动会导致TCP连接、TLS会话反复握手,成本高昂。

  2.5 HTTP/3.0

  随着5G网络和互联网技术的发展,目前过半的互联网流量已经通过无线传输。这种趋势给整体的网络浏览体验带来了挑战,其中关键点在于解决在无线覆盖率不足的情况下TCP中的队头阻塞问题,3.0版本随之应运而生。

  HTTP/3.0又称为HTTP Over QUIC,是最新一代HTTP协议,弃用TCP协议改为使用基于UDP协议的QUIC协议来实现,QUIC协议的核心思想是将TCP协议在内核实现的诸如可靠传输、流量控制、拥塞控制等功能转移到用户态来实现,这样就避开了TCP机制的天然缺陷。HTTP/3.0与HTTP/2.0架构区别如下图所示:

  但是目前很多网络设备对于UDP数据包策略不够友好,进行拦截从而导致成功连接率下降,此外正确安全的配置HTTP/3和QUIC极其复杂,要将其变为一种简单易用的商业服务路还很长。

  Part 03

  回顾总结

  HTTP经历30多年的演化,实现了跨越式的发展,由最初只能串行的传输超文本文件到如今可以并行的传输多媒体文件,功能、性能以及安全性上都取得了巨大的提升。最后简短总结一下几个里程碑版本:

  HTTP/0.9 确立了交互架构,实现基本请求响应。

  HTTP/1.0 增加 HTTP 头,丰富传输资源类型,奠定互联网发展基础。

  HTTP/1.1 增加长连接、管道化,提升了 HTTP 传输效率。

  HTTP/2.0 采用二进制传输格式,通过 HTTP 多路复用、头部压缩、服务器端推送,将传输效率在 HTTP + TCP 架构上发挥到了极致。

  HTTP/3.0 将传输层替换为 QUIC,通过改进的拥塞控制、流量控制、0-RTT 建连、传输层多路复用、连接迁移等特性,进一步提升了 HTTP 传输效率。

0
相关文章