什么是HTTP
HTTP是基于 TCP/IP 协议的应用层协议。主要规定了客户端与服务器之间的通信格式,(默认使用80端口)
HTTP/0.9
- 只有一个get请求方法。
- 服务器只能返回HTML格式的字符串,不能返回别的格式。
请求:
GET /index.html
返回:
<html>
<body> Hello Wrold</body>
</html>
HTTP/1.0
优点
- 任何格式的内容都可以发送,不仅可以传输文字,还能传输图像、视频、二进制文件。
- 除了GET请求,还引入了 POST 命令和 HEAD 命令。
- HTTP 请求和返回的格式也变了,除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。
缺点
- 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)之间增加了一个二进制分帧层,改进了传输性能,实现低延迟和高吞吐量。

2. 多路复用(连接共享)
- 流(Stream):已建立的 TCP 连接上的双向字节流,可以承载一个或多个消息。
- 消息(Message):一个完整的 HTTP 请求或响应,由一个或多个帧组成。
- 帧(Frame):HTTP/2 通信的最小单位,每个帧包含帧头部,至少也会标识出当前帧所属的流(sream id)
HTTP/2 建立一个TCP连接,一个连接上面可以由任意多个流(stream)。消息分割成一个或多个帧再流里面传输。帧传输过去以后,接收方可以根据 stream id 将帧归属到各自的请求中,形成一个完整的请求或响应。这使得所有的请求或响应都无法阻塞。
HTTP/2 里每个数据流都可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还可以依赖其他的子数据流。

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

3. 头信息压缩
HTTP 协议不带有状态,每次请求都会必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent,一模一样的内容,每次请求都必须附带,这会影响速度。
HTTP/2 引入了头信息压缩。一方面。头信息使用 gzip 和 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头部信息表,所有的字段都会存入这个表,生产一个索引号,以后就不发送同样字段,只发送索引号,这样就提高速度了。
4. 服务器推送
HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫服务器推送。
常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到页面后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端收到请求网页后,很可能会再请求静态资源,所以主动把这些静态资源随着网页一起发给客户端了。