HTTP1.0

特点:

  • 无状态
  • 短连接

为了保证HTTP简单高效,HTTP提供的是无状态的短连接。

无状态可以通过Cookie和Session机制来解决。

而短连接的缺陷就是无法复用一个连接,导致性能的损失,每次请求都要通过三次握手与服务器建立一个TCP连接,处理完后又要四次挥手断开连接。

其次就是队头阻塞:
HTTP1.0规定下一个请求只有在前一个请求响应到达前才能发送,如果一个请求一直不到达或者等待了过长的时间,那么下一个请求就需要等待一段时间,后面的请求自然也就阻塞了,这造成了效率的降低。

HTTP1.1

Connection

HTTP1.1对短连接进行了改进,增加了一个Connection字段,通过设置Keep-alive字段可以保持HTTP连接不断开,避免了每次客户端和和服务器进行连接,如果客户端想关闭长连接,可以在请求头携带Connection:false来告知服务端。
这样通过在一条连接上打开多个TCP连接来达到并行传输数据的效果。

分块传输编码

Chunked Transfer Encoding,可以把数据分割成多块,让浏览器逐步显示页面。

Host头处理

1.0认为每个服务器只绑定唯一的IP地址,因此URL没有传递主机名。而现在一台物理服务器上可以存在多个虚拟主机,并且共享一个IP地址,1.1请求和响应支持Host域,可以传送数据到一个定点的主机上

流水线

HTTP1.0时默认情况下HTTP请求是按顺序发出的,只有上一个请求收到响应之后才会被发出,由于带宽和网络的影响,上一个请求可能会响应很久,这样导致下一个请求迟迟不能发出。

而HTTP1.1支持流水线,可以在一条长连接上连续发送请求,这样可以减少延迟。

HTTP2.0

服务器推送

能把客户端需要的资源伴随着index一起发送到客户端,省去了客户端重复请求的步骤。

二进制分帧

HTTP2.0在应用层和传输层之间增加了一个二进制帧,以增加传输效率
HTTP2.0并没有修改HTTP1.x的语义,只是将原来1.x的header和body部分用frame封装了一层而已。

多路复用(连接共享)

概念:

  • 流:已建立连接上的双向字节流
  • 消息:与逻辑消息对应的完整一系列数据帧
  • 帧:HTTP2.0通信的最小单位,每个帧包含头部,会标识出当前帧的ID。

image.png
由图可看出,一条TCP连接上有过个Stream流,在流上数据以消息的形式双向发送,而一个消息由一个或多个帧组成,这些帧可以乱序发送,然后按照帧头部的流标识符重新组装。
除此之外,每个数据流还可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端。
HTTP2.0实现了真正的并行传输,能在一个TCP上进行任意数量的HTTP请求。

头部压缩

在HTTP1.x版本中,头部数据以纯文本的形式发送,这会给每个请求增加一定字节的负荷。
HTTP2.0中:

  • 对头部进行编码压缩以减小头部的大小
  • 通讯双方各自缓存一个header fields表,避免了重复header的传输。

HTTP的相关头域

通用头域:

  1. Cache-Control头域:指定请求和响应时应遵循的缓存机制,可以指定任何区域都可缓存,或者不保存,接受不超过生存期大于多少的缓存
  2. Date:指定消息发送的时间

请求头域:

1.Host头域:指定请求资源的主机号和端口号,http1.1必须包含主机头域
2.Reference:指定了客户端请求url时,客户端所在的资源地址,允许服务器生成回退链表。
3.Range头域:可以请求一个实体的一个范围
4.User-agnet:表示头域的内容包含发出请求的用户信息

响应头域

1.Location:用于得到一个重定向到一个新的url
2.Server :Server响应头包含处理请求的原始服务器的软件信息