http1.0/http1.1/ http2.0区别 ---收藏版

http报文组成

用于http协议交互信息被称为http报文。客户端的http报文叫作请求报文,服务端的叫做响应报文。http报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。

http报文由报文首部、空行、报文主体组成
报文首部:为客户端和服务器处理请求和响应提供所需要的信息。
报文主体:所需要的用户和资源的信息

请求报文:
在这里插入图片描述

  • 请求行由:方法 URI http版本组成

响应报文:
在这里插入图片描述

  • 状态行由http版本 状态码 原因短语组成

http1.0

  • 可靠传输

HTTP 基于 TCP/IP,因此把这一特性继承了下来

  • 灵活可扩展

主要体现在两个方面。一个是语义上的自由,只规定了基本格式,比如空格分隔单词,换行分隔字段,其他的各个部分都没有严格的语法限制。另一个是传输形式的多样性,不仅仅可以传输文本,还能传输图片、视频等任意数据,非常方便。

  • 无状态

规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个连接,服务器处理完成后立即断开连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。

  • 明文传输

即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式。
这当然对于调试提供了便利,但同时也让 HTTP 的报文信息暴露给了外界,给攻击者也提供了便利。WIFI陷阱就是利用 HTTP 明文传输的缺点,诱导你连上热点,然后疯狂抓你所有的流量,从而拿到你的敏感信息。

  • 无长连接

。每次发送请求的时候,都需要进行一次的连接,而的连接释放过程又是比较费事的。这种无连接的特性会使得网络的利用率非常低。

http1.1

继承了http1.0的优点,克服了性能上的问题

  • 支持长连接

增加了Connection字段,通过设置Keep-Alive可以保持连接不断开,减少了每次客户端与服务器请求都要重复建立和释放建立的额外开销,减轻了服务器端负担。减少了那部分时间开销。如果客户端想关闭HTTP连接,可以在请求头中携带Connection: false来告知服务器关闭。

扫描二维码关注公众号,回复: 12552224 查看本文章

拓张:通用首部字段connect作用
1.控制不再转发给代理的首部字段
2.管理长链接。
在这里插入图片描述

  • 支持管线化

从前发送请求后需等待并收到响应,才能发下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。需要注意的是,服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。(注意:仍没有解决队头阻塞问题,需等前一个请求先响应完)

拓展:

http1.1如何解决队头阻塞问题
1.并发连接:对于一个域名允许分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其它所有任务。在RFC2616规定过客户端最多并发 2 个连接,不过事实上在现在的浏览器标准中,这个上限要多很多,Chrome 中是 6 个。
2.域名分片:不要在同一个域名下获取所有资源,假设有个域名是 www.example.com,我们可以把它拆分成好几个域名:www1.example.com、www2.example.com、www3.example.com。所有这些域名都指向同一台服务器,浏览器会同时为每个域名建立 6 条连接(在我们这个例子中,连接数会达到 18 条)。这一技术被称作域名分片。

  • 加入了缓存处理

在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

  • 支持断点传输

HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

  • 增加host头处理

在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。

host首部字段在http1.1规范内是唯一一个必须包含在内的首部字段,它告知请求的资源所处的互联网主机名和端口号。若服务器未设定主机名,那么直接发送一个空值即可,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

http 2.0

  • 二进制分帧

HTTP2.0通过在应用层和传输层之间增加一个二进制分帧层,突破了HTTP1.1的性能限制、改进传输性能。
简单来说,HTTP2.0只是把原来HTTP1.x的header和body部分用frame重新封装了一层而已
在这里插入图片描述

  • 多路复用(MultiPlexing)
    在这里插入图片描述
  1. 原来Headers + Body的报文格式如今被拆分成了一个个二进制的帧,用Headers帧存放头部字段,Data帧存放请求体数据。分帧之后,服务器看到的不再是一个个完整的 HTTP 请求报文,而是一堆乱序的二进制帧。这些二进制帧不存在先后关系,因此也就不会排队等待,也就没有了 HTTP 的队头阻塞问题。
  2. 通信双方都可以给对方发送二进制帧,这种二进制帧的双向传输的序列,也叫做流(Stream)。HTTP/2 用流来在一个 TCP 连接上来进行多个数据帧的通信,这就是多路复用的概念。
  3. 首先要声明的是,所谓的乱序,指的是不同 ID 的 Stream 是乱序的,但同一个 Stream ID(流标识符) 的帧一定是按顺序传输的。二进制帧到达后对方会将 Stream ID 相同的二进制帧组装成完整的请求报文和响应报文。当然,在二进制帧当中还有其他的一些字段,实现了优先级和流量控制等功能。

拓展:信道复用技术:频分复用、时分复用、波分复用、码分复用
更多:信道复用详细内容

  • header压缩

在 HTTP/1.1 及之前的时代,请求体一般会有响应的压缩编码过程,通过Content-Encoding头部字段来指定,但你有没有想过头部字段本身的压缩呢?当请求字段非常复杂的时候,尤其对于 GET 请求,请求报文几乎全是请求头,这个时候还是存在非常大的优化空间的。HTTP/2 针对头部字段,也采用了对应的压缩算法——HPACK,对请求头进行压缩。

HPACK 算法是专门为 HTTP/2 服务的,它主要的亮点有两个:

  1. 首先是在服务器和客户端之间建立哈希表,将用到的字段存放在这张表中,那么在传输的时候对于之前出现过的值,只需要把索引(比如0,1,2,…)传给对方即可,对方拿到索引查表就行了。这种传索引的方式,可以说让请求头字段得到极大程度的精简和复用。
  2. 其次是对于整数和字符串进行哈夫曼编码,哈夫曼编码的原理就是先将所有出现的字符建立一张索引表,然后让出现次数多的字符对应的索引尽可能短,传输的时候也是传输这样的索引序列,可以达到非常高的压缩率。
  • 服务器推送

将伴随资源一起发送给客户端,省去了重复请求步骤。服务器已经不再是完全被动地接收请求,响应请求,它也能新建 stream 来给客户端发送消息,当 TCP 连接建立之后,比如浏览器请求一个 HTML 文件,服务器就可以在返回 HTML 的基础上,将 HTML 中引用到的其他资源文件一起返回给客户端,减少客户端的等待。

普通的客户端请求过程:在这里插入图片描述
服务端推送的过程:
在这里插入图片描述

参考:
HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比

猜你喜欢

转载自blog.csdn.net/HZ___ZH/article/details/111085823
今日推荐