aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/http/basics_of_http/evolution_of_http/index.html
blob: de63f462e7a420e15d1eec73ab93680e8f0443b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
---
title: HTTP的发展
slug: Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
tags:
  - Guide
  - HTTP
translation_of: Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
---
<p>{{HTTPSidebar}}</p>

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

<h2 id="万维网的发明">万维网的发明</h2>

<p>1989年, 当时在 CERN 工作的 Tim Berners-Lee 博士写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 <em>Mesh</em>,在随后的1990年项目实施期间被更名为万维网(<em>World Wide Web)。</em>它在现有的TCP和IP协议基础之上建立,由四个部分组成:</p>

<ul>
 <li>一个用来表示超文本文档的文本格式,<em><a href="/en-US/docs/Web/HTML">超文本标记语言</a></em>(HTML)。</li>
 <li>一个用来交换超文本文档的简单协议,超文本传输协议(HTTP)。</li>
 <li>一个显示(以及编辑)超文本文档的客户端,即网络浏览器。第一个网络浏览器被称为 <em>WorldWideWeb。</em></li>
 <li>一个服务器用于提供可访问的文档,即 <em>httpd </em>的前身。</li>
</ul>

<p>这四个部分完成于1990年底,且第一批服务器已经在1991年初在CERN以外的地方运行了。 1991年8月16日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。</p>

<p>HTTP在应用的早期阶段非常简单,后来被称为HTTP/0.9,有时也叫做单行(one-line)协议。</p>

<h2 id="HTTP0.9_–_单行协议">HTTP/0.9 – 单行协议</h2>

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

<pre>GET /mypage.html</pre>

<p>响应也极其简单的:只包含响应文档本身。</p>

<pre>&lt;HTML&gt;
这是一个非常简单的HTML页面
&lt;/HTML&gt;</pre>

<p>跟后来的版本不同,HTTP/0.9 的响应内容并不包含HTTP头,这意味着只有HTML文件可以传送,无法传输其他类型的文件;也没有状态码或错误代码:一旦出现问题,一个特殊的包含问题描述信息的HTML文件将被发回,供人们查看。</p>

<h2 id="HTTP1.0_–_构建可扩展性">HTTP/1.0 – 构建可扩展性</h2>

<p>由于 HTTP/0.9 协议的应用十分有限,浏览器和服务器迅速扩展内容使其用途更广:</p>

<ul>
 <li>协议版本信息现在会随着每个请求发送(<code>HTTP/1.0</code>被追加到了<code>GET</code>行)。</li>
 <li>状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。</li>
 <li>引入了HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。</li>
 <li>在新HTTP头的帮助下,具备了传输除纯文本HTML文件以外其他类型文档的能力(感谢{{HTTPHeader("Content-Type")}}头)。</li>
</ul>

<p>一个典型的请求看起来就像这样:</p>

<pre>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
&lt;HTML&gt;
一个包含图片的页面
  &lt;IMG SRC="/myimage.gif"&gt;
&lt;/HTML&gt;</pre>

<p>接下来是第二个连接,请求获取图片:</p>

<pre>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
<em>(这里是图片内容)</em></pre>

<p>在1991-1995年,这些新扩展并没有被引入到标准中以促进协助工作,而仅仅作为一种尝试:服务器和浏览器添加这些新扩展功能,但出现了大量的互操作问题。直到1996年11月,为了解决这些问题,一份新文档(RFC 1945)被发表出来,用以描述如何操作实践这些新扩展功能。文档 RFC 1945 定义了 HTTP/1.0,但它是狭义的,并不是官方标准。</p>

<h2 id="HTTP1.1_–_标准化的协议">HTTP/1.1 – 标准化的协议</h2>

<p>HTTP/1.0 多种不同的实现方式在实际运用中显得有些混乱,自1995年开始,即HTTP/1.0文档发布的下一年,就开始修订HTTP的第一个标准化版本。在1997年初,HTTP1.1 标准发布,就在HTTP/1.0 发布的几个月后。</p>

<p>HTTP/1.1 消除了大量歧义内容并引入了多项改进:</p>

