http 主要版本的历史

1、定义
http协议:超文本传输协议(通讯协议),用于从服务器传输超文本到本地浏览,创建再TCP/IP协议基础上
三个特色:
一、无链接
是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间
二、无状态
是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快
三、灵活
容许传输任意类型的数据对象。传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记 javascript

image.png


HTTP/0.9版本
特色:结构简单,仅有GET请求,纯文本格式css

例如GET /index.html
表示:TCP创建链接后,客户端向服务端请求index.html页面,协议规定,服务端只能返字符串,返回后即关闭TCP连接,若是请求的页面不存在,也不反悔任何错误码,这也是无状态的一个体现

HTTP/1.0版本
相比较上一个版本增长了以下主要内容:html

  1. 增长了post请求,丰富了浏览器与客户端的互动手段
  2. 传输数据不限于文本,能够是图片、视频、二进制文件等内容
  3. 增长了协议版本号
  4. 增长的响应状态码
  5. 引入了HTTP HEADER(头部)概念,让HTTP处理请求更加灵活
GET /HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

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>

其中content-type是体现灵活的字段,咱们常见的value值包括:text/html, text/css, image/png, application/javascript, application/x-www-form-urlencoded form, Multipart/form-data,以上数据统称为MIME类型。java

1.0的缺点:
链接没法复用:每一个TCP链接只能发送一个请求。发送数据完毕,链接就关闭,若是还要请求其余资源,就必须再新建一个链接。
为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段:Connection: keep-alive,表示TCP能够复用,直到主动关闭连接。算法

image.png

上面是又没有keep-alive的区别,可是这不是标准字段,不一样实现的行为可能不一致,所以不是根本的解决办法,而且TCP的新建成本很高,由于每次连接服务端和客户端都须要通过三次握手,而且开始时发送的速率较慢。浏览器

HTTP/1.1版本
也就是目前位置用的最多的一个版本,相比较1.0版本增长了:缓存

  1. 持久连接,默认TCP不关闭,能够被多个请求复用,不用申明connection:keep-alive字段
  2. 新增了PUT、PATCH、OPTIONS、DELETE请求方法,也新增了许多状态码
  3. 强制HOST头:HTTP1.0中认为每台服务器都绑定一个惟一的IP地址,所以,请求消息中的URL并无传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上能够存在多个虚拟主机(Multi-homed Web Servers),而且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中若是没有Host头域会报告一个错误(400 Bad Request)。有了Host字段,就能够将请求发往同一台服务器上的不一样网站,为虚拟主机的兴起打下了基础
  4. 缓存处理:HTTP/1.0 使用 Pragma:no-cache + Last-Modified/If-Modified-Since + Expire来做为缓存判断的标准;HTTP/1.1 引入了更多的缓存控制策略:Cache-Control、Etag/If-None-Match
  5. 管道机制(pipelining):即在同一个TCP连接里面,客户端能够同事发送多个请求。从而进一步改善HTTP协议的效率问题服务器

    例如:客户端须要请求两个资源。之前的作法是,在同一个TCP链接里面,先发送A请求,而后等待服务器作出回应,收到后再发出B请求。管道机制则是容许浏览器同时发出A请求和B请求,可是服务器仍是按照顺序,先回应A请求,完成后再回应B请求,经过下图能够很清晰的看出区别
    image.png

1.1缺点:
虽然1.1版容许复用TCP链接,可是同一个TCP链接里面,全部的数据通讯是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为“队头堵塞"(Head-of-line blocking)
解决方案:
一、减小请求数量(雪碧图)
二、多开持久连接,以下图中并行的请求,就是多开了几个TCP连接,可是浏览器也有规定,同一域名下TCP开启的个数时有限,通常不超过10个,这也是SEO中,将资源CDN的缘由。app

image.png

我的看法:1.1版本中增长了许多头部的标识,使得请求更加的灵活,例如类型、缓存等等!利用好了能大幅提高请求效率,也能够看成优化的重点去攻克!可是也有太多的字段须要去学习,有利有弊吧!接下来就是重点HTTP/2post

HTTP/2版本
为何是2而不是2.0,由于标准委员会不许备发布子版本,下一个版本将是HTTP/3
一、二进制传输:在HTTP1.x中,咱们是经过文本的方式传输数据。基于文本的方式传输数据存在不少缺陷,文本的表现形式有多样性,所以要作到健壮性考虑的场景必然有不少,可是二进制则不一样,只有0和1的组合,所以选择了二进制传输,实现方便且健壮。为了保证HTTP不受影响,那就须要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增长一个二进制分帧层。在二进制分帧层上,HTTP2.0会将全部传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers frame,而Request Body则封装到Data frame。
image.png

二、头部压缩(Header Compression):专门为头部压缩设计了Hpack算法,简单来讲就是客户端和服务端共同维护一份相同的静态表和动态表,在编码时直接用表的index代替,能够大幅下降头部大小
image.png

三、服务端推送(server push):容许服务器未经请求,主要向客户端发送资源。

客户端请求一个网页,这个网页里面包含不少静态资源。正常状况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器能够预期到客户端请求网页后,极可能会再请求静态资源,因此就主动把这些静态资源随着网页一块儿发给客户端了

四、多路复用:也是最重要的一项,原由是1.X版本中的“队头阻塞”,这里面有三个比较重要的概念

  • 消息:逻辑上的http消息,好比一系列Data frame 和 一个Header frame 组成的请求消息
  • 帧(frame):最小的数据单位
  • 流(stream):多个帧组成数据流,每一个帧会标识出该帧属于哪一个流,通俗讲流是链接中的一个虚拟信道,能够承载双向消息传输,每个流都有惟一的标识,为了防止两个流ID冲突,客户端发起的流具备奇数ID,服务端发起的流具备偶数ID,全部的HTTP2通讯都在一个TCP连接上完成,这个链接能够承载任意数量的双向数据流Stream。 相应地, 每一个数据流以 消息的形式发送, 而消息由一 或多个帧组成, 这些帧能够乱序发送, 而后根据每一个帧首部的流标识符从新组装。

image.png

举个例子,每一个请求是一个数据流,数据流以消息的方式发送,而消息又分为多个帧,帧头部记录着stream id用来标识所属的数据流,不一样属的帧能够在链接中随机混杂在一块儿。接收方能够根据stream id将帧再归属到各自不一样的请求当中去。
另外,多路复用(链接共享)可能会致使关键请求被阻塞。HTTP2里每一个数据流均可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还能够依赖其余的子数据流。
可见,HTTP2实现了真正的并行传输,它可以在一个TCP上进行任意数量HTTP请求。而这个强大的功能则是基于“二进制分帧”的特性。

宏观上看,基于二进制分帧层,htp2能够在共享TCP连接的基础上,同时发送请求和响应,HTTP消息被分解为独立的帧,交错发出,最后在另外一端根据ID和首部将它们从新组合起来。
image.png

以上就是HTTP2主要的特色,接下来会是HTTP3的特色,未完待续。。。。

相关文章
相关标签/搜索