HTTP 协议发展变迁

查看原文

这篇文章介绍了 HTTP 协议关于传输方式上的重大改变。HTTP 协议 是基于 TCP/IP 协议的关于内容请求和传输的标准。HTTP/0.9 的请求只有一行,使用 GET /index.html 这样的请求,响应只能返回 HTML 内容然后关闭 腾出连接,请求和响应都没有header。HTTP/1.0 也是在响应完后关闭连接。一个缺点是在 TCP 三路握手客户端最后一个 ACK 到达服务器前服务器无法处理请求;一些 HTTP 实现定义了 Connection: keep-alive 来告诉服务器不要关闭连接,客户端还要用。HTTP 还是一个无状态的协议,所以客户端在每个请求都需要自己携带信息以告知服务器其所在状态,重复的信息会到达服务器很多遍。HTTP/1.1 默认响应结束不关闭 tcp 连接除非带上了 header Connection: close;加入了 Content-Length 用于一次处理多个请求(这个字段可以确定每个请求的边界)。当然,如果流式返回动态数据,服务器肯定不知道数据长度,响应最后肯定要关闭连接,这种场景 HTTP/1.1 引入了 chunk encoding,最后响应设定长度为 0 以关闭连接。然而时至今日,一个网页大几十个请求发出去,HTTP/1.1 的多请求处理是线性的,一个请求不完结下一个也不会出来。Google 为此推出了 SPDY,这个协议在客户端修改请求,它的许多特性进入了 HTTP/2。为了减低单个请求的数据量,HTTP/2 传输二进制数据,不再传输 ASCII header,我们在先前熟知的 header 成为了 HEADER frame, body 成为了 DATA frame,这些 frame 都是二进制的。为了异步地传输请求和响应, HTTP/2 中请求和响应都分配了 Unique ID,所以定界用的 Content-Length 作用不大了。为了可以停止流数据但不切断连接,引入了 RST_STREAM frame。为了避免重复数据在两端传输的量,引入了 HPACK header,使用 Huffman 编码减少传输数据。HTTP/2 还支持 Server Push,单请求多响应。这一系列传输方式的变更从先前的 it works,到后面更注重性能,我们可以看到 HTTP 协议发展的轨迹。