<ul>
 <li>连接可以复用,节省了多次打开TCP连接加载网页文档资源的时间。</li>
 <li>增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。</li>
 <li>支持响应分块。</li>
 <li>引入额外的缓存控制机制。</li>
 <li>引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。</li>
 <li>感谢{{HTTPHeader("Host")}}头,能够使不同域名配置在同一个IP地址的服务器上。</li>
</ul>

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

<pre>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

<em>(content)</em>


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/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

<em>(image content of 3077 bytes)</em></pre>

<p>HTTP/1.1 在1997年1月以 {{rfc(2068)}} 文件发布。</p>

<h2 id="超过15年的扩展">超过15年的扩展</h2>

<p>由于HTTP协议的可扩展性 – 创建新的头部和方法是很容易的 – 即使HTTP/1.1协议进行过两次修订,{{RFC("2616")}} 发布于1999年6月,而另外两个文档 {{RFC("7230")}}-{{RFC("7235")}} 发布于2014年6月,作为HTTP/2的预览版本。HTTP协议已经稳定使用超过15年了。</p>

<h3 id="HTTP_用于安全传输">HTTP 用于安全传输</h3>

<p>HTTP最大的变化发生在1994年底。HTTP在基本的TCP/IP协议栈上发送信息,网景公司(Netscape Communication)在此基础上创建了一个额外的加密传输层:SSL 。SSL 1.0没有在公司以外发布过,但SSL 2.0及其后继者SSL 3.0和SSL 3.1允许通过加密来保证服务器和客户端之间交换消息的真实性,来创建电子商务网站。SSL在标准化道路上最终成为TLS,随着版本1.0, 1.1, 1.2的出现成功地关闭漏洞。TLS 1.3 目前正在形成。</p>

<p>与此同时,人们对一个加密传输层的需求也愈发高涨:因为 Web 最早几乎是一个学术网络,相对信任度很高,但如今不得不面对一个险恶的丛林:广告客户、随机的个人或者犯罪分子争相劫取个人信息,将信息占为己有,甚至改动将要被传输的数据。随着通过HTTP构建的应用程序变得越来越强大,可以访问越来越多的私人信息,如地址簿,电子邮件或用户的地理位置,即使在电子商务使用之外,对TLS的需求也变得普遍。</p>

<h3 id="HTTP_用于复杂应用">HTTP 用于复杂应用</h3>

<p>Tim Berners-Lee 对于 Web 的最初设想不是一个只读媒体。 他设想一个 Web 是可以远程添加或移动文档,是一种分布式文件系统。 大约 1996 年,HTTP 被扩展到允许创作,并且创建了一个名为 WebDAV 的标准。 它进一步扩展了某些特定的应用程序,如 CardDAV 用来处理地址簿条目,CalDAV 用来处理日历。 但所有这些 *DAV 扩展有一个缺陷:它们必须由要使用的服务器来实现,这是非常复杂的。并且他们在网络领域的使用必须保密。</p>

<p>在 2000 年,一种新的使用 HTTP 的模式被设计出来:{{glossary("REST", "representational state transfer")}} (或者说 REST)。 由 API 发起的操作不再通过新的 HTTP 方法传达,而只能通过使用基本的 HTTP / 1.1 方法访问特定的 URI。 这允许任何 Web 应用程序通过提供 API 以允许查看和修改其数据,而无需更新浏览器或服务器:all what is needed was embedded in the files served by the Web sites through standard HTTP/1.1。  REST 模型的缺点在于每个网站都定义了自己的非标准 RESTful API,并对其进行了全面的控制;不同于 *DAV 扩展,客户端和服务器是可互操作的。 RESTful API 在 2010 年变得非常流行。</p>

<p>自 2005 年以来,可用于 Web 页面的 API 大大增加,其中几个 API 为特定目的扩展了 HTTP 协议,大部分是新的特定 HTTP 头:</p>

<ul>
 <li><a href="/en-US/docs/Web/API/Server-sent_events">Server-sent events</a>,服务器可以偶尔推送消息到浏览器。</li>
 <li><a href="/en-US/docs/Web/API/WebSocket_API">WebSocket</a>,一个新协议,可以通过升级现有 HTTP 协议来建立。</li>
</ul>

