HTTP协议历史
数据内容大致来源于 -前端工程体验优化实战,后续继续逐步解析问题点
- HTTP/0.9
- 解决的痛点
- 欧洲核子研究中心内部文档管理混乱,信息交流不便
- 新特性
- 只有GET方法,仅支持传输HTML内容,没有实现HTTP请求头和请求体,HTTP请求只有1行内容:GET /juniortour.html
- 除了HTTP协议,还一并实现了HTML,主要用于学术交流,仅支持纯文本信息。也正是因为简单好用,HTTP协议迅速在互联网上流行开来,被众多浏览器和服务器接纳
- 解决的痛点
- HTTP/1.0
- 解决的痛点
- 0.9版仅支持文本一种类型的信息交流,无法满足日益多样的互联网通信需求
- 0.9版无状态,导致无法感知成功、失败状态
- 新特性
- 明确了HTTP/1.0的版本,并且规定随请求头发送
- 引入请求、响应以及状态码等诸多基础概念
- 引入HTTP头的概念,支持传输各类自定义数据,大大强化HTTP协议的灵活性、拓展性
- 引入Content-Type响应头,支持图片等更多类型的响应
- 解决的痛点
- HTTP/1.1
HTTP/1.1版本后续虽有小修小补,但总体上稳定了长达15年之久
- 解决的痛点
- 1.0版链接延迟较大:因为队头阻塞(HOL blocking)导致浏览器传输效率受限
- 1.0版仅支持短连接:每一对请求响应,都必须经历TCP三握四挥的过程,才能通信,开销较大。这也是为什么早年间的网页流行使用精灵图(Sprites)技术,以减少请求数量的原因
- 新特性
- 长连接(Persistent Connection):支持在一个TCP连接上传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟
- 通过Host字段,支持虚拟主机,允许多个域名共用同一个IP地址
- 新的缓存机制:Etag, If-None-Match, Cache-Control等专用头部
- 新增了OPTIONS, HEAD, PUT, PATCH, DELETE等一批新的HTTP方法,以及307永久重定向等一批新的HTTP状态码
- 解决的痛点
- HTTP/2
2009年前后,为解决HTTP/1.1版本性能,Google实现了名为SPDY的实验性协议。2015年,由Google推动,在SPDY协议的基础上,标准化了HTTP/2协议
- 解决的痛点
- 十几年过去,HTTP/1.1版本的性能表现日渐落后,急需大幅优化性能
- 新特性
- 多路复用:
1.
同域名下所有通信都在单个 TCP 连接上完成,消除了因创建多个 TCP 连接而带来的延时和内存消耗2.解决了HTTP层的队列头阻塞问题(但TCP层的队列头阻塞问题仍然存在)3.单个连接上可以并行交错的请求和响应,相互之间互不干扰 - 服务端推送:
建立链接后,即使还没有收到浏览器的请求,服务器也可以主动把各种类源推送给浏览器 - 头部压缩:
将有大量重复内容的HTTP请求响应头进行压缩,节省网络流量。 - 全面基于二进制格式传输:
此前的HTTP/1.1版本,头部必须是文本格式,数据体支持文本、二进制两种格式。HTTP/2进一步全面支持二进制格式,以及基于二进制数据分帧,从客户端乱序发送,到服务端再按帧内数据排序组装
- 多路复用:
1.
- 解决的痛点
- HTTP/3
2013年,Google 为了进一步优化HTTP协议的性能,加快网页传输,设计并实现了快速UDP互联网连接(Quick UDP Internet Connection,简称QUIC) ,为2018年 HTTP/3 的确立奠定了基础
- 解决的痛点
- HTTP/2连接建立时间较长,因为基于TCP协议,三握四挥的过程开销无法避免
- TCP队头阻塞问题: HTTP/2 运行在单个 TCP 连接上,因此 TCP 层进行丢包检测和重传时可能会阻塞后续数据
- HTTP/2在弱网络环境,尤其是移动互联网场景中性能较差,因为移动设备连接互联网时,往往会时不时切换网络环境,例如从4G切换到WiFi,这种情况下HTTP/2不得不重新创建TCP连接,开销较大
- 新特性
- 基于UDP协议实现:
减少了连接延迟,避免了TCP三握四挥的开销。避免网络环境变化时需要重新连接的问题,优化了移动设备的连接性能 - 囊括TLS协议:
更快的实现TLS握手,进一步减少往返时间(Round Trip Time,RTT)延迟
- 基于UDP协议实现:
- 解决的痛点