概述
HTTP1.0与HTTP1.1的区别
- 长连接
- 节约带宽
- HOST头部
- 分块传输
长连接:HTTP1.0需要使用Conection: keep-alive 来告知服务器端建立一个长连接,而HTTP1.1默认支持长连接,HTTP协议是架构在TCP/IP协议之上的,TCP建立连接需要三次握手,如果每次请求都需要重新建立连接,效率不高,因此可以维护一个长连接,用来发送多个请求。虽然HTTP1.1支持管道传输,即在同一个TCP连接中发起多个请求,但是服务端却必须按照请求到达的顺序返回相应的结果,以保证客户端能够区分每次请求的内容,要是服务器回应第一个到达的请求非常缓慢,则会阻塞后面的请求,这就是“队头阻塞”,为了解决这个问题,浏览器允许同时打开多个TCP连接,一般同域可支持6~8个资源并行下载;
节约带宽:HTTP1.1加入了一个新的状态码100(continue),客户端事先发送只带
头域的信息到server端,若服务端返回100,则在传送带body的完整请求,若返回401,则就不用再传了。
HOST:head中增加了host属性,支持多个虚拟站点共享同一个ip
分块传输:HTTP1.1可使用 Transfer-Encoding: chunked 来说明server端的响应 由数量未定的数据块组成;每个非空的数据块之前,会有一个16进制的数值,表示这个块的长度。最后是一个大小为0的块,就表示本次回应的数据发送完了
HTTP1.1与HTTP2.0的区别
- 多路复用
- 二进制分帧
- 首部压缩
- 服务器推送
所有的HTTP2.0通信都在一个TCP连接上完成,这个连接可以承载任意数量的双向数据流,并发请求数量相比HTTP1.1要高几个数量级
每个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧头部的流标识符(stream id)重新组装。
举个例子,每个请求是一个数据流,数据流以消息的方式发送,而消息又分为多个帧,帧头部记录着stream id用来标识所属的数据流,不同属的帧可以在连接中随机混杂在一起。接收方可以根据stream id将帧再归属到各自不同的请求当中去。
另外,多路复用可能会导致关键请求被阻塞。HTTP2.0里每个数据流都可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还可以依赖其他的子数据流。
可见,HTTP2.0实现了真正的并行传输,它能够在一个TCP上进行任意数量HTTP请求。而这个强大的功能则是基于“二进制分帧”的特性。
二进制分帧:HTTP2.0在应用层和传输层之间加了一个二进制分帧层,用来突破HTTP1.1的性能瓶颈,提高传输性能
头部压缩:在HTTP1.1中,头部是以文本的形式传输的,且很多都是重复发送的,HTTP2.0通过压缩头部大小,且缓存一份header fields表,既减小了传送的体积,也避免重复发送
服务器推送:服务器除了对最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求
HTTP缓存机制
强制缓存:在缓存数据未失效的情况下,可以直接使用缓存数据,不必在与服务器发生交互。那如何判断缓存是否过期呢?
在HTTP1.0是通过Expires的值,Expires的值表示资源的过期时间,当下一次请求时间小于到期时间,则直接取缓存数据。但由于客户端与服务端的时间难免存在误差,所以HTTP1.1采用Cache-Control替代
Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不缓存
对比缓存:浏览器第一次请求数据时,服务器会将缓存标识和数据一同返回给客户端,客户端将二者缓存起来,当第二次发送请求时,客户端先将缓存标识发送给服务器,由服务器根据标识判断缓存数据是否可用,如可用,则返回304状态码,通知客户端缓存可用
两种缓存标识的介绍
- Last-Modified / If-Modified-Since
- Etag / If-None-Match (优先级比前者高)
Last-Modified:在服务器响应请求时,在Respone Headers 中返回,用来告诉浏览器资源的最后修改时间
If-Modified-Since: 再次请求时,通过此属性通知服务器上次请求时,服务器返回的资源最后修改时间,服务器接收到If-Modified-Since头后,则与被请求资源的最后修改时间作比较,若资源的最后修改时间大于If-Modified-Since,说明资源又被改动过,则响应整片资源内容,返回状态码200;
若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache
Etag:服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)
If-None-Match:再次请求服务器时,通过此字段通知服务器客户段缓存数据的唯一标识。
服务器收到请求后发现有头If-None-Match 则与被请求资源的唯一标识进行比对,
不同,说明资源又被改动过,则响应整片资源内容,返回状态码200;
相同,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache
最后
以上就是优美乌龟为你收集整理的HTTP基础的全部内容,希望文章能够帮你解决HTTP基础所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复