@@ -37,23 +37,23 @@ HTTP/1.0 仅定义了 16 种状态码。HTTP/1.1 中新加入了大量的状态
3737
3838HTTP/1.0 提供的缓存机制非常简单。服务器端使用` Expires ` 标签来标志(时间)一个响应体,在` Expires ` 标志时间内的请求,都会获得该响应体缓存。服务器端在初次返回给客户端的响应体中,有一个` Last-Modified ` 标签,该标签标记了被请求资源在服务器端的最后一次修改。在请求头中,使用` If-Modified-Since ` 标签,该标签标志一个时间,意为客户端向服务器进行问询:“该时间之后,我要请求的资源是否有被修改过?”通常情况下,请求头中的` If-Modified-Since ` 的值即为上一次获得该资源时,响应体中的` Last-Modified ` 的值。
3939
40- 如果服务器接收到了请求头,并判断` If-Modified-Since ` 时间后,资源确实没有修改过,则返回给客户端一个` 304 not modified ` 响应头,表示”缓冲可用,你从浏览器里拿吧!”。
40+ 如果服务器接收到了请求头,并判断` If-Modified-Since ` 时间后,资源确实没有修改过,则返回给客户端一个 ` 304 Not Modified ` 响应头,表示”缓冲可用,你从浏览器里拿吧!”。
4141
42- 如果服务器判断` If-Modified-Since ` 时间后,资源被修改过,则返回给客户端一个` 200 OK ` 的响应体,并附带全新的资源内容,表示”你要的我已经改过的,给你一份新的”。
42+ 如果服务器判断 ` If-Modified-Since ` 时间后,资源被修改过,则返回给客户端一个 ` 200 OK ` 的响应体,并附带全新的资源内容,表示”你要的我已经改过的,给你一份新的”。
4343
4444![ HTTP1.0cache1] ( ./images/http-vs-https/HTTP1.0cache1.png )
4545
4646![ HTTP1.0cache2] ( ./images/http-vs-https/HTTP1.0cache2.png )
4747
4848### HTTP/1.1
4949
50- HTTP/1.1 的缓存机制在 HTTP/1.0 的基础上,大大增加了灵活性和扩展性。基本工作原理和 HTTP/1.0 保持不变,而是增加了更多细致的特性。其中,请求头中最常见的特性就是` Cache-Control ` ,详见 MDN Web 文档 [ Cache-Control] ( https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control ) .
50+ HTTP/1.1 的缓存机制在 HTTP/1.0 的基础上,大大增加了灵活性和扩展性。基本工作原理和 HTTP/1.0 保持不变,而是增加了更多细致的特性。其中,请求头中最常见的特性就是 ` Cache-Control ` ,详见 MDN Web 文档 [ Cache-Control] ( https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control ) 。
5151
5252## 连接方式
5353
5454** HTTP/1.0 默认使用短连接** ,也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 TCP 连接,这样就会导致有大量的“握手报文”和“挥手报文”占用了带宽。
5555
56- ** 为了解决 HTTP/1.0 存在的资源浪费的问题, HTTP/1.1 优化为默认长连接模式 。** 采用长连接模式的请求报文会通知服务端:“ 我向你请求连接,并且连接成功建立后,请不要关闭”。因此,该 TCP 连接将持续打开,为后续的客户端-服务端的数据交互服务。也就是说在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
56+ ** 为了解决 HTTP/1.0 存在的资源浪费的问题,HTTP/1.1 优化为默认长连接模式。** 采用长连接模式的请求报文会通知服务端:” 我向你请求连接,并且连接成功建立后,请不要关闭”。因此,该 TCP 连接将持续打开,为后续的客户端-服务端的数据交互服务。也就是说在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
5757
5858如果 TCP 连接一直保持的话也是对资源的浪费,因此,一些服务器软件(如 Apache)还会支持超时时间的时间。在超时时间之内没有新的请求达到,TCP 连接才会被关闭。
5959
@@ -65,7 +65,7 @@ HTTP/1.1 的缓存机制在 HTTP/1.0 的基础上,大大增加了灵活性和
6565
6666## Host 头处理
6767
68- 域名系统(DNS)允许多个主机名绑定到同一个 IP 地址上,但是 HTTP/1.0 并没有考虑这个问题, 假设我们有一个资源 URL 是< http://example1.org/home.html,HTTP/1.0 > 的请求报文中,将会请求的是` GET /home.html HTTP/1.0 ` . 也就是不会加入主机名。这样的报文送到服务器端,服务器是理解不了客户端想请求的真正网址。
68+ 域名系统(DNS)允许多个主机名绑定到同一个 IP 地址上,但是 HTTP/1.0 并没有考虑这个问题。 假设我们有一个资源 URL 是 ` http://example1.org/home.html ` ,HTTP/1.0 的请求报文中,将会请求的是 ` GET /home.html HTTP/1.0 ` , 也就是不会加入主机名。这样的报文送到服务器端,服务器是理解不了客户端想请求的真正网址。
6969
7070因此,HTTP/1.1 在请求头中加入了` Host ` 字段。加入` Host ` 字段的报文头部将会是:
7171
@@ -86,7 +86,7 @@ HTTP/1.1 引入了范围请求(range request)机制,以避免带宽的浪
8686
8787一个典型的 HTTP/1.1 范围请求示例:
8888
89- ``` bash
89+ ``` http
9090# 获取一个文件的前 1024 个字节
9191GET /z4d4kWk.jpg HTTP/1.1
9292Host: i.imgur.com
@@ -95,8 +95,7 @@ Range: bytes=0-1023
9595
9696` 206 Partial Content ` 响应:
9797
98- ``` bash
99-
98+ ``` http
10099HTTP/1.1 206 Partial Content
101100Content-Range: bytes 0-1023/146515
102101Content-Length: 1024
@@ -113,15 +112,15 @@ Content-Length: 1024
113112
114113客户端想要获取资源的第 0 到 499 字节以及第 1000 到 1499 字节:
115114
116- ``` bash
115+ ``` http
117116GET /path/to/resource HTTP/1.1
118117Host: example.com
119118Range: bytes=0-499,1000-1499
120119```
121120
122121服务器端返回多个字节范围,每个范围的内容以分隔符分开:
123122
124- ``` bash
123+ ``` http
125124HTTP/1.1 206 Partial Content
126125Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
127126Content-Length: 376
@@ -149,13 +148,13 @@ Content-Range: bytes 1000-1099/2000
149148
150149### 状态码 100
151150
152- HTTP/1.1 中新加入了状态码` 100 ` 。该状态码的使用场景为,存在某些较大的文件请求,服务器可能不愿意响应这种请求,此时状态码` 100 ` 可以作为指示请求是否会被正常响应,过程如下图:
151+ HTTP/1.1 中新加入了状态码 ` 100 ` 。该状态码的使用场景为,存在某些较大的文件请求,服务器可能不愿意响应这种请求,此时状态码 ` 100 ` 可以作为指示请求是否会被正常响应,过程如下图:
153152
154153![ HTTP1.1continue1] ( ./images/http-vs-https/HTTP1.1continue1.png )
155154
156155![ HTTP1.1continue2] ( ./images/http-vs-https/HTTP1.1continue2.png )
157156
158- 然而在 HTTP/1.0 中,并没有` 100 (Continue) ` 状态码,要想触发这一机制,可以发送一个` Expect ` 头部,其中包含一个` 100-continue ` 的值。
157+ 然而在 HTTP/1.0 中,并没有 ` 100 (Continue) ` 状态码,要想触发这一机制,可以发送一个 ` Expect ` 头部,其中包含一个 ` 100-continue ` 的值。
159158
160159### 压缩
161160
@@ -167,11 +166,11 @@ HTTP/1.0 包含了`Content-Encoding`头部,对消息进行端到端编码。HT
167166
168167## 总结
169168
170- 1 . ** 连接方式** : HTTP 1.0 为短连接,HTTP 1.1 支持长连接。
171- 2 . ** 状态响应码** : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,` 100 (Continue) ` ——在请求大资源前的预热请求,` 206 (Partial Content) ` ——范围请求的标识码,` 409 (Conflict) ` ——请求与当前资源的规定冲突,` 410 (Gone) ` ——资源已被永久转移,而且没有任何已知的转发地址。
172- 3 . ** 缓存处理** : 在 HTTP1 .0 中主要使用 header 里的 If-Modified-Since, Expires 来做为缓存判断的标准,HTTP1 .1 则引入了更多的缓存控制策略例如 Entity tag, If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
173- 4 . ** 带宽优化及网络连接的使用** : HTTP1 .0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1 .1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206( Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接 。
174- 5 . ** Host 头处理** : HTTP/1.1 在请求头中加入了` Host ` 字段。
169+ 1 . ** 连接方式** : HTTP/ 1.0 为短连接,HTTP/ 1.1 支持长连接。
170+ 2 . ** 状态响应码** : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,` 100 (Continue) ` ——在请求大资源前的预热请求,` 206 (Partial Content) ` ——范围请求的标识码,` 409 (Conflict) ` ——请求与当前资源的规定冲突,` 410 (Gone) ` ——资源已被永久转移,而且没有任何已知的转发地址。
171+ 3 . ** 缓存处理** :在 HTTP/1 .0 中主要使用 header 里的 ` If-Modified-Since ` 、 ` Expires ` 来作为缓存判断的标准,HTTP/1 .1 则引入了更多的缓存控制策略,例如 ` Entity Tag ` 、 ` If-Unmodified-Since ` 、 ` If-Match ` 、 ` If-None-Match ` 等更多可供选择的缓存头来控制缓存策略。
172+ 4 . ** 带宽优化及网络连接的使用** :HTTP/1 .0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。HTTP/1 .1 则在请求头引入了 ` Range ` 头域,它允许只请求资源的某个部分,即返回码是 ` 206 ( Partial Content) ` ,这样就方便了开发者自由选择以便于充分利用带宽和连接 。
173+ 5 . ** Host 头处理** : HTTP/1.1 在请求头中加入了 ` Host ` 字段。
175174
176175## 参考资料
177176
0 commit comments