HTTP1.1 vs HTTP2.0

摘要:关于HTTP,以前的时候只知道HTTP是一个应用层的协议,到底HTTP有什么功能?其实并不了解。在面试中遇到过这种题目–从页面输入一个url到显示页面会发生什么事情?当时跟实验室的师兄聊过,跟他说了我的答案,然后他就问我怎么不说HTTP1.1的持久连接呢?当时我一脸懵逼,持久连接是什么鬼?赶紧HTTP的知识补起来~

HTTP发展史

  • HTTP0.9
    只有一行请求,包括请求方法和路径,响应也只是一个HTML
  • HTTP1.0
    请求行包括请求版本和首部
    响应行包括响应状态和首部
    响应对象可以包含任何类型,包括HTML、纯文本文件、图片或其他类型
    内容编码、字符集支持、多部分类型、认证、缓存、代理行为、日期格式
  • HTTP1.1
    持久连接
  • HTTP2.0
    二进制分帧层

HTTP1.1

HTTP1.1增加了挺多HTTP1.0没有的功能,达到更好的优化,减少延迟,那么HTTP1.1增加的功能有哪些呢?看看下面这些新功能

1.持久连接

HTTP1.0的时候每完成一次请求响应后,TCP连接都会关闭,再次发起HTTP请求的时候又到重新建立TCP连接,每次建立TCP连接时进行TCP三次握手,当一个页面有几十个请求时,带来的延迟可想而知。持久连接就是针对这个问题而建立的,当TCP连接后不关闭,避免多次连接进行TCP三次握手造成的延迟。

2.HTTP管道

HTTP请求队列是先进先出的(FIFO),发送第一个请求,等待响应,然后再发送第二个请求,此时需要等待一次往返时间再进行请求,这个时间段服务器是空闲的,使用HTTP管道把FIFO队列从客户端迁移到服务器上,处理完第一个请求后立即处理第二个请求。

缺点:
1.可能会造成TCP队首拥塞(请求队列是先进先出的,当第一个响应完全返回后第二个响应才能开始传输)
2.现在支持HTTP管道的浏览器不多,通常是做为高级配置设置的

3.使用多个TCP连接

原因:浏览器并不支持多路复用(频分复用,时分复用)

并行打开多个TCP连接(最多6个)可以增加一次发送的请求数量

缺点:
1.会占用更多的内存缓冲区和CPU
2.竞争带宽

4.域名分区

从不同的服务器下拿资源,增加并行请求数,一个域名最多可以建立6个TCP连接,那么分开在多个域名下加载的话就能实现并行加载更多文件,也可以将不同的域名映射到同个IP地址(因为浏览器连接限制的是主机名而不是IP地址)

缺点:从不同服务器下拿资源会增加DNS的请求

5.连接与拼合

把多个css和js组合为一个文件,正常在30-50k左右或者把多张图片拼合成雪碧图,连接与合并以减少HTTP的请求数

HTTP2.0

HTTP2.0跟HTTP1.x最大的不同是HTTP2.0新增了二进制分帧数据层,下面来看看HTTP2.0带来了什么变革吧~

1.二进制分帧层

HTTR1.x使用的是换行符作为纯文本的分隔符,而HTTP2.0将信息分割成更小的消息和帧,并且使用二进制格式进行编码,实现了客户端与服务器的安全通信。

2.流、消息、帧

HTTP2.0的新概念
流:已建立连接的双向字节流,是虚拟的通道,有唯一的标识符
消息:是指HTTP消息,包括HTTP请求消息和HTTP响应消息
帧:帧是最小的通信单位

3.多向请求与响应

由于HTTP2.0使用二进制分帧,所以请求与响应消息被分解为互不依赖的帧,然后乱序发送,最后再重新组合起来
实现了并行发送多个请求而且很好的解决了队首拥塞的问题

4.请求优先级

HTTP2.0提供了优先级的机制,让客户端和服务器根据优先级采取不同的策略,以最优的方法发送流、消息和帧,控制资源的分配

5.每个来源一个连接

有了二进制分帧后,不需要多个TCP连接就能实现多流并行了,并且又是持久化连接,所以客户端与服务器之间只需要一个连接就够了

6.流量控制

流量控制基于窗口更新帧进行,即接受方广播自己能接收多少个字节
流量控制窗口通过WINDOW_UPDATE帧更新
流量控制类似于TCP的拥塞窗口

7.服务器推送

客户端发送一个请求,服务器能给客户端多个响应
服务器推送技术典型的一个例子就是聊天室的实时更新,发送一个请求后服务器有新的消息时主动推送给前台,不用客户端定时请求

8.首部压缩

客户端和服务器使用“首部表”存储键-值对
第一次发送整个首部,之后根据首部表更新变化的键-值对

针对HTTP2.0的优化

去掉HTTP1.x的优化

  • 每个来源使用一个连接,所以不必使用多个TCP连接
  • 去掉连接和拼合,打包资源可能会造成缓存失效,占用内存,延缓执行
  • 利用HTTP2.0,很小的资源也可以并行发送
  • 嵌入资源也可以不用,因为HTTP2.0拥有服务器推送,利用服务器推送就可以实现一次请求多次响应

关于HTTP1.1和HTTP2.0的基础认知差不多就是这样啦~有什么不对的欢迎补充~