第3篇:HTTP发展史
本系列翻译自:https://developer.mozilla.org/en-US/docs/Web/HTTP
注:翻译水平有限,如果有不理解或者纰漏之处,还请参考火狐原文 :https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP;
超文本传输协议是基于World Wide Web的一种协议,由Tim Berners-Lee和他的团队开发于1989-1991,HTTP经历了许多改变,但保持了简洁性和灵活性;HTTP已经从一个早期的协议演变成了互联网的现代“迷宫”,现在能以高分辨率或3D方式传送图像、视频。
World Wide Web的发明
在1989年,当Tim Berners-Lee还在CERN工作的时候,他写了一个基于因特网建立超文本系统的协议,最初被称作Mesh,在1990年实施过程中被改名为World Wide Web,基于TCP /IP协议而建立,它由四个模块组成:
-
一个表示超文本文档的文本格式,超文本标记语言(HTML)。
-
一个交换这些文件的简单协议,hyperttext传输协议(HTTP)。
-
一个客户端展示这些文档,这是第一个web浏览器,称作 WorldWideWeb.
-
一个服务器可以访问的文件的早期版本.
这个四个基本模块是在1990年末完成的,并且第一个服务器运行在CERN的外围,Tim Berners-Lee's在1991年8月6日发出的alt.hypertext被视为World Wide Web项目的官方开始。HTTP协议的早期条款十分简陋,后来被称为HTTP/0.9,有时也被称为“一行”协议,为什么称作一行,请看下文。
HTTP/0.9 – The one-line protocol
早期的HTTP协议甚至没有版本,0.9版本是后来追加的,为了区别后面的版本;HTTP/0.9极其简单,请求协议只有一行组成,只能使用GET
请求,然后后面跟着的是资源路径,连接到服务器的URL、协议、服务器和端口都不需要。
GET /mypage.html
响应也是十分简单的:
<HTML>
A very simple HTML page
</HTML>
不像后来的版本,这里没有HTTP请求头,这意味着只有HTML 文件可以被传递,没有响应码或错误码,如果突发意外,一个专门的HTML文件就被返回,上面有错误的细节。
HTTP/1.0 – Building extensibility
HTTP/0.9 非常受限,浏览器和服务器以非常快的速度对它进行拓展,使其更加通用:
- 版本信息每次都会设置到请求中
- 状态码也会在响应中返回,同时允许浏览器自己理解请求的成功或失败并自定义行为,比如,以指定的方式使用或更新本地缓存。
- HTTP header头的概念是为请求和响应而引入的,使得一些元数据可以被传输,同时也让协议变得更加灵活和可拓展。
- 在新HTTP header的帮助下,使得可以传输非HTML文件,这多亏了
Content-Type
这个请求头。
一个典型的请求如下:
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>
A page with an image
<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
(image content)
这些新特点没有成为共同努力的方向,但是作为一种尝试方法,在1991-1995期间,服务器和浏览器添加了新特性,看似得到了进展,但是随之而来的是许多的问题,在1996年11月,为了解决这些大问题,一个文件诞生了,即RFC 1945,这是HTTP/1.0的定义,值得一提的是,从狭义上来看,它不是官方标准。
HTTP/1.1 – The standardized protocol
为了平衡HTTP/1.0的使用混乱,自从1995年,在HTTP/1.0文件发行之前,HTTP/1.0的标准化工作已在进行中,第一个标准化的HTTP/1.1,在1997年发布了,就比HTTP/1.0晚了几个月,HTTP/1.1澄清了许多歧义并且引入了更多的进步概念:
- 一个连接可以被重复使用,这样可以节省大量的重复建立链接所耗费的时间以及重新加载文档的时间。
- 管道概念被加入,指允许在第一个请求响应之前发送第二请求,这可以降低通信的延迟。
- 响应分块(Chunked )也被支持;原文:Chunked responses are now also supported.
- 额外缓存控制机制得到实现
- 内容协调,包括语言,编码,类型等,同时允许客户端和服务端交换最合适的内容。
- 多亏了
Host
header,现在允许服务端调用同一ip地址的不同域名。
基于一个链接的请求流程如下:
GET /en-US/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/en-US/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.cdn.mozilla.net
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/en-US/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/1.1 于1997年1月发表于RFC 2068文件。
More than 15 years of extensions
由于其拓展能力,创建新的请求头或者方法非常容易,尽管HTTP/1.1协议已经经过两次精炼的提升修改,RFC 2616 和 RFC 7230,其中RFC 7235文件发表在2014年6月,即HTTP/2版本发布前,这个协议已经稳定的运行超过15年了。
Using HTTP for secure transmissions
HTTP 最大的一次改变发生于1994年,不同于TCP/IP技术栈,网景委员会在HTTP上加了一层SSL协议,SSL 1.0从来没有公布过,仅供其内部使用,但是SSL 2.0和其继任者 SSL 3.0以及SSL 3.1允许电子商务网站通过加密等技术为客户端于服务端交换消息保证安全。SSL继而进入正轨并且最终发展成为TLS,1.0, 1.1, 和 1.2 版都不再那么脆弱。TLS 1.3 还在开发中。
与此同时,一个需要加密的传输层协议被提出,一些学术网络相对可靠,但有些人试图窃取人民的隐私信息,对网络安全性有极大的威胁。随着建立在HTTP协议的应用越来越强大,对个人的私人信息的访问也逐渐增多,比如访问电子邮箱,书籍,地理位置等,因此对于TLS的需求也就无处不在。
Using HTTP for complex applications
Tim Berners-Lee的原始版本并不是只读的,他设想一种人人可以添加和移动文档的网站,一种分布式文件系统。大约在1996年,HTTP已经扩展出了授权的功能,一个叫WebDAV的标准被提出。类似CardDAV ,CalDAV 的标准也相应的提出,但是它们都有一个缺点:都需要额外的服务端来实现,这是相当复杂的;同时还需要保密。
到了2010年,一种关于HTTP的新模式被提出: representational state transfer 或者称为REST,即请求的行为被定义如API中,不再使用HTTP methods表示,但是只允许特定的URI访问且是基于HTTP/1.1。这允许任何Web应用程序提供一个API,允许在不更新浏览器或服务器的情况下检索和修改其数据:所有需要的内容都通过标准HTTP / 1.1嵌入在Web站点提供的文件中。REST模型的缺点在于每个网站都定义了自己的非标准的RESTful API并且可以控制它;在2010年代,REST风格的API变得非常普遍。
自从2005年,一系列的API实现了:
- Server-sent events,server端可以推送消息到web浏览器。
- WebSocket,一种建立在升级HTTP连接的新协议。
Relaxing the security-model of the Web
HTTP是独立于web的安全模型外的,参考同源政策(same-origin policy);事实上,现行的web安全模型在HTTP诞生之初就已经开始发展。事实证明,在某些限制条件下,取消这一政策的某些限制性条款,能够更有发挥的空间,这是很有用的。服务器使用一组新的HTTP header头将这些限制解除。这些都在跨域资源共享定义(CORS)或内容安全政策(CSP)有定义。
除了这些拓展,还有其他的header被定义,如DNT
,X-Frame-Options
,Upgrade-Insecure-Requests
等。
HTTP/2 – A protocol for greater performance
随着时间的推移,web网页变得越来越复杂,甚至成为了一个一个应用。大量的媒体文件,脚本文件需要传输;HTTP/1.1 协议下的连接请求需要按顺序发出,理论上同时建立5-8个连接存在在非常大的开销;比如HTTP 管道(pipelining )在web的发展中就是一个沉重的负担。
在2010年,谷歌论证了一种交换数据的可行性方案,该方案当时还在试验中,即SPDY;这立刻聚集了一大批开发者;为了解决大数据传输的问题,SPDY被纳入HTTP/2协议中。
The HTTP/2 和 HTTP/1.1 主要的区别如下:
- 这是一个非文本协议而是二进制协议,这意味着它无法手动读取和创建,并且是用最优的技术来实现的。
- 这是一个多路复用的协议,并行的请求可以在同一个连接中处理,解除了HTTP/1.x 协议的请求顺序的限制和区块的约束。
- 对header进行压缩;消除了传输数据的高开销;
- 通过server push机制,允许服务端事先将数据填充到客户端缓存;
Post-HTTP/2 evolution
HTTP的发展不会在HTTP/2停下脚步,其可扩展性仍然被用于添加新特性。值得注意的是,我们可以引用HTTP协议在2016中出现的新扩展:
-
Alt-Svc
的支持,使得CDN缓存机制更加智能; - 在用户的允许下,服务端可以向客户端发送一些
Client-Hints
提示; - 在cookie头中引入安全相关前缀,有助于保证cookie没有被篡改。
HTTP的发展证明了它的可扩展性和简单性,解放了许多应用程序的创建,并促使协议的采用。今天使用HTTP的环境与上世纪90年代早期所看到的环境大不相同。HTTP设计被证明是一个杰作,它允许Web在超过25年的时间里,只需要通过修复一些缺陷,就保持了HTTP如此高的灵活性和可扩展性,HTTP/2揭示了该协议的光明前景。