HTTP 概述
超文本传输协议(HTTP)全称Hyper Text Transfer Protocol,用于使用超文本链接加载网页。HTTP 是一种应用层协议,主要涉及客户端向服务器发出请求,然后服务器发送响应消息。
HTTP 是一种无状态协议,目前主要与 TLS(传输层安全)协议一起使用,TLS为 HTTP 提供机密性、完整性和身份验证机制——通常称为 HTTPS。
HTTP 由各种不同的组件组成,用于交换实际数据和元数据:
- HTTP 请求方法(即 GET、POST、PUT、PATCH、DELETE)
- HTTP 标头(即 Cookie、XFF、主机、内容类型、连接)
- HTTP 响应码 - 表示请求状态的数值(例如:404 Not Found,表示在服务器上找不到请求的资源)
HTTP的历史
历史上最早的HTTP协议是1989年CERN(译注:即“欧洲核子研究组织”的原称 - Conseil Européen pour la Recherche Nucléaire)的 Tim Berners-Lee 发明的,目前命名为HTTP/0.9。然而,由于缺乏现代的传输机制、头文件、方法等,它从未获得官方的RFC,实际上也不再被使用。下面列出了官方 HTTP 初始规范 RFC,重点介绍了它们引入时最重要的新功能:
HTTP/1.0 - 1996 年 5 月 - RFC 1945
- 支持 HTTP 报头
- 支持 HTTP 状态码
- 支持 Content-Type 报头
- 增加了新的POST 和 HEAD 方法
HTTP/1.1 - 1997 年 1 月 - RFC 2068
- 引入持久连接 - 可以通过单个连接发送多个请求
- 强制主机头 - 对web代理路由很重要
- 新的 HTTP 状态码 100
- 新的 HTTP 方法 - PUT、PATCH、DELETE、CONNECT、TRACE 和 OPTIONS
- 支持各种压缩和解压缩方法 - Gzip 最常用
HTTP/2.0 - 2015 年 5 月 - RFC 7540
- 支持请求多路复用,引入 HTTP 流,现在请求/响应可以多路复用并且不是连续的
- 支持请求优先级,例如,CSS 文件应该在 JS 文件之前发送
- 自动 Gzip 压缩
- HTTP 连接重置支持,如果在 HTTP 级别发生错误,可以立即重置连接
- 支持服务器推送,服务器可以在没有明确请求的情况下主动将内容推送回客户端。
- 支持报头压缩 (HPAK)
HTTP/3.0 - 2022 年 6 月 - RFC 9114
- 使用 QUIC 协议代替TCP/TLS 栈 - RFC 9000
2022 年 6 月,IETF(互联网工程任务组)HTTP 组不仅发布了 HTTP/3 RFC 9114,还决定对 HTTP RFC 结构进行细化、清理和重建。此外,有些东西已经从 HTTP 标准中分离出来,并移至它们自己的 RFC 中。
- HTTP 语义- RFC 9110:HTTP 的总体架构、常用术语和共享协议方面,例如请求和响应消息/doc/rfc9111s、方法、状态码、头和尾字段、消息内容、表示数据、内容编码等等。
- HTTP 缓存- RFC 9111:HTTP 缓存和相关的报头字段来控制响应缓存的行为。
- HTTP/1.1 - RFC 9112
- HTTP/2.0 - RFC 9113
- QPAC - RFC 9204
在最初的HTTP/1.0发布之后,用户很快发现它缺少很多潜在的特性,需要进行一些优化。仅半年之后就发布了HTTP/1.1来解决这些问题。而新的官方HTTP/2标准花了整整18年的时间来开发,主要是为了解决性能方面的问题。7年后的2022年6月,HTTP/3协议被引入。
HTTP/3协议最大的变化是放弃了对 TCP/TLS 堆栈的支持,并用新的互联网协议——QUIC传输协议取而代之。
HTTP3
HTTP3是在保持QUIC稳定性的同时使用UDP来实现高速度(选择QUIC就是选择UDP), 同时又不会牺牲TLS的安全性。
HTTP2协议虽然大幅提升了HTTP/1.1的性能,然而,基于TCP实现的HTTP2遗留下3个问题:
有序字节流引出的队头阻塞(Head-of-line blocking),使得HTTP2的多路复用能力大打折扣;
TCP与TLS叠加了握手时延,建链时长还有1倍的下降空间;
基于TCP四元组确定一个连接,这种诞生于有线网络的设计,并不适合移动状态下的无线网络,这意味着IP地址的频繁变动会导致TCP连接、TLS会话反复握手,成本高昂。
HTTP3协议解决了这些问题:
HTTP3基于UDP协议重新定义了连接,在QUIC层实现了无序、并发字节流的传输,解决了队头阻塞问题(包括基于QPACK解决了动态表的队头阻塞);
HTTP3重新定义了TLS协议加密QUIC头部的方式,既提高了网络攻击成本,又降低了建立连接的速度(仅需1个RTT就可以同时完成建链与密钥协商);
HTTP3 将Packet、QUIC Frame、HTTP3 Frame分离,实现了连接迁移功能,降低了5G环境下高速移动设备的连接维护成本。