HTTP之前世今生

/ 前端 / 没有评论 / 453浏览

HTTP全称为HyperTextTransferProtocol,即超文本传输协议,是当今互联网使用最广泛的网络基础协议。 2018年2月,作为互联网技术的先行者Google宣布Chrome从68版本之后,将把所有未采用HTTPS的网站标记为“不安全”。 alt

HTTP 版本演进

HTTP作为互联网的基石,伴随着互联网技术的发展不停地演变,各种底层技术的不断发展,也支持着网络上层用户体验的不断优化。HTTP各版本演进历程如图4.3所示。 alt

HTTP/0.9作为第1个版本,实现的功能较为初级,只支持GET请求,用于传输基础的文本内容。

HTTP/1.0在HTTP/0.9的基础上做出了大量的改进,为互联网的发展奠定了坚实基础。首先,增加了访问不同对象类型的功能,不仅可以传输文本,还可以传输图像、视频、二进制文件等。同时,在GET请求命令的基础上,增加了POST、PUT、HEAD、DELETE、LINK等命令。另外,还增加了头部信息,如UserAgent、Accept、LastModified、ContentType等至今仍在使用的请求头字段。

提示:HTTP/1.0协议文档地址为https://www.w3.org/Protocols/HTTP/1.0/spec.html。

HTTP/1.1目前依旧被广泛地使用在互联网领域,其在HTTP/1.0的基础上又做了大量的改进,部分改进如下。

提示:HTTP/1.1协议文档地址为https://www.w3.org/Protocols/rfc2616/rfc2616.html。

HTTP/1.1使用寿命相当长,直到如今也是主流的使用版本。2009年,Goolge公开了自己研发的SPDY(单词speedy的缩写)协议,通过多路复用、压缩、优先级、安全等新技术方案,缩短了网页的加载时间,并提高了安全性。IETF(TheInternetEngineeringTaskForce,国际互联网工程任务组)随后对SPDY进行了标准化,并作为制定HTTP/2标准的起点。2015年5月HTTP/2正式推出。

提示:HTTP/2文档地址为https://tools.ietf.org/html/rfc7540。

HTTP/2

HTTP/2于2015年5月正式推出,以“RequestforComments:7540”(征求修正意见书,编号7540)正式发表。HTTP/2在HTTP/1.1的基础上保持原有语义和功能不变,但极大地提升了性能。HTTP/2整体的优化设计包括以下5个方面。

采用二进制格式传输数据

之前的HTTP/1.*均采用文本格式传输数据,而HTTP/2则选择了使用二进制格式传输数据。在HTTP/2中,基本的协议单位是帧,每个数据流均以消息形式发送,消息由一个或多个帧组合而成。帧的内容包括:长度(Length)、类型(Type)、标记(Flags)、保留字段(R)、流标识符(StreamIdentifier)和帧主体(FramePayload)。帧的布局如图4.5所示。

alt

多路复用

在HTTP/1.0中,如果需要并发多个请求,则必须创建多个TCP连接,并且浏览器对于单个域名的请求有相应的数量限制,一般为6个。其连接无法被复用的问题,一直被开发人员所诟病。

之后,在HTTP/1.1中,引入了流水线(Pipelining)技术,但先天的FIFO(FirstInputFirstOutput,先进先出)机制导致当前请求的执行依赖于上一个请求执行的完成,容易引起报头堵塞(Headoflineblocking),并没有从根本上解决问题。

HTTP/2重新定义了底层的HTTP语义映射,允许在同一个连接上使用请求和响应双向数据流。至此,同一个域名只需要占用一个TCP连接,通过数据流(Stream),以帧为基本协议单位,从根本上解决了这个问题,避免了因频繁创建连接产生的延迟,减少了内存消耗,提升了使用性能,HTTP/2的多路复用如图4.6所示。 alt

流的优先级

在HTTP/2中可以为每个流(Stream)设置优先级,高优先级的流会被服务优先处理并返回给客户端,同时,流的优先级允许根据场景的不同进行动态改变。客户端可以在流中设置优先级帧来改变流的优先级。图4.7所示为优先级帧的实体包。 alt

图4.7中包含的字段解释如下:

首部压缩

在HTTP/1.*时代,前端性能优化法则中出现过一条建议——禁止滥用Cookie,同时建议将静态资源迁移到独立的域名上,其中一个关键的优化点是压缩请求头部大小。随着Web站点的功能越来越复杂,主域名下被各种各样的业务加入五花八门的Cookie,对于一般的图片、样式、脚本等资源无须在后端了解其与用户特征相关的信息(如Cookie),而客户端频繁地发送此类数据产生了极大的浪费。

HTTP/2引入了HPACK压缩首部数据。由于HPACK压缩引入了索引表概念,包含静态表和动态表。在同一个请求上产生的响应越多,表的累积会越全面,压缩效果会越好。因此,针对已经迁入HTTP/2的站点,要合理分布域名并申请SSL(SecureSocketLayer,安全套接层)证书。因为在HTTP/2下判断是否使用同一个连接分为两种情况:一种是对于相同域名下的资源,默认使用同一个连接;另外一种是对于不同域名的资源,需要判断IP地址是否相同,或者是否有相同的SSL证书。

提示:HPACK相关的内容可查看IETF的官方文档https://tools.ietf.org/html/rfc7541。

服务端推送

在HTTP/2出现之前,用户打开浏览器输入网址,请求一个具体的HTML文档,浏览器在解析HTML后,开始逐步请求对应的脚本、样式、图片等静态资源。而HTTP/2的服务端推送特性,使服务端主动推送与当前请求相关的内容成为可能。例如,可以在请求该HTML文档的同时,一并推送与之关联的静态资源文件,达到性能优化的目的。同时,服务端推送遵循同源策略,可以被浏览器缓存,实现多页面共享缓存资源。