HTTP1.0和HTTP1.1的区别
1.长连接
HTTP1.0使用非持久连接,一个TCP连接只能发送一个HTTP请求和响应,完成后自动断开连接
HTTP1.1支持持久连接(长连接),一个TCP连接长时间持续有效,可以传送多个HTTP请求和响应
如何建立长连接
HTTP1.0需要在HTTP投加入Connection:Keep-Alive才可以启用长连接,HTTP1.1默认启动了长连接通过给Keep-Alive
赋值close可以进行关闭。
优点:减少了建立和关闭连接的消耗和延迟。
2.缓存控制
Cache-Control
相对于HTTP1.0的Expires
相比,Cashe-Control
定义的缓存过期时间准确性更高(Expires
所定义的缓存时间是相对服务器上的时间而言的,如果客户端上的时间跟服务器上的时间不一致,则准确性会下降)。如果报文中同时出现Expires
和Cashe-Control
,则Cashe-Control
的优先级更高。Cashe-Control
作为一个通用HTTP头字段,既可以在请求报文中使用,也可以在响应报文中使用,格式为:
"Cache-Control" ":" cache-directive
- no-cache:不是说不被缓存,而是会被缓存,只不过每次在向客户端提供响应数据时,缓存都要向原始服务器再验证缓存的有效性(新鲜度验证)
- no-store:响应不被缓存
- max-age:设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与
Expires
相反,时间是相对于请求的时间。 - max-stale:客户端可以接受这个超过新鲜度的响应对象,但是前提条件是该响应时间的过期时间必须小于
max-stale
- min-fresh:表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应(指定秒数内不更新)
- public:表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存
- private:表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)
缓存校验
Cashe-Control
决定了数据是否可以被缓存和缓存过期的时间。但如果缓存过期了,而服务器其实没有更新过数据,重新请求一次资源就会很浪费时间和资源。缓存校验通过判断缓存是否被修改过进而决定是否重新发送数据。
解决方案1:
Last-Modified
:根据最后修改时间匹配
服务器将资源传递给客户端时,会将资源最后更改的时间以Last-Modified: GMT
的形式加在实体首部上一起返回给客户端。客户端会为资源标记上该信息,下次再次请求时,会把该信息附带在请求报文中一并带给服务器去做检查。至于传递标记起来的最终修改时间则有两种不同的方法:
1. If-Modified-Since: Last-Modified-value
If-Modified-Since: Thu, 31 Mar 2016 07:07:52 GMT
该请求首部告诉服务器如果客户端传来的最后修改时间与服务器上的一致,则直接回送304 和响应报头即可,否则返回200和新的数据。
2. If-Unmodified-Since: Last-Modified-value
当资源在指定的时间之后没有进行过修改的情况下,服务器返回200和数据,如果所请求的资源在指定的时间之后发生了修改,那么会返回 412
解决方案2:
ETag
:根据资源标识符匹配(资源指纹)
根据Last-Modified
匹配有一个缺点,如果一个资源修改了,但实际内容没有发生任何变化,会因为Last-Modified
匹配不上而返回整个实体给客户端或者直接返回412,为了解决这种问题,Http1.1推出了根据资源标识符匹配的方法。
服务器会通过某种算法,给资源计算得出一个唯一标志符 (比如md5标志) ,在把资源响应给客户端的时候,会在实体首部加上ETag: 唯一标识符
一起返回给客户端。客户端会保留该 ETag 字段,并在下一次请求时将其一并带过去给服务器。服务器只需要比较客户端传来的ETag跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。传递标识符也有两种不同的方法:
1. If-None-Match: ETag-value
If-None-Match: "56fcccc8-1699"
资源匹配返回200和请求资源,资源不匹配验证失败则返回304和响应报头或直接返回412
2. If-Match: ETag-value
资源匹配返回200并返回资源或者允许上传资源。不匹配则返回4开头的状态码。
3.节约带宽
在HTTP头部引入了range字段,可以用于告知服务器只返回文件的某个部分。在一个 Range
首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 206Partial Content
状态码。假如所请求的范围不合法,那么服务器会返回416.
Range: bytes=start-end
另外一个节约带宽的方法就是压缩要传送的数据。Content-Encoding
列出了对当前实体消息(消息荷载)应用的任何编码类型,以及编码的顺序。在请求消息中加入Accept-Encoding
头域,它可以告诉服务器客户端能够解码的编码方式。
4.Host域
HTTP1.0中默认每台服务器都绑定唯一的一个IP地址,所以请求消息中url并没有传递主机名,也就是hostname,但后面的虚拟主机技术使得一个物理服务器上面可以存在多个虚拟主机,他们共享一个ip地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
5.错误提示
http1.1版本新增了24个错误状态响应码。
HTTP1.x和HTTP2.0的区别
HTTP/2
是 HTTP 协议自 1999 年 HTTP1.1
发布后的首个更新,主要基于 SPDY 协议。
与HTTP1.x
相比主要有四点区别
1.采用二进制格式进行数据传送
HTTP1.X
是基于文本进行数据传送的,基于文本协议的格式解析并不健全。二进制格式解析起来更加高效。
2.多路复用
HTTP1.x
有个问题叫线端阻塞(head-of-line blocking), 它是指一个连接一次只提交一个请求的效率比较高, 多了就会变慢。HTTP1.1
通过长连接来解决这个问题, 但是效果并不理想(数据量较大或者速度较慢的响应, 会阻碍排在他后面的请求)。
多路传输能很好的解决这些问题, 因为它能同时处理多个消息的请求和响应。HTTP2请求的TCP连接一旦建立,后续请求以stream的方式发送。每个stream的基本组成单位是frame(二进制帧)。客户端和服务器可以把 HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。
3.HTTP头压缩
HTTP1.x
的header带有大量信息,而且每次都要重复发送,HTTP2.0
使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
4.服务器推送
当用户的浏览器和服务器在建立连接后,服务器主动将一些资源推送给浏览器并缓存起来的机制。有了缓存,当浏览器想要访问已缓存的资源的时候就可以直接从缓存中读取了,这样可以有效减少请求次数。