HTTP 发展史

目录

前言

HTTP的诞生

http/0.9 – 单行协议(1991)

http/1.0 – 构建可扩展性(1996)

http/1.1 – 标准化的协议(1997)

http/2 – 更优异的性能(2015)

http/3 – 基于 QUIC 的 HTTP(2022)

http 工作机制


前言

超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP万维网(World Wide Web)的基础协议。自蒂姆·伯纳斯-李 (Tim BernersLee)博士和他的团队在 1989-1991 年间创造出它以来,HTTP 已经发生了太多的变化,在保持协议简单性的同时,不断扩展其灵活性。如今,HTTP 已经从一个只在实验室之间交换文档的早期协议进化到了可以传输图片,高分辨率视频和 3D 效果的现代复杂互联网协议。

HTTP的诞生

1989 年 3 月欧洲核子研究组织(CERN)的蒂姆·伯纳斯-李 (Tim BernersLee)博士提出了一种能让远隔两地的研究者们共享知识的设想。 最初设想的基本理念是:借助多文档之间相互关联形成的超文本(HyperText),连成可相互参阅的 WWW(World Wide Web,万维网)

三项基本技术来实现设想,这些技术仍然是当今网络的基础(您可能已经在网络浏览器的某些部分上看到过这些技术):

  • HTML(HyperText Markup Language):超文本标记语言,作为编写文档的语言。
  • HTTP(HyperText Transfer Protocol):超文本传输协议,作为传递文档的协议。
  • URL(Uniform Resource Locator):统一资源标识符,一种唯一的“地址”,用于标识文档在网络上的位置。

此外 Tim 还编写了第一个网页编辑器/浏览器(“WorldWideWeb.app”)和第一个 Web 服务器(“httpd”)。至此 Tim 初步完成了他的设想的所有技术实现,且第一批服务器已经在 1991 年初在 CERN 以外的地方运行了,1991 年 8 月 16 日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。

对于HTTP而言, 在应用的早期阶段它是非常简单的,后来它也被称为 HTTP/0.9,有时也叫做单行hang(one-line)协议。

http/0.9 – 单行协议(1991)

最初版本的 HTTP 协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源的路径(一旦连接到服务器,协议、服务器、端口号这些都不是必须的)。
例如下面的请求
HTTP/0.9 只需要 GET 开头。后面跟随资源路径

GET /mypage.html

响应也极其简单的:只包含响应文档本身那时候资源还是静态的

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

0.9 版本和后面版本很大不同,响应的内容不包含 HTTP 头,这意味着只有 HTML 文件可以传送,无法传输其他类型的文件。

也没有对应的状态码,一旦出现问题,一个特殊的包含问题描述信息的 HTML 文件将被发回,供人们查看。

http/1.0 – 构建可扩展性(1996)

由于 http/0.9 有很大问题,http1.0 在其基础上有了优化,有以下方面

  • 增加协议版本号,这个版本号会随着每一次请求发送,追加在末尾(HTTP/1.0 会追加到get 行)
  • 增加 HTTP 标头 的概念,无论是请求还是响应,允许传输元数据,使得协议更加灵活
  • 在 http 标头的功能下,具备传输出纯超文本外,其他文件的能力(借助 Content-Type 字段)
  • 新增POST、HEAD请求,POST 请求方法允许客户端向服务器提交数据,而 HEAD 请求方法允许客户端获取资源的元数据。这些新增的请求方法丰富了HTTP协议的能力,使得客户端和服务器能够进行更多样化的交互和处理。

一个典型的 请求-响应 类似如下

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

HTTP/1.0 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)

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

在这些优化被提出来之后,仅仅是一种尝试,并没有引进到实际的工作中作为标准。因为中间出现一些客户端和服务器的互操作问题,直到1996年才被解决,并发布文档 RFC 1945 定义HTTP/1.0。

http/1.1 – 标准化的协议(1997)

