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
总结
HTTP的发展历史是互联网发展的缩影,它不断演进以适应新的需求和技术。从最早的HTTP/0.9到最新的HTTP/3,每个版本都带来了性能、安全性和功能方面的改进,使互联网成为今天我们所熟知的形态。
未来,HTTP可能会继续演进,以应对不断变化的互联网环境和需求,但无论如何,HTTP都将继续是互联网世界的重要基石。