视觉艺术

HTTP/1.0/1.1/2/3

2020-11-28  本文已影响0人  弱冠而不立

HTTP协议概念

HTTP 协议是无状态的,其本身也是无连接的

因为HTTP是无状态的,但在实际工作中,常常希望能识别用户信息。所以要做到这点就可以在HTTP中使用Cookie

HTTP的报文

HTTP 报文有两种,一种是请求报文,一种是响应报文。
HTTP 请求报文和响应报文都是由三个部分组成的。

  1. 开始行:用于区别是请求报文还是响应报文,在请求报文中的开始行叫做请求行,而在响应报文中的开始行叫做状态行
  2. 首部行:用来说明浏览器,服务器或者报文主体的一些信息
  3. 实体主体:在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段
请求报文的格式:

GET /dir/index.html HTTP/1.1 {请求行包含三个字段:方法字段、URL字段和HTTP版本字段}
Host: www.xyz.edu.cn {此行是首部行的开始,这行给出主机的域名}
Connection: close {告诉服务器发送完请求的文档后就可以释放连接}
User-Agent: Mozilla/5.0 {表明用户代理是使用火狐浏览器内核}


请求报文的最后还有一个空行,这个空行不能省略,它用来划分首部与实体。

响应报文的格式:

HTTP/1.0 200 OK {状态行包含三个字段:协议版本字段,状态码和对应的状态信息}
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84


{实体部分是报文的主要部分,它包含所请求的对象}
<html>
<body>Hello World</body>
</html>

HTTP/1.0,HTTP/1.1 和 HTTP/2 的区别概览

1.0 1.1 2
长连接 规定浏览器只与服务器保持短暂连接,除非使用keep-alive参数来告知服务器端要建立一个长连接 默认采用持久连接 默认支持
浏览器缓存 强缓存expired、协商缓存last-modified\if-modified-since 有一定的缺陷 增加了强缓存cache-control、协商缓存etag\if-none-match 是对http/1 缓存的优化 ✔️
HOST 域 ✔️ ✔️
多路复用 ✔️
头部压缩 使用HAPCK算法对header数据进行压缩,使数据体积变小,传输更快
服务器推送 ✔️
一些详细的解释:

HTTP1.0

HTTP1.1

默认长连接(keep-alive)

http请求可以复用Tcp连接,但是同一时间只能对应一个http请求(即:http请求在一个tcp中是串行的)

增加了缓存字段

强缓存cache-control、协商缓存etag\if-none-match 是对http/1 缓存的优化

管道化

基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回

请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3

请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3

断点传输

在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率

HTTP/2

二进制格式编码分帧传输

将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码。

多路复用

基于二进制分帧,在同一域名下所有访问都是从同一个tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来。

头部压缩

HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

服务器推送

当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。

HTTP/3

虽然 HTTP/2 解决了很多之前旧版本的问题,但是它还是存在一个巨大的问题,主要是底层支撑的 TCP 协议造成的。因为在出现丢包的情况下,整个 TCP 都要开始等待重传,也就导致了后面的所有数据都被阻塞了。但是对于 HTTP/1.1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。
基于这个原因,Google 就更起炉灶搞了一个基于 UDP 协议的 QUIC 协议,并且使用在了 HTTP/3 上,HTTP/3 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC。
即:HTTP/3 是基于UDP实现的

上一篇 下一篇

猜你喜欢

热点阅读