http1.1 在 http1.0 基础上,消除大量歧义内容并进行多项改进,如下

  • 连接可以复用,减少 http 断开与重新连接的时间,加快响应
  • 增加管线化技术,即允许第一个请求被完全发送出去之后,就可以接着发送第二个请求,无需等待第一个请求被响应,降低延迟。
  • 支持响应分块,这个对动态内容很实用,因为服务器一开始也不知道要一共发送多少内容,通过分块形式传输到客户端,客户端接受到第一块数据,就开始处理,加快客户端响应时间。
  • 引入额外的缓存控制机制
  • 引入内容协商机制,包括语言(Accept-Language)、编码(Accept-Encoding)、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。
  • 增加 Host 标头,能够使不同域名配置在同一个 IP 地址的服务器上。
  • 添加了新的 HTTP 方法: HTTP/1.1新增了 PUT、PATCH、OPTIONS、DELETE方法
  • 新增了状态码

一个典型的请求流程,所有请求都通过一个连接实现,看起来就像这样:

GET /zh-CN/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/zh-CN/docs/Glossary/Simple_header

200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding

(content)


GET /static/img/header-background.png HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/zh-CN/docs/Glossary/Simple_header

200 OK
Age: 9578461
Cache-Control: public, max-age=315360000
Connection: keep-alive
Content-Length: 3077
Content-Type: image/png
Date: Thu, 31 Mar 2016 13:34:46 GMT
Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
Server: Apache

(image content of 3077 bytes)

http/2 – 更优异的性能(2015)

http/2 在 http1.1 基础上做了以下的改进

  • HTTP/2 使用二进制协议进行传输,相比于 HTTP/1.X 的文本传输协议,拥有更快的解析和编码速度,响应速度更快。
  • 采用多路复用。并行的请求能够在同一个 TCP 连接中处理请求和响应,移除了 HTTP/1.X 中顺序和阻塞约束。

    http/1.1 的管线化技术虽然支持在同一个 tcp 连接上,发起多个请求,但服务器还是按照请求顺序来返回请求结果。也就是说,如果第一个请求时间很长,一样会影响其他请求的响应。

    而 http/2.0 多路复用解决了这个问题,真正做到不同请求并行处理,互不影响

  • 压缩了标头。因为标头在很多类型请求都是相似的,移除了重复和重复传输的数据
  • 服务器推送。HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送(server push)。

    常见场景是客户端请求一个网页,这个网页里面包含很多静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发出静态资源请求。其实,服务器可以预期到客户端请求网页后,很可能会再请求静态资源,所以就主动把这些静态资源随着网页一起发给客户端了。

http/3 – 基于 QUIC 的 HTTP(2022)

http/3.0 在传输层采用 QUIC 而不是 TCP,它有以下的特点

  • 多路复用,通过 UDP运行多个流,每个流可以单独实现数据丢包检测和重传,比 Http/2 基于一个流检测丢失机制处理速度更快。

http 工作机制

当客户端想要和服务端进行数据交换,都需要经过下面的几步

  1. 创建一个 TCP 连接:TCP 连接被用来发送一条或者多条请求,以及用来接受响应信息。
  2. 发送一个 HTTP 报文:HTTP 报文在 HTTP/2 采用二进制之前都是可读的,http/2 报文信息报封装在帧中,使得不可读,但原理是相同的。
    GET / HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language: zh
    
  3. 读取服务端返回的报文
    HTTP/1.1 200 OK
    Date: Sat, 09 Oct 2010 14:28:02 GMT
    Server: Apache
    Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
    ETag: "51142bc1-7449-479b075b2891b"
    Accept-Ranges: bytes
    Content-Length: 29769
    Content-Type: text/html
    
    <!DOCTYPE html>…(此处是所请求网页的 29769 字节)
    
  4. 关闭连接或者为后续请求重用连接。
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子味的冰淇淋~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值