http 协议在 1991 年发布第一个版本版本号为 0.9。随后 WWW 联盟 (WWW Consortium-W3C)于 1994 年成立,http 协议被纳入到 W3C 组织中进行维护和管理。
http 协议版本发展
1 http1.0
最早在 1996 年在网页中使用,内容简单,所以浏览器的每次请求都需要与服务器建立
一个 TCP 连接,服务器处理完成后立即断开 TCP 连接(无连接),服务器不跟踪每个客户端
也不记录过去的请求(无状态),请求只能由客户端发起(单向性)。
2 http1.1
到 1999 年广泛在各大浏览器网络请求中使用,HTTP/1.0 中默认使用 Connection: close。在 HTTP/1.1 中已经默认使用 Connection: keep-alive(长连接),避免了连接建立和释放的开 销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过 Content-Length 字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。
1.1 中最重要的一个特点是支持“长连接”,即“一次连接可以多次请求”。
HTTP 1.1 支持持久连接(HTTP/1.1 的默认模式使用带流水线的持久连接),在一个 TCP连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1 还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
3 http2.0
3.1 长连接
在 HTTP/2 中,客户端向某个域名的服务器请求页面的过程中,只会创建一条 TCP 连接,即使这页面可能包含上百个资源。 单一的连接应该是 HTTP2 的主要优势,单一的连接能减少 TCP 握手带来的时延 。HTTP2 中用一条单一的长连接,避免了创建多个 TCP 连接带来的网络开销,提高了吞吐量。
3.2 多路复用 (Multiplexing)
HTTP2.0 中所有加强性能的核心是二进制传输,在 HTTP1.x 中,我们是通过文本的方式传输数据。在 HTTP2.0 中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。
多路复用,连接共享。不同的 request 可以使用同一个连接传输(最后根据每个 request上的 id 号组合成正常的请求)。
HTTP2.0 中,有两个概念非常重要:帧(frame)和流(stream)。 帧是最小的数据单位,每个帧会标识出该帧属于哪个流,流是多个帧组成的数据流。 所谓多路复用,即在一个 TCP 连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免 HTTP 旧版本的队头阻塞问题,极大提高传输性能。
3.3 首部压缩(Header Compression)
由于 1.1 中 header 带有大量的信息,并且得重复传输,2.0 使用 encoder 来减少需要传输的 hearder 大小。
3.4 服务端推送(Server Push)
在 HTTP2.0 中,服务端可以在客户端某个请求后,主动推送其他资源。 可以想象一下,某些资源客户端是一定会请求的,这时就可以采取服务端 push 的技术,提前给客户端推送必要的资源,就可以相对减少一点延迟时间。在浏览器兼容的情况下也可以
使用 prefetch。
3.5 更安全
HTTP2.0 使用了 tls 的拓展 ALPN 做为协议升级,除此之外,HTTP2.0 对 tls 的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法。