HTTP1.1和HTTP2.0新特性

HTTP1.1

长连接

在http1.0时代,每发送一个http请求都会建立一个tcp连接,发送回响应后,连接就会关闭。而TCP连接的建立需要三次握手,极大的浪费了性能。同时一个连接的发起必须是在前一个连接的响应之后。
在http1.1中允许了长连接,当建立起一个tcp连接之后,多个http访问可以复用这个连接,是通过http请求头中的keep-alive来标识的。
其次,http1.1支持了连接的管道化。管道化使得连接请求可以“并行”的发送(并不是真的并行)。比如当我们请求一个index.html的时候,不必等到index.html返回我们就可以继续请求img资源。但是服务端还是按照FIFO来响应的。所以并不是真的并行
现在的浏览器都允许建立多个TCP连接来进行并行请求。但因为浏览器自身的Max-Connection最大连接数的限制,同一个域名(host)下能够建立的TCP数量是一定的。所以我们可以采用CDN将静态资源文件放在不同域名下来保证请求的速度。

宽带优化

在http1.0中,我们有时会对资源造成一定的浪费。比如有时我们只需要一个对象的一部分,我们却将整个资源都传过来了。
在http1.1中,增加了range头域,它允许只请求某个资源的一部分,返回码是206。方便了开发者自由的选择以便于充分的利用宽带。
http1.1支持head请求,也就是只有响应头,没用响应正文。

Host头处理

http1.1增加了host请求头字段,在http1.0中认为一个服务器绑定一个唯一的域名。但现在一台服务器上可以有多个虚拟主机,共享一个ip。
如果消息头中没用host字段,会报400错误

缓存处理

http1.1引入了更多的缓存处理策略。
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1引入了Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

  • ETag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag也会别修改,所以ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB服务器判断一个对象是否改变了。比如前一次请求某个 html 文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag进行对比,然后就知道这个文件有没有改变了。
  • Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是HTTP/1.0 的头部。例如:Expires:Sat, 23 May 2009 10:02:12 GMT
  • If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。
  • If-None-Match:如果对象的ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。
  • If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu,10 Apr 2008 09:14:42 GMT
  • If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
  • If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的 ETag 或者自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
  • Last-Modified:WEB服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May2008 02:42:43 GMT

SPDY

spdy是google在2012推出的基于SSL/TSL的传输协议。SPDY有着延迟降低,多路复用,头部压缩,服务器推送等特点。这些特点也成为了后续http2.0功能的基石。
SPDY和http2.0的区别

  1. HTTP2.0的头部压缩才有HPACK,SPDY采用DELEFT。
  2. HTTP2.0在理论上支持明文传输,但SPDY强制要求使用HTTPS

HTTP2.0

二进制流

http1.1采用的是文本传输,文本的表现形式很多,如果要做到健壮性,要考虑非常多的场景。
http2.0将传输的消息分割未更小的帧,并采用二进制的编码。其中首部信息被封装到Headers帧,而我们的request body封装到data帧。
HTTP1.1和HTTP2.0新特性_第1张图片

压缩头部

http2.0在客户端和服务器共同维护一个头部表head list,由客户端和服务端一起维护。对于相同没用变化的头部,不再传输,每次只将有变化的头部封装到headers frame中。新增和修改的头部会被追加到头部表中。

多路复用

先讲几个概念

  • 流:TCP建立的连接就是双向字节流
  • 消息:一系列完整的数据帧构成一个消息
  • 帧:HTTP2.0的最小通信单位,由headers和data成对出现。会标注出当前帧所属的流

http1.1默认采用持久连接,但浏览器在获取到响应之前也只能等待。
http2.0将消息分解为独立帧,交错发送,然后在另外一端重新组装,这样一个连接上就可以存在多个请求和响应。

多路复用可以设置优先级,让优先级高的消息先处理

如果说http1.1对同一个域名可以建立6个tcp连接,那么http2.0只需要一个tcp连接,那么性能相当于提升了6倍!

http2.0的多路复用到底有多块?
http优化的新能不是高宽带,而是低延迟。TCP有慢启动的功能,在TCP建立的开始会限制连接的速度,随着请求的一个个响应速度越来越快。如果只使用一个TCP连接,可以更高效的使用

服务器推送

指的是服务器还没有收到请求,就将要用到的资源推送给浏览器。
比如浏览器只请求了index.html,服务器可以把index.html、css、js
img文件都传送给浏览器。这样的话,只需要一轮http通信,浏览器就可以得到所需要的全部资源。

你可能感兴趣的:(网络)