From 0090bc2d73b0c8750df67b810681d9f1f9a2ad2a Mon Sep 17 00:00:00 2001 From: Zoctan <752481828@qq.com> Date: Sun, 1 Apr 2018 22:05:20 +0800 Subject: [PATCH] Update HTTP.md --- notes/HTTP.md | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/notes/HTTP.md b/notes/HTTP.md index b39b41ab..8ee5c3b8 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -89,17 +89,23 @@ URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基 当前网络请求中,绝大部分使用的是 GET 方法。 +- 安全 +- 幂等(任意多次请求所产生的响应均与一次执行的响应相同) +- 可缓存的(除非有 Cache-ControlHeader 约束) + ## POST > 传输实体主体 POST 主要目的不是获取资源,而是传输存储在内容实体中的数据。 -GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在内容实体。 +- 不安全 +- 不幂等 +- (大部分实现)不可缓存 -GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 中是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。 - -GET 和 POST 的另一个区别是,使用 GET 方法,浏览器会把 HTTP Header 和 Data 一并发送出去,服务器响应 200(OK)并返回数据。而使用 POST 方法,浏览器先发送 Header,服务器响应 100(Continue)之后,浏览器再发送 Data,最后服务器响应 200(OK)并返回数据。 +这里指的“安全”在不同情况下是有不同解释的: +- 网络安全:两者都是一样的,HTTP 下两者都是明文,HTTPS 下两者都是密文。 +- RFC2616 9.1.1中,GET 被称为安全方法,而 POST 却不是,因为 GET 和 HEAD 方法应该只用于检索数据,而不是添加、更新和删除。 ``` GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1 @@ -726,12 +732,35 @@ strSQL = "SELECT * FROM users;" HTTP/1.1 新增了以下内容: -- 默认为长连接; +- 默认为长连接(PersistentConnection); - 提供了范围请求功能; - 提供了虚拟主机的功能; - 多了一些缓存处理字段; - 多了一些状态码。 +### 1. 长连接(PersistentConnection) + HTTP/1.0 规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。 + HTTP/1.1 支持持久连接, 并且默认使用该方式,但也需要增加新的请求头来帮助实现。例如,请求头的值为 Keep-Alive 时,客户端通知服务器返回本次请求结果后保持连接;请求头的值为 close 时,客户端通知服务器返回本次请求结果后关闭连接。 + +### 2. 请求的流水线(Pipelining)处理 + 在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少建立和关闭连接的消耗和延迟。例如,一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。 + HTTP/1.1 允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。 + +### 3. Host 字段 + HTTP/1.0 中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的 URL 并没有传递主机名(Hostname)。 + 但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。 + HTTP/1.1 的请求消息和响应消息都应支持Host头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。 + +### 4. 状态码 100(Continue) + 客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就返回响应码 401(Unauthorized);如果服务器接收此请求就回送响应码 100,客户端就可以继续发送带实体的完整请求了。 + 优点:允许客户端在发送完整请求前先用请求头试探服务器,确认服务器是否接收,再决定要不要继续发。(节约带宽) + +### 5. 分块传输编码 + 发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。这种方法允许发送方只缓冲消息的一个片段,避免缓冲整个消息带来的过载。 + +### 6. 缓存处理字段 + HTTP/1.1 在 1.0 的基础上加入了一些 Cache 的新特性,当缓存对象的 Age 超过 Expire 时变为 stale 对象,Cache 不需要直接抛弃 stale 对象,而是与源服务器进行重新激活(revalidation)。 + ## HTTP/1.1 与 HTTP/2.0 的区别 ### 1. 多路复用