HTTP协议的演化

274 阅读3分钟

网络协议和 Web 接口(一)

HTTP 协议的演化

HTTP 协议是互联网基础中的基础。

HTTP协议的演化

HTTP/0.9

1991 年,HTTP 在最开始的 0.9 版就定义了协议最核心的内容。比如:

  • 确定了客户端、服务端这种基本结构;
  • 使用域名/IP加端口号来确定目标地址的方式;
  • 换行符作为基本的分隔符。

非常简单,如:

GET /target.html
  • 不支持请求正文;
  • 不支持除了 GET 以外的其他方法;
  • 不支持头部;
  • 没有版本号的显式指定(请求中不带有版本号);
  • 整个请求只有一行(The One-line Protocol)。

实践工具 telnet

# 步骤一:快捷键唤起Windows命令窗口(一)
win + r
# 步骤二:快捷键唤起Windows命令窗口(二)
cmd
# 步骤三:使用telnet建立连接
telnet www.google.com 80
# 步骤四:连接成功后发送请求
GET /

HTTP/1.0

1996 年,HTTP 1.0 版本稳定而成熟,是如今浏览器广泛支持的最低版本 HTTP 协议。

  • 引入了返回码;
  • 引入了 header
  • 引入了多字符集;
  • 支持多行请求。
  • 方法支持 GETHEADPOST
# 一份HTTP/1.0的多行请求:request.txt
GET / HTTP/1.0
User-Agent: Mozilla/1.22 (compatible; MSIE 2.0; Windows 3.1)
Accept: text/html

上述代码最后这个空行是必须的:协议规定,无论请求还是响应,在 HTTP 的头部结束后,必须增加一个额外的换行回车

改变 UAUser-Agent)头,可以模拟不同的浏览器。

实践工具 netcat

# 使用netcat发送请求
netcat www.google.com 80 < ~/path to request.txt

HTTP/1.1

现在最广泛使用的 HTTP 协议。

1999 年,大量提升传输效率的特性被加入(RFC2616):

  • HTTP 长连接Connection: Keep-Alive),打开一次 TCP 连接,可以被连续几次报文传输重用;
  • 分块传输编码Transfer-Encoding: chunked),响应的消息将由若干个块分次传输。以一个长度为 0 的块和一个空行表示传输结束。或 0 之后附加一些额外信息 Trailer;、
  • 更全面的方法;
  • 更全面的返回码;
  • 对指定客户端缓存策略的支持;
  • content negotiation (通过客户端请求的以 Accept 开头的头部来告知服务端它能接受的内容类型)的支持。
# 一份HTTP/1.1的长连接请求:request.txt
GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/1.22 (compatible; MSIE 2.0; Windows 3.1)
Connection: keep-alive
Accept: text/html

HTTP/2

在保持兼容性的基础上,包含了如下重要改进:

  • 设计了一种机制,允许客户端来选择使用的 HTTP 版本;
  • HTTP 头的压缩;
  • 多路复用,允许客户端同时在一个连接中同时传输多组请求响应的方法;
  • 服务端的 push 机制。

HTTP/3

围绕传输效率这个协议核心来做进一步改进。

查漏补缺

  1. 手动开启 win10telnet

    手动开启win10下telnet图示

    tips 百度 win10 telnet不是内部或外部命令

学习资料

  1. 一篇系统性介绍HTTP的教程
  2. 网络的OSI 7层模型[en]
  3. 网络协议在OSI 7层模型中的对应位置[en]
  4. RFC文档:HTTP 1.0[en]
  5. RFC文档:HTTP 1.1[en]
  6. RFC文档:HTTP 2.0[en]
  7. HTTP 1.0 到 1.1的9大改进[en]
  8. HTTP/2系统介绍[en]

参考资料

  1. [全栈工程师修炼指南]@网络互联的昨天、今天和明天:HTTP协议的演化