1、简介
HTTP(HyperText Transfer Protocol)是万维网(World Wide Web)的基础协议。自提姆·柏內茲-李(Tim Berners-Lee) 博士和他的团队创造(1989-1991 年)出它至今,HTTP 已经发生了太多的变化。在保持协议简单性的同时,不断扩展其灵活性。如今,HTTP 已经从一个只在实验室之间交换文件的早期协议进化到了可以传输图片,高分辨率视频和 3D 效果的现代复杂互联网协议。
2、诞生
1989 年, 当时在欧洲核子研究中心(CERN) 工作的提姆·柏內茲-李写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 Mesh,在随后的 1990 年项目实施期间被更名为万维网(World Wide Web)。它在现有的 TCP 和 IP 协议基础之上建立,由四个部分组成:
- 一个用来表示超文本文档的文本格式,超文本标记语言(HTML)。
- 一个用来交换超文本文档的简单协议,超文本传输协议(HTTP)。
- 一个显示(以及编辑)超文本文档的客户端,即网络浏览器。第一个网络浏览器被称为 WorldWideWeb。
- 一个服务器用于提供可访问的文档,即 Apache HTTP Server(httpd) 的前身。
这四个部分完成于 1990 年底,且第一批服务器已经在 1991 年初在 CERN 以外的地方运行了。 1991 年 8 月 16 日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。
HTTP 在应用的早期阶段非常简单,后来被称为 HTTP/0.9,有时也叫做单行(one-line)协议。
3、发展
目前为止 HTTP 一共经历了五个版本,分别是
- 1991年0.9版本
- 1996年1.0版本
- 1997年1.1版本
- 2015年2.0版本
- 2022年3.0版本
4、变化
0.9
- 特点
- 用来从服务器获取 HTML 文档
- 只支持GET请求
- 网站有大量资源请求时(图片等),每次都需要重新建立连接并断开
- 报文
- 请求:// 只有请求行GET 文档路径响应:
<HTML>
这是一个非常简单的 HTML 页面</HTML>
- 请求:// 只有请求行GET 文档路径响应:
- 备注
- 跟后来的版本不同,HTTP/0.9 的响应内容并不包含 HTTP 头,这意味着只有 HTML 文件可以传送,无法传输其他类型的文件;也没有状态码或错误代码:一旦出现问题,一个特殊的包含问题描述信息的 HTML 文件将被发回,供人们查看
1.0
- 特点
- 引入HTTP头的概念
- 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)
- 具备了传输除纯文本 HTML 文件以外其他类型文档的能力(凭借Content-Type头)
- 一条TCP连接只处理一个请求
- 报文
- 请求报文:{请求行:methods path protocol请求头请求体}响应报文:{响应行:protocol statusCode desc响应头响应体}
- 备注
- 请求(响应)行/头以回车(CR)加换行(LF)符号序列结尾。带宽利用率低,每对连接都是一个新的连接,不可复用。但是可以在请求header中增加Connection: keep-alive,响应header中如果也带有Connection: keep-alive则支持持久连接。建立持久连接后可以不断串行发送请求。如果迟迟收不到服务端响应,下一条请求无法发送,造成了客户端队头阻塞。使用Expire、If-Modified-Since判断缓存资源的有效性
1.1
- 特点
- 增加新的请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT
- 有了管道的概念,允许一个TCP连接同时发送多个请求,而不必等待响应
- 报文
- 请求报文:{请求行:methods path protocol请求头请求体}响应报文:{响应行:protocol statusCode desc响应头响应体}
- 备注
- 默认支持keep-alive、后续连接复用之前打开TCP连接。支持只发送header,鉴权通过后再发送数据,节省带宽。减轻了队头阻塞,解决了HTTP/1下客户端队头阻塞的问题,下一次发送不用等待前一次的请求结果。但是产生了新的问题——服务端队头阻塞。由于服务器只能一个个返回,如果第一个请求被阻塞了,后续应答都会跟着阻塞。支持传输部分内容(range头实现断点续传)引入etag、使用If-None-Match、Cache-Control等处理缓存。支持host域,实现同ip、端口访问不同web站点。同一个 TCP 连接允许发起多次 HTTP 请求,一般为6个。
2.0
- 特点
- 二进制分帧
- 多路复用
- 头部压缩(HPACK)
- 二进制协议
- 服务端推送
- 备注
- 多路复用:同一个域名只需要建立一个TCP连接,并行发送多个请求和响应(乱序),然后再根据每个帧首部的流标识符重新组装。头部压缩:使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。服务器推送。二进制分帧:在应用层和传输层之间HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。
3.0
- 特点
- 基于 UDP 通信
- 从协议本身保证了安全性,QUIC 在建立连接的握手过程中就完成了TLS 加密握手
- 建立连接快,正常只需要 1RTT 即可建立连接。如果有缓存之前的secret 信息,则直接验证和建立连接,此过程 0RTT 。建立连接时,也可以带有少量业务数据
- 不和具体底层连接绑定,QUIC 为每个连接的两端分别分配了一个唯一 ID ,上层连接只认这对逻辑 ID 。网络切换或者断连时,只需要继续发送数据包即可完成连接的建立
- 使用 QPACK 进行头部压缩,因为 HPACK 要求传输过程有序,这会导致队头阻塞。而 QPACK 不存在这个问题
- HTTP/3在header中定义了一个新header:Alt-Svc: h3=":20003",表示服务器在 20003 端口开了一个 20003 端口用于HTTP/3服务
- 备注
- HTTP/3,也称作 HTTP over QUIC 。 HTTP/3 的核心是 QUIC (读音quick)协议,由 Google 在 2015年提出的 SPDY v3 演化而来的新协议,传统的 HTTP 协议是基于传输层 TCP 的协议,而 QUIC 是基于传输层 UDP 上的协议,可以定义成:HTTP3.0 基于 UDP 的安全可靠的 HTTP/2 协议。
- 为QUIC 协议。QUIC 协议集合了以下几点功能:- 实现了类似 TCP 的流量控制、传输可靠性的功能。虽然 UDP 不提供可靠性的传输,但 QUIC 在 UDP 的基础之上增加了一层来保证数据可靠性传输。它提供了数据包重传、拥塞控制以及其他一些 TCP 中存在的特性。
- 集成了 TLS 加密功能。目前 QUIC 使用的是 TLS1.3,相较于早期版本 TLS1.3 有更多的优点,其中最重要的一点是减少了握手所花费的 RTT 个数。
- 实现了 HTTP/2 中的多路复用功能。和 TCP 不同,QUIC 实现了在同一物理连接上可以有多个独立的逻辑数据流。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。
- 实现了快速握手功能。由于 QUIC 是基于 UDP 的,所以 QUIC 可以实现使用 0-RTT 或者 1-RTT 来建立连接,这意味着 QUIC 可以用最快的速度来发送和接收数据,这样可以大大提升首次打开页面的速度。
5、名词解释
-
应用层HTTP队头阻塞(请求、响应):
- 请求:建立持久连接后可以不断串行发送请求。如果迟迟收不到服务端响应,下一条请求就无法发送。
- 响应:服务器是要按照顺序处理请求的,如果前一个请求处理非常耗时,那么后续请求都会受到影响,简单理解就是要排队。
-
传输层TCP队头阻塞
- HTTP2解决了HTTP1的队头阻塞问题,但由于本质是多个请求跑在一个 TCP 管道中,如果其中任意一路数据流中出现了丢包的情况,那么就会阻塞该 TCP 连接中的所有请求。这不同于 HTTP/1.1,使用 HTTP/1.1 时,浏览器为每个域名开启多个 TCP 连接(通常6个)。如果其中的 1 个 TCP 连接发生了队头阻塞,那么其他的 5 个连接依然可以继续传输数据。所以随着丢包率的增加,HTTP/2 的传输效率也会越来越差。有测试数据表明,当系统达到了 2% 的丢包率时,HTTP/1.1 的传输效率反而比 HTTP/2 表现得更好。
- 短连接:如HTTP0.9也被称为是“无连接”的协议。不会与服务器保持长期的连接状态,所以也称为短连接,短连接每一次的请求都需要重新建立TCP连接,有10个请求就需要建立10次TCP连接。这个效率,可想而知是非常低的。
- 长连接:到Http1.0就出现了长连接的通信方式,解决了短连接多次建立TCP连接的痛点,现在Http1.1基本都是默认开启Connection: keep-alive 长连接的, TCP连接只要建立一次,后续的请求都复用该通道,不用再重新建立TCP通道,效率大大提升。
- 流:虚拟信道,可以承载双向消息,每个流都有一个唯一的整数标识符(1、2....N);
- 消息:逻辑上的HTTP消息,比如请求、响应,由一或多个帧组成。
-
帧:最小的通信单位,承载特定类型的数据,比如HTTP首部、负荷等等。
-
RTT:是指从客户端发送请求到收到服务器应答的时间。
-
0RTT:是指双方通信的第一个数据包就可以携带有效的业务数据。
-
OSI(Open System Interconnection)七层网络模型
- 应用层:定义了用于网络通信和传输的接口
- 表示层:定义了不同系统中数据传输的格式,编码、解码规范等
- 会话层:管理用户会话,控制连接的建立和中断
- 传输层:管理网络中端到端数据传输
- 网络层:定义网络之间如何传输数据
- 数据链路层:将网络层的数据包封装成帧,便于传输
- 物理层:传输二进制数据
-
管道:多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应。只不过,客户端还是要按照发送请求的顺序来接收响应。