HTTP1&HTTP2
HTTP1#
HTTP(Hypertext Transfer Protocol)超文本传输协议
它是用来在Internet上传送超文本的传送协议。它是运行在TCP/IP协议簇之上的HTTP应用协议,它可以使浏览器更加高效,使网络传输减少。任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用用户请求。您的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由URL指定的IP地址。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。
在HTTP1.0版本中,前端需要在向后端发起请求的时候添加keep-alive
头部来知会后端此次数据传输需要开启长连接,但是因为数据传输的不同,并非所有的传输都要建立长连接,所以对每次请求都发起一个新的请求显然是一种浪费的表现。
在HTTP1.1中,HTTP协议默认支持长连接,但是默认的支持长连接可能会造成带宽/服务器资源的浪费。所以在HTTP1.1中,header信息和body信息并非同步被发送到服务器,HTTP1.1会先接受header信息并处理返回,前端再根据返回的结果决定是否继续传输数据(1xx同意/4xx拒绝)。
同时,在早起的HTTP1.0协议中,协议并不认为同一服务器上包含一个以上的ip地址,显然在现在有虚拟机分割的情况下,HTTP1.1协议加入和Host头部,为所有的request和response信息提供一个地址。
HTTP2#
HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合作共事性测试。在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。
HTTP2主要新内容#
- 多路复用
- 头部压缩
- 流式数据
- 二进制数据形式
- 服务端推送
多路复用#
在HTTP1.x中,浏览器对后端发起的请求一般采用管道(HTTP2使用的是二进制传送,二进制传送的单位是帧和流),可以理解为队列,
头部压缩#
随着页面的发展,会有越来越多的静态资源会随着网页页面的加载而被请求,如图片、css、字体等等,但是其实我们每一次请求这一类资源都是使用(基本)相同的请求头部,甚至是多余的(比如重复的cookie,timestamp等等),这个时候,header压缩就显得十分之有必要了。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号。(p.s. HTTP2的头部压缩使用HPACK算法)
流式数据#
HTTP2使用的是二进制传送,二进制传送的单位是帧和流,不需要像HTTP1一样按包为传输单位,这再次提高了长连接的效率
服务端推送#
在tcp/ip连接建立之后,服务端可以在未经请求的情况下,自行向客户端推送内容。