HTTP 的发展

46 阅读2分钟

最初的 HTTP/0.9

最初的需求比较简单,只需要满足HTML的传输。所以客户端只需要通过一个请求行的信息(GET /index.html)告诉服务器需要什么

  • 根据IP、端口找到目标服务器,三次握手建立TCP连接
  • 客户端发送请求行
  • 服务器返回HTML文件
  • 断开连接

传输更丰富的内容,HTTP/1.0

随着互联网的发展,浏览器上展示的内容也更加丰富(有不同类型的资源)

引入了 key-value 形式的结构去交流(相当于是个元数据),客户端和服务器之间就可以告诉对方数据的类型、大小、压缩方式、编码方式、语言等信息。这就是 Headers (请求头&响应头)

除此之外,还引入了其他特性

  • 响应行中的状态码
  • Cache 机制
  • 用户代理

一些改进,HTTP/1.1

之前每次HTTP请求,都要进行一走一遍建立TCP连接的过程。现在一个TCP之上,可以传输多个HTTP请求,这是默认开启的,可以通过设置 Connection: close 关闭它。对于同一个域名,可以同时发起6个TCP连接

在 HTTP/1.0中,一个域名对应一个IP。随着虚拟主机技术的发展,一台物理机上面可能有多个虚拟主机,每个虚拟主机都有自己单独的域名,这些域名共用同一个IP。在HTTP/1.1 中新增了一个 Host 头,用来表示域名,服务器根据域名做处理

HTTP/1.0 中通过 Content-Length 确定数据大小,但对动态大小的内容不友好。所以就新引入了 Chunk transfer 机制,将内容分成小块,最后发送一个零长度的块作为结束标记

还新增了 Cookie 和安全机制

性能再优化,HTTP/2

HTTP/1.1 依然有一些问题

  • TCP慢启动,建立多个TCP就会多次经历慢启动
  • 多条TCP连接,会在固定带宽中产生竞争,无法优先处理重要请求
  • 同一个TCP中的多个HTTP需要排队

在 HTTP/2 中实现了多路复用:同一域名只用一个TCP连接;多个请求的数据并行发出。实现这个的方式是引入了二进制分帧

得益于二进制分帧,也实现了请求优先级头部压缩


参考

time.geekbang.org/column/arti…

time.geekbang.org/column/arti…