HTTP系列(1)——HTTP发展史简述

99 阅读4分钟

HTTP(超文本传输协议 HyperText Transfer Protocol)的发展史可以追溯到互联网的早期,它一直在不断演化,以满足不断增长的网络需求。

HTTP/0.9

HTTP/0.9是最早的版本,这个版本非常简单,只有一个命令 GET

GET /mypage.html

响应也极其简单,只包含文档本身

<html>
  这是一个非常简单的 HTML 页面
</html>

没有HEADER等描述数据的信息,服务器发送完毕,就关闭TCP连接

HTTP/1.0

相对于HTTP/0.9,引入了更多的功能和特性。主要有以下几点

  • 除了GET命令,还增加了POST命令和HEAD命令
  • 引入了HTTP header(头信息),无论请求还是响应,允许传输元数据,使协议更灵活
  • 凭借 Content-Type 标头,具备了传输除纯文本 HTML 文件以外其他类型文档的能力,比如图像视频等
  • 新增了状态码status code、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等

一个典型的请求像这样:

GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
一个包含图片的页面
  <IMG SRC="/myimage.gif">
</HTML>

接下来是第二个连接,获取图片信息

GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(这里是图片内容)

相较于HTTP/0.9,1.0版本内容大大增加,但仍然有很多缺点,最主要的缺点是每个TCP连接只能发送一个请求。 TCP建立连接需要三次握手,这导致HTTP/1.0的性能比较差,随着网页展示内容的丰富性持续发展,这个问题就越来越明显了。

HTTP/1.1

就在HTTP/1.0发布的几个月后,发布了HTTP协议的第一个标准化版本HTTP1.1。HTTP1.1消除了大量歧义内容并新增了很多改进:

  • 持久连接:TCP连接默认不关闭,节省了多次打开TCP连接的时间。
  • 管道机制Pipeline:允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
  • 支持响应分块:产生一块数据则发送一块,即流模式(stream),在请求或回应的头信息中有Transfer-Encoding字段,表明回应由数据块组成
  • 新增Host字段,能够使不同域名配置在同一个 IP 地址的服务器上。
  • 引入了若干缓存机制

HTTP缓存机制

HTTP缓存有强缓存协商缓存。强缓存和协商缓存在缓存命中时都会直接使用本地的缓存副本,区别在于协商缓存会向服务器发送一次请求来确认是否使用缓存。

当浏览器未命中强缓存时,则会命中协商缓存

强缓存

缓存策略:如果缓存资源有效,则直接使用缓存资源,不再向服务器重新请求

设置方式:HTTP标头字段

1.Expires:指定资源的过期时间,是一个绝对时间。当本地时间小于设置的时间,则使用缓存。

注意:无效的日期,比如 0,代表着过去的日期,即该资源已经过期。如果在Cache-Control响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略。

2.cache-control:设置缓存机制,常用字段有

[1]no-cache:在发布缓存副本之前,强制进行协商缓存验证

[2]no-store: 不使用任何缓存

[3]max-age:相对过期时间,多少秒内有效

协商缓存

缓存策略:在使用缓存时会向服务器发送请求,问询资源是否发生更改,若未发生更改则返回304状态,客户端直接使用缓存,如果资源发生改变,则使用服务器返回资源

设置方式:HTTP标头字段

1.Last-Modified:表示文件最后被修改的日期,客户端再次请求时,会通过If-Modified-Since字段将Last-Modified值发送给服务器,询问服务器在这个日期后是否有更新。

2.Etag:服务端通过某种算法计算出该资源的唯一标识符。If-None-Match会将Etag发送给服务器,询问该资源是否有变动,有变动的话将新的资源返回。Etag优先级比Last-Modified高。

HTTP/2.0

  • HTTP/2 是二进制协议而不是文本协议。
  • 这是一个多路复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束
  • 压缩了标头

HTTP/3.0

  • 弃用TCP协议,改为使用基于UDP协议的QUIC协议实现。
  • 解决了队头阻塞的问题

总结

HTTP的发展历史是互联网发展的缩影,它不断演进以适应新的需求和技术。从最早的HTTP/0.9到最新的HTTP/3,每个版本都带来了性能、安全性和功能方面的改进,使互联网成为今天我们所熟知的形态。

未来,HTTP可能会继续演进,以应对不断变化的互联网环境和需求,但无论如何,HTTP都将继续是互联网世界的重要基石。