文章目录
- 区别
- HTTP/1.0
- HTTP/1.1
- 1. 持久连接(长连接)
- 2. 管道化
- 3. Host头字段
- 4. 分块传输编码
- 5. 缓存机制
- 6. 请求方法
- HTTP/2.0
- 1. 二进制分帧
- 2. 多路复用
- 3. 服务器推送
- 4. 优先级设置
- 5. 头信息压缩
- 6. 安全性
- 7. 流量控制
区别
特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 |
---|---|---|---|
连接管理 | 非持久连接:每个请求/响应需要新的连接 | 默认持久连接:允许多个请求/响应通过单个连接 | 多路复用(Multiplexing),允许单个连接上并行处理多个请求/响应 |
请求流水线 | 不支持 | 支持(但受限于阻塞问题) | 不支持,由多路复用取代 |
性能 | 较低,由于连接建立和关闭的开销 | 较高,由于持久连接和管道化(Pipelining) | 最高,由于多路复用、头部压缩和服务器推送 |
缓存 | If-Modified-Since、Expires 来做为缓存判断的标准 | 增强了缓存控制,引入了ETag、If-None-Match等 | 增强了缓存策略,更好地支持HTTP/2.0的特性和功能 |
头信息压缩 | 不支持 | 不支持 | 支持,使用HPACK算法进行头部压缩 |
服务器推送 | 不支持 | 不支持 | 支持服务器主动推送资源到客户端缓存 |
安全性 | 无原生安全支持 | 无原生安全支持,但常通过HTTPS扩展实现 | 原生支持通过TLS加密的HTTPS |
二进制分帧 | 不支持 | 不支持 | 支持,所有通信都被分解为小的消息和帧,能更有效地使用网络资源 |
消息依赖性 | 请求/响应是严格有序的 | 请求/响应是严格有序的 | 请求/响应可以并行处理,不依赖于之前的请求/响应 |
流控制 | 不支持 | 不支持 | 支持流控制,允许客户端和服务器更好地控制资源消耗和分配 |
HTTP/1.0
浅谈 HTTP
HTTP/1.1
HTTP/1.1是HTTP协议的一个版本,相较于HTTP/1.0,它在多个方面进行了改进和优化。
1. 持久连接(长连接)
HTTP/1.0中,每个HTTP请求都需要建立一个新的TCP连接,完成后立即断开。这种方式在大量请求时会造成很大的性能开销,因为每个连接都需要进行三次握手和四次挥手。
HTTP/1.1引入了持久连接(也称为长连接)的概念。通过在请求头中添加Connection: keep-alive
字段,客户端和服务器之间可以保持一个TCP连接,用于多个请求和响应的传输 。这种方式显著减少了建立和关闭连接的次数,提高了网络资源的利用率和性能。
.
2. 管道化
管道化:客户端可以在一个持久的TCP连接上连续发送多个请求,而不需要等待上一个请求的响应,且服务器会按照请求的顺序依次返回响应。
管道网络传输是指:**可以在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。**但是服务器还是按照顺序回应请求。如果前面的回应特别慢,后面就会有许多请求排队等着。这称为队头堵塞。
注意:
-
管道化同时依赖于客户端和服务器的支持。只有遵守HTTP/1.1的服务器才支持管道化。
-
虽然管道化可以提高性能,但它也可能引发“队首阻塞”问题。
如果前面的一个请求在服务器端处理的时间很长,生成响应需要很多时间,那么后面的请求即使已经处理完毕并生成了响应,也需要等待前面的响应发送完毕后才能发送。这会造成一定的延迟。
HTTP/2通过引入二进制帧和多路复用的概念,以及服务器推送等功能,进一步解决了HTTP/1.1中的队首阻塞问题,并提供了更好的性能和用户体验。
.
3. Host头字段
HTTP/1.0中,由于无法确定请求的资源位于哪个主机上,因此无法实现虚拟主机。
HTTP/1.1在请求头中引入了Host字段,用于指定请求的资源所在的主机和端口号。Host 请求头字段是一个强制性的字段。
这使得一台物理服务器上可以部署多个Web站点,通过Host字段来区分不同的虚拟主机。对于支持虚拟主机(即一台服务器上托管多个域名)也至关重要。
.
4. 分块传输编码
分块传输编码:当服务器不知道响应内容的长度时,可以使用分块传输编码将响应内容分成多个块进行传输。每个块都包含一个长度字段和一个数据字段。客户端可以逐个接收这些块,直到接收到一个长度为0的块时,表示响应内容已经传输完毕。
分块传输编码允许服务器在传输过程中动态生成响应内容,而不需要提前知道整个响应的大小。这有助于处理大文件传输和动态内容生成等场景。
.
5. 缓存机制
HTTP/1.1引入了更强大的缓存机制,允许客户端和服务器缓存请求和响应的内容。通过缓存,可以减少网络传输的数据量,提高响应速度。
HTTP/1.1还提供了丰富的缓存控制指令,如Cache-Control
、Expires
、ETag
等,用于控制缓存的行为和有效性。
彻底理解浏览器的缓存机制
.
6. 请求方法
HTTP/1.1新增了以下五种请求方法:
-
OPTIONS:这个请求方法用于获取目标资源所支持的通信选项。客户端可以对特定的URL使用OPTIONS请求,以了解该URL所支持的HTTP方法。
-
PUT:PUT请求方法用于向指定资源位置上传其最新内容。通常用于更新资源。
-
DELETE:DELETE请求方法用于删除指定资源。
-
TRACE:TRACE请求方法用于回显服务器收到的请求,主要用于测试或诊断目的。
-
CONNECT:CONNECT请求方法通常用于SSL加密服务器的链接(经由非加密的HTTP代理)。这个请求方法允许客户端建立一个到由请求URI标识的资源的隧道。一旦隧道建立,客户端就可以通过隧道发送原始的字节数据,而无需考虑HTTP协议。
HTTP/2.0
1. 二进制分帧
HTTP/2 是一个二进制协议。在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII 编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧",可以分为头信息帧和数据帧。 帧的概念是它实现多路复用的基础。
HTTP/2.0将HTTP报文分为多个帧(Frame),以二进制方式传输,取代了HTTP 1.x中的文本格式。这使得HTTP/2.0在解析数据时更加高效,减少了处理文本数据的开销。
每个帧都包含帧的长度、类型、标志等信息,以及特定类型的数据,如HTTP首部、负荷等。这种分帧机制使得HTTP/2.0能够更灵活地处理数据,提高了传输效率。
.
2. 多路复用
多路复用:允许在同一个TCP连接上同时发送多个请求和响应,而且不用按照顺序一一发送。这解决了HTTP/1.1中的队头阻塞问题,提高了并发性能。
通过多路复用,客户端和服务器可以并行处理多个请求和响应,从而减少了等待时间,提高了网络资源的利用率。
.
3. 服务器推送
HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送提前给客户端推送必要的资源,这样就可以相对缩短页面加载时间。
服务器推送可以减少客户端的额外请求,降低网络延迟,提高页面加载速度。
.
4. 优先级设置
HTTP/2.0支持数据流的优先级设置,允许客户端指定请求的优先级。
服务器会根据请求的优先级来分配资源,优先处理重要的请求,从而提高了用户体验。
.
5. 头信息压缩
由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie
和 User Agent
,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。
HTTP/2.0使用HPACK算法对头信息压缩进行压缩,减少了头信息压缩的数据量,节省了带宽。
-
头信息使用 gzip 或 compress 压缩后再发送
-
客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。
.
6. 安全性
HTTP/2.0默认使用SSL/TLS加密传输网络数据,增强了安全性。
这使得HTTP/2.0更加适用于敏感数据的传输,如在线支付、登录等场景。
.
7. 流量控制
HTTP/2.0引入了流量控制机制,允许客户端和服务器控制数据的传输速度。
这可以防止发送方发送过多的数据导致接收方缓冲区溢出,从而保证了数据传输的稳定性和可靠性。