<h3 id="放松Web的安全模型">放松Web的安全模型</h3>

<p>HTTP和Web安全模型--<a href="/en-US/docs/Web/Security/Same-origin_policy">同源策略</a>是互不相关的。事实上,当前的Web安全模型是在HTTP被创造出来后才被发展的!这些年来,已经证实了它如果能通过在特定的约束下移除一些这个策略的限制来管的宽松些的话,将会更有用。这些策略导致大量的成本和时间被花费在通过转交到服务端来添加一些新的HTTP头来发送。这些被定义在了<a href="/en-US/docs/Glossary/CORS">Cross-Origin Resource Sharing</a> (CORS) or the <a href="/en-US/docs/Web/Security/CSP">Content Security Policy</a> (CSP)规范里。</p>

<p>不只是这大量的扩展,很多的其他的头也被加了进来,有些只是实验性的。比较著名的有Do Not Track ({{HTTPHeader("DNT")}}) 来控制隐私,{{HTTPHeader("X-Frame-Options")}}, 还有很多。</p>

<h2 id="HTTP2_-_为了更优异的表现">HTTP/2 - 为了更优异的表现</h2>

<p>这些年来,网页愈渐变得的复杂,甚至演变成了独有的应用,可见媒体的播放量,增进交互的脚本大小也增加了许多:更多的数据通过HTTP请求被传输。HTTP/1.1链接需要请求以正确的顺序发送,理论上可以用一些并行的链接(尤其是5到8个),带来的成本和复杂性堪忧。比如,HTTP管线化(pipelining)就成为了Web开发的负担。</p>

<p>在2010年到2015年,谷歌通过实践了一个实验性的SPDY协议,证明了一个在客户端和服务器端交换数据的另类方式。其收集了浏览器和服务器端的开发者的焦点问题。明确了响应数量的增加和解决复杂的数据传输,SPDY成为了HTTP/2协议的基础。</p>

<p>HTTP/2在HTTP/1.1有几处基本的不同:</p>

<ul>
 <li>HTTP/2是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。</li>
 <li>这是一个复用协议。并行的请求能在同一个链接中处理,移除了HTTP/1.x中顺序和阻塞的约束。</li>
 <li>压缩了headers。因为headers在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。</li>
 <li>其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。</li>
</ul>

<p>在2015年5月正式标准化后,HTTP/2取得了极大的成功,在2016年7月前,8.7%的站点已经在使用它,代表超过68%的请求<sup><a href="https://www.keycdn.com/blog/http2-statistics/">[2]</a></sup> 。高流量的站点最迅速的普及,在数据传输上节省了可观的成本和支出。</p>

<p>这种迅速的普及率很可能是因为HTTP2不需要站点和应用做出改变:使用HTTP/1.1和HTTP/2对他们来说是透明的。拥有一个最新的服务器和新点的浏览器进行交互就足够了。只有一小部分群体需要做出改变,而且随着陈旧的浏览器和服务器的更新,而不需Web开发者做什么,用的人自然就增加了。</p>

<h2 id="后HTTP2进化">后HTTP/2进化</h2>

<p>随着HTTP/2.的发布,就像先前的HTTP/1.x一样,HTTP没有停止进化,HTTP的扩展性依然被用来添加新的功能。特别的,我们能列举出2016年里HTTP的新扩展:</p>

<ul>
 <li>对Alt-Svc的支持允许了给定资源的位置和资源鉴定,允许了更智能的CDN缓冲机制。</li>
 <li>{{HTTPHeader("Client-Hints")}} 的引入允许浏览器或者客户端来主动交流它的需求,或者是硬件约束的信息给服务端。</li>
 <li>在Cookie头中引入安全相关的的前缀,现在帮助保证一个安全的cookie没被更改过。</li>
</ul>

<p>HTTP的进化证实了它良好的扩展性和简易性,释放了很多应用程序的创造力并且情愿使用这个协议。今天的HTTP的使用环境已经于早期1990年代大不相同。HTTP的原先的设计不负杰作之名,允许了Web在25年间和平稳健得发展。修复漏洞,同时却也保留了使HTTP如此成功的灵活性和扩展性,HTTP/2的普及也预示着这个协议的大好前程。</p>