Skip to content

HTTP 网络协议历史

HTTP5个版本介绍及特点

HTTP/0.9

最早版本是1991年发布的0.9版。该版本极其简单,只有一个命令GET。协议规定,服务器只能回应HTML格式的字符串,不能回应别的格式。服务器发送完毕,就关闭TCP连接。

HTTP/1.0

1996年5月,HTTP/1.0 版本发布。除了GET,还引入了POST和HEAD方法,丰富了浏览器与服务器的互动手段。此时不仅可以传输文字,还能传输图像、视频、二进制文件。

HTTP1.0默认使用Connection:cloose,浏览器每次请求都需要与服务器建立一个 TCP 连接,服务器处理完成后立即断开 TCP 连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。

HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。

TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。

HTTP/1.1

最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用。

持久连接的特点:

  • 持久连接也称为Http keep-alive,只要任意一端没有明确提出断开连接,则保存TCP连接状态。

  • 减少了TCP连接的重复建立和断开所造成的额外开销,减去了服务器端的压力。

  • 持久连接使得多数请求以管线化方式(pipelining)成为可能。可以同时并行发送多个请求,而不需要一个接一个的等待响应了。(请求打包一次传输过去,响应打包一次传递回来),管线化的前提是在持久连接下。

HTTP1.1默认使用 Connection:keep-alive(长连接),避免了连接建立和释放的开销;通过 Content-Length 字段来判断当前请求的数据是否已经全部接受。不允许同时存在两个并行的响应。

客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。

一个TCP连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。这就是Content-length字段的作用,声明本次回应的数据长度。

支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

HTTP 1.1 还提供了与身份认证、状态管理和 Cache 缓存等机制相关的请求头和响应头

此外,还新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 。

也就是说到目前为止,在HTTP中已经有了8中指令:

GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT

http1.1缺陷:

  • (1)高延迟,带来页面加载速度的降低。(网络延迟问题只要由于队头阻塞,导致宽带无法被充分利用)

  • (2)无状态特性,带来巨大的Http头部。

  • (3)明文传输,不安全。

  • (4)不支持服务器推送消息。

HTTP/2

HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。

HTTP/2 会 压缩头(Header) 如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。

HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧。这样虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率。

HTTP/2 的 数据包不是按顺序发送 的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。每个请求或回应的所有数据包,称为一个数据流( Stream )。每个数据流都标记着一个独一无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数。客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应该请求。

HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务不再是被动地响应,也可以主动向客户端发送消息。举例来说,在浏览器刚请求 HTML 的时候,就提前把可能会用到的 JS、CSS 文件等静态资源主动发给客户端,减少延时的等待,也就是服务器推送.

Released under the MIT License.