HTTP1.0与HTTP1.1
HTTP1.0是短连接,即每一次请求都需要建立一个连接,即短连接。
在1.0中,每一次请求都需求建立一个连接,而HTTP协议是建立在TCP协议上,TCP建立连接时需求进行3次握手的,那么1.0中的网络效率不高且浪费资源。
在HTTP1.1中添加了一些新特性:
- 持久化连接,即长连接。
- header头部字段的添加:如host,cache-control,transfer-encoding、content-length、range等
- 管线化,但大多数浏览器是默认关闭,
-
还有很多...
长连接:
长连接会保持多次请求的连接,减少重新打开连接的次数和时间,当然这个连接也并不会一直处于连接状态,当空闲一段时间都,连接就会断开;可以通过设置keep-alive来设置等待时间。但在空闲时间里,长连接也是继续消耗资源的。
host:主机域名/ip+端口号,同于定位访问是哪个服务,因为存在一台服务器器上有两个虚拟机,并都开启的服务。
cache-control:HTTP缓存,加速资源加载,特别是一些静态资源:如图片等,有效提升页面访问速度。
range、content-length、transfer-encoding:可应用于断点续传
管线:管线化,即HTTP请求不同等待前一个请求返回,就可以发送下一个请求。在HTTP1.1时代,出于
- 代理服务器不确定的行为
- 正确的使用管线过于复杂:资源的大小;有效改善有多少;消息的延迟性,等等
- 受限于HOL
),简单来说是,当浏览器中允许的并行请求数用完时,之后的请求需要等待前一个请求完成,这种请求会造成HOL。
所以在大多数浏览器中是关闭的。
当浏览器请求数用完时,所造成的阻塞,在HTTP1.1时代,是可以通过域名分片的方式来解决。
域名分片
浏览器的并行请求数是针对于同一个域名下,所以当请求不同域名的下的资源时,并行请求数就变多了。当然现在有了HTTP2.0,就不需要了。
HTTP2.0
HTTP2.0主要就是解决额HOL问题。
HTTP2.0是在HTTP1.1的基础上,引入SPDY(由Google开发的协议),进行升级的。
二进制分帧
HTTP2.0是采用二进制格式进行传输,而非HTTP1.1.中的文本格式。将原先的文本消息采用二进制后的称之为帧。
如上图所示:原先的文本的header、body 变成帧header frame、data frame。当然还是其他frame。目前有10种frame,用type来进行区分,每个frame都有自己的二进制格式,封装在Frame Payload字段中。
在HTTP/2中,还有stream(流)、message(消息)的概念,关系如下图。
stream中有Stream Identifier,即stream的id,用于区分其他stream。
stream中包含message,message即request message、response message。
message由frame来进行传输。
stream的重要特性:
- 单个HTTP / 2连接可以包含多个并发打开的流,其中任一端点都可以交错多个流中的帧。
- 流可以单方面建立和使用,也可以由客户端或服务器共享。
- 可以通过任一端点关闭流。
- 在流上发送帧的顺序很重要。收件人按接收顺序处理帧。特别地,HEADERS和DATA帧的顺序在语义上很重要。
- 流由整数标识。通过端点启动流,将流标识符分配给流。
多路复用
多路复用是指在一个tcp连接中,客户端、服务端可以发送或接受多个请求或响应。即解决了HTTP1.1中的HOL问题。
多路复用其实也是基于stream的特性。
头部压缩
HTTP/1.x 每次请求和响应,都会携带大量冗余消息头信息,比如Cookie和User Agent,基本一样的内容,每次请求浏览器都会默认携带,这会浪费很多带宽资源,也影响了速度。这是因为HTTP是无状态协议,每次请求都必须附上所有信息,从而导致了每次请求都带上大量重复的消息头。
为此,HTTP/2做了优化,对消息头采用HPACK格式进行压缩传输,并对消息头建立索引表,相同的消息头只发送索引号,从而提高效率和速度。
关于索引:常用的 http Header放在索引表里,请求的时候便只需要发送在表里的索引位置即可
服务器推送
服务器可以对一个客户端请求发送多个响应,服务器向客户端推送资源无需客户端明确地请求。并且,服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。
所以HTTP2.0中的服务器推送跟websocket这类是不一样的,并不是真正意义上的主动请求。
请求优先级
可以通过设置frame的优先级信息来为新的frame分配优先级。
优先级排序的目的是允许端点表达在管理并发流时希望其对等方分配资源的方式。最重要的是,当发送能力有限时,可以使用优先级来选择要发送帧的流。
如:如果服务器的带宽决定了它只能接受n个请求,那么当n+1个请求过来时,还是可能会出现阻塞的。那么HTTP2.0中的请求优先级就派上了用场。
参考
1.Hypertext Transfer Protocol Version 2 (HTTP/2)
2. Hypertext Transfer Protocol -- HTTP/1.1——Connections
3. Hypertext Transfer Protocol -- HTTP/1.1——Transfer Codings
4.HTTP/1.x 的连接管理
5.Head-of-line blocking
6.HTTP 2.0 和 HTTP 1.1 相比有哪些优势呢?
7.天天见之HTTP Header Range 和 Content-Range 你真的了解吗?
8.天天见之HTTP Header Content-Length 和 Transfer-Encoding,你真的了解吗?
网友评论