HTTP各版本之间的比较

376 阅读4分钟

HTTP1.0

  规定浏览器与服务器之间只保持短暂的连接,浏览器每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,会造成性能缺陷。
比如:浏览器请求网页,里面包含一些图片,JS,CSS文件。当浏览器解析HTML内容时,发现有图片,又会重新建立一个TCP连接去请求数据,而每个连接只传输一个文档或图像,即使图像很小。TCP连接每次都会经历三次握手和慢启动,因此这种当时的响应速度会很慢。

HTTP1.1

  支持持久连接(connection: keep-alive),一个TCP连接上可以传送多个HTTP请求和响应,减少建立连接和关闭的消耗和延迟。
  还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求。但服务端必须按照接收到客户端的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。
  如果不希望使用长连接,可以将请求头部的connection设置为close。这样在此条请求处理完之后会断开连接。客户端进行请求时必须创建新的连接。
  同时,还增加了更多的请求头和响应头来改进和扩充http1.0。比如:增加HOST请求字段,指定服务器的域名,可以实现在一台服务器上的同一个IP地址和端口号上使用不同主机名来创建多个虚拟WEB站点;还有cookie字段、Authorization等。

HTTP2.0

1. 多路复用

  允许同时通过单一的HTTP/2连接发起多重的请求-响应信息。HTTP/1.1协议中浏览器在同一时间,针对同一域名下的请求有一定数的限制,超过限制数的请求会被阻塞。多重的请求-响应消息允许很容易地去实现多流并存而不用依赖建立多个连接。

2. 二进制分帧

  HTTP/2会对所有传输的信息分割为更小的信息和帧,并对它们采用二进制格式的编码,其中HTTP1.X的头部会被分装到头信息帧中,数据体被分装成数据帧。这种单链接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大,而且由于TCP连接的减少使得网络拥塞状况得以改善,同时慢启动时间的减少,使得拥塞和丢包恢复速度更快。

3. 数据流

  HTTP/2的数据包是不按顺序发送的,同一个连接里面的数据包,可能属于不同的响应。因此,必须要对数据包做标记,指出它属于哪个响应。HTTP/2将每个请求或响应的所有数据包称为一个数据流。每个数据流都有一个独一无二的编号,数据包发送的时候,都必须标记数据流 ID,用来区分它属于哪个数据流。
客户端发出的数据流,ID为奇数,服务器发出的ID为偶数。
 客户端还可以指定数据流的优先级,越高会越早回应。

4. 头信息压缩

  HTTP协议不带有状态,每次请求都必须附上所有信息。所以,请求的很多字段是重复的,比如cookie和userAgent,一模一样的内容,每次请求都必须附带,会浪费很多带宽,影响速度。
一方面,头信息使用gzip或者compress压缩后再发送;另一方面,客户端或服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号。只发送一个索引号,提高速度。

5. 服务器推送

  允许服务器未经请求,主动向客户端发送资源。
比如客户端请求网页,里面包含很多静态资源,服务器预期到客户端请求网页后,很有可能会再请求静态资源,所以就主动把这些静态资源随网页发送给服务器。