1、定义
http协议:超文本传输协议(通讯协议),用于从服务器传输超文本到本地浏览,创建再TCP/IP协议基础上
三个特色:
一、无链接
是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间
二、无状态
是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快
三、灵活
容许传输任意类型的数据对象。传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记 javascript
HTTP/0.9版本
特色:结构简单,仅有GET请求,纯文本格式css
例如GET /index.html
表示:TCP创建链接后,客户端向服务端请求index.html页面,协议规定,服务端只能返字符串,返回后即关闭TCP连接,若是请求的页面不存在,也不反悔任何错误码,这也是无状态的一个体现
HTTP/1.0版本
相比较上一个版本增长了以下主要内容:html
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能够复用,直到主动关闭连接。算法
上面是又没有keep-alive的区别,可是这不是标准字段,不一样实现的行为可能不一致,所以不是根本的解决办法,而且TCP的新建成本很高,由于每次连接服务端和客户端都须要通过三次握手,而且开始时发送的速率较慢。浏览器
HTTP/1.1版本
也就是目前位置用的最多的一个版本,相比较1.0版本增长了:缓存
管道机制(pipelining):即在同一个TCP连接里面,客户端能够同事发送多个请求。从而进一步改善HTTP协议的效率问题服务器
例如:客户端须要请求两个资源。之前的作法是,在同一个TCP链接里面,先发送A请求,而后等待服务器作出回应,收到后再发出B请求。管道机制则是容许浏览器同时发出A请求和B请求,可是服务器仍是按照顺序,先回应A请求,完成后再回应B请求,经过下图能够很清晰的看出区别
![]()
1.1缺点:
虽然1.1版容许复用TCP链接,可是同一个TCP链接里面,全部的数据通讯是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为“队头堵塞"(Head-of-line blocking)
解决方案:
一、减小请求数量(雪碧图)
二、多开持久连接,以下图中并行的请求,就是多开了几个TCP连接,可是浏览器也有规定,同一域名下TCP开启的个数时有限,通常不超过10个,这也是SEO中,将资源CDN的缘由。app
我的看法: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。
二、头部压缩(Header Compression):专门为头部压缩设计了Hpack算法,简单来讲就是客户端和服务端共同维护一份相同的静态表和动态表,在编码时直接用表的index代替,能够大幅下降头部大小
三、服务端推送(server push):容许服务器未经请求,主要向客户端发送资源。
客户端请求一个网页,这个网页里面包含不少静态资源。正常状况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器能够预期到客户端请求网页后,极可能会再请求静态资源,因此就主动把这些静态资源随着网页一块儿发给客户端了
四、多路复用:也是最重要的一项,原由是1.X版本中的“队头阻塞”,这里面有三个比较重要的概念
举个例子,每一个请求是一个数据流,数据流以消息的方式发送,而消息又分为多个帧,帧头部记录着stream id用来标识所属的数据流,不一样属的帧能够在链接中随机混杂在一块儿。接收方能够根据stream id将帧再归属到各自不一样的请求当中去。
另外,多路复用(链接共享)可能会致使关键请求被阻塞。HTTP2里每一个数据流均可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还能够依赖其余的子数据流。
可见,HTTP2实现了真正的并行传输,它可以在一个TCP上进行任意数量HTTP请求。而这个强大的功能则是基于“二进制分帧”的特性。
宏观上看,基于二进制分帧层,htp2能够在共享TCP连接的基础上,同时发送请求和响应,HTTP消息被分解为独立的帧,交错发出,最后在另外一端根据ID和首部将它们从新组合起来。
以上就是HTTP2主要的特色,接下来会是HTTP3的特色,未完待续。。。。