HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2简介

529 阅读5分钟

什么是HTTP

HTTP是基于 TCP/IP 协议的应用层协议。主要规定了客户端与服务器之间的通信格式,(默认使用80端口)

HTTP/0.9

  • 只有一个get请求方法。
  • 服务器只能返回HTML格式的字符串,不能返回别的格式。

请求:

GET /index.html

返回:

<html>
    <body> Hello Wrold</body>
</html>

HTTP/1.0

优点

  1. 任何格式的内容都可以发送,不仅可以传输文字,还能传输图像、视频、二进制文件。
  2. 除了GET请求,还引入了 POST 命令和 HEAD 命令。
  3. HTTP 请求和返回的格式也变了,除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。

缺点

  1. HTTP/1.0 版本的主要缺点是,每个 TCP 连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。TCP 连接的成本很高,因为需要客户端与服务端三次握手,并且开始的时候速率很慢。

请求格式:

GET /HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh: Inter Mac OS X 10_10_5)
Accept: */*(声明接受那些数据格式)

返回格式:

HTTP/1.0 200 OK
Content-Type : text/plain(声明数据是什么格式)
Content-Length : 137582(字段不是必须的)
Expires: Hu,05 Dec 1995 12:00:00 GMT
Last-Modified:Wed, 5 August 1995 11:50:00 GMT
Server: Apache 0.84

<html>
    <body> Hello Wrold</body>
</html>

HTTP/1.1

优点

1. 增加持久性连接

也就是多个请求和响应可以利用同一个 TCP 连接,而不是每一次请求响应都要新建一个 TCP 连接,减少了建立和关闭连接的消耗和延迟。

Connection: keep-alive

2. 增加管道机制

既在同一个TCP连接中,客户端可以同时发送多个请求,但是响应必须按照请求发出的顺序依次返回,性能在一定程度上得到了改善。

3. 分块传输

在HTTP/1.1 版本中,可以不用等待数据完全处理完毕再返回,服务器产生部分数据,那么就返回部分数据,

4. 增加 host 字段

使得一个服务器能够用来创建多个 Web 站点

5. 错误提示

HTTP/1.1 引入了一个 waring 头域,增加对错误和警告信息的描述,此外,在 HTTP/1.1 中新增24个状态响应码(100,101,203,205,206,301...)

缺点

1. 队头堵塞。

在同一个 TCP 连接里面,所有的数据通信是按次序排序的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为“队头堵塞”。

HTTP/2

1. 二进制分帧层

HTTP/2 性能提升的核心就在于二进制分帧层。在应用层(HTTP/2)和传输层(TCP or UDP)之间增加了一个二进制分帧层,改进了传输性能,实现低延迟和高吞吐量。

HTTP/1.1响应的是文本格式。2.0把响应划分成两个帧,图中 HEADERS(首部)和 DATA (消息负载)是帧的类型。

2. 多路复用(连接共享)

  • 流(Stream):已建立的 TCP 连接上的双向字节流,可以承载一个或多个消息。
  • 消息(Message):一个完整的 HTTP 请求或响应,由一个或多个帧组成。
  • 帧(Frame):HTTP/2 通信的最小单位,每个帧包含帧头部,至少也会标识出当前帧所属的流(sream id)
    HTTP/2 建立一个TCP连接,一个连接上面可以由任意多个流(stream)。消息分割成一个或多个帧再流里面传输。帧传输过去以后,接收方可以根据 stream id 将帧归属到各自的请求中,形成一个完整的请求或响应。这使得所有的请求或响应都无法阻塞。

HTTP/2 里每个数据流都可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还可以依赖其他的子数据流。

打开控制台可以看到,HTTP/1.1的方式,后面的图片加载时间主要耗时再stalled,stalled的意思是从TCP连接建立完成,到真正可以传输数据之间的时间差。这就是队头阻塞,前面的请求没有处理,后面的请求都在排队等待。

这里的例子只直观的看到多路复用起到的优化作用。因为HTTP2实现了请求并发,后面的请求不用再等待,记载时长当然少很多。

请求依然再排队,但是排队的时间相对1.1少很多。一个TCP连接可以有任意数量的流,也就是可以并发任意数量的请求,为什么还会排队?因为不管客户端还是服务器,能同时处理请求或响应都是有限的。

3. 头信息压缩

HTTP 协议不带有状态,每次请求都会必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent,一模一样的内容,每次请求都必须附带,这会影响速度。

HTTP/2 引入了头信息压缩。一方面。头信息使用 gzip 和 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头部信息表,所有的字段都会存入这个表,生产一个索引号,以后就不发送同样字段,只发送索引号,这样就提高速度了。

4. 服务器推送

HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫服务器推送。

常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到页面后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端收到请求网页后,很可能会再请求静态资源,所以主动把这些静态资源随着网页一起发给客户端了。