diff --git a/notes/HTTP.md b/notes/HTTP.md index e038a98d..e3191559 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -1,9 +1,9 @@ -* [基础概念](#基础概念) +* [一 、基础概念](#一-基础概念) * [Web 基础](#web-基础) * [URL](#url) * [请求和响应报文](#请求和响应报文) -* [HTTP 方法](#http-方法) +* [二、HTTP 方法](#二http-方法) * [GET:获取资源](#get获取资源) * [POST:传输实体主体](#post传输实体主体) * [HEAD:获取报文首部](#head获取报文首部) @@ -13,17 +13,17 @@ * [OPTIONS:查询支持的方法](#options查询支持的方法) * [CONNECT:要求用隧道协议连接代理](#connect要求用隧道协议连接代理) * [TRACE:追踪路径](#trace追踪路径) -* [HTTP 状态码](#http-状态码) +* [三、HTTP 状态码](#三http-状态码) * [2XX 成功](#2xx-成功) * [3XX 重定向](#3xx-重定向) * [4XX 客户端错误](#4xx-客户端错误) * [5XX 服务器错误](#5xx-服务器错误) -* [HTTP 首部](#http-首部) +* [四、HTTP 首部](#四http-首部) * [通用首部字段](#通用首部字段) * [请求首部字段](#请求首部字段) * [响应首部字段](#响应首部字段) * [实体首部字段](#实体首部字段) -* [具体应用](#具体应用) +* [五、具体应用](#五具体应用) * [Cookie](#cookie) * [缓存](#缓存) * [持久连接](#持久连接) @@ -34,18 +34,18 @@ * [内容协商](#内容协商) * [虚拟主机](#虚拟主机) * [通信数据转发](#通信数据转发) -* [HTTPs](#https) - * [加密](#加密) +* [六、HTTPs](#六https) + * [七、加密](#七加密) * [认证](#认证) * [完整性](#完整性) -* [各版本比较](#各版本比较) +* [八、各版本比较](#八各版本比较) * [HTTP/1.0 与 HTTP/1.1 的区别](#http10-与-http11-的区别) * [HTTP/1.1 与 HTTP/2.0 的区别](#http11-与-http20-的区别) * [参考资料](#参考资料) -# 基础概念 +# 一 、基础概念 ## Web 基础 @@ -65,15 +65,15 @@ URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基 ## 请求和响应报文 -**请求报文** +### 1. 请求报文

-**响应报文** +### 2. 响应报文

-# HTTP 方法 +# 二、HTTP 方法 客户端发送的 **请求报文** 第一行为请求行,包含了方法字段。 @@ -164,7 +164,7 @@ CONNECT www.example.com:443 HTTP/1.1

-# HTTP 状态码 +# 三、HTTP 状态码 服务器返回的 **响应报文** 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。 @@ -216,7 +216,7 @@ CONNECT www.example.com:443 HTTP/1.1 - **503 Service Unavilable** :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 -# HTTP 首部 +# 四、HTTP 首部 有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。 @@ -289,7 +289,7 @@ CONNECT www.example.com:443 HTTP/1.1 | Expires | 实体主体过期的日期时间 | | Last-Modified | 资源的最后修改日期时间 | -# 具体应用 +# 五、具体应用 ## Cookie @@ -297,7 +297,7 @@ HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使 Cookie 是服务器发送给客户端的数据,该数据会被保存在浏览器中,并且在下一次发送请求时包含该数据。通过 Cookie 可以让服务器知道两个请求是否来自于同一个客户端,从而实现保持登录状态等功能。 -**创建过程** +### 1. 创建过程 服务器发送的响应报文包含 Set-Cookie 字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。 @@ -318,7 +318,7 @@ Host: www.example.org Cookie: yummy_cookie=choco; tasty_cookie=strawberry ``` -**Set-Cookie** +### 2. Set-Cookie | 属性 | 说明 | | -- | -- | @@ -329,31 +329,31 @@ Cookie: yummy_cookie=choco; tasty_cookie=strawberry | Secure | 仅在 HTTPS 安全通信时才会发送 Cookie | | HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 | -**Session 和 Cookie 区别** +### 3. Session 和 Cookie 区别 Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文就包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是通过 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端。 -**浏览器禁用 Cookie 的情况** +### 4. 浏览器禁用 Cookie 的情况 会使用 URL 重写技术,在 URL 后面加上 sid=xxx 。 -**使用 Cookie 实现用户名和密码的自动填写** +### 5. 使用 Cookie 实现用户名和密码的自动填写 网站脚本会自动从保存在浏览器中的 Cookie 读取用户名和密码,从而实现自动填写。 ## 缓存 -**优点** +### 1. 优点 1. 降低服务器的负担; 2. 提高响应速度(缓存资源比服务器上的资源离客户端更近)。 -**实现方法** +### 2. 实现方法 1. 让代理服务器进行缓存; 2. 让客户端浏览器进行缓存。 -**Cache-Control 字段** +### 3. Cache-Control 字段 HTTP 通过 Cache-Control 首部字段来控制缓存。 @@ -361,19 +361,19 @@ HTTP 通过 Cache-Control 首部字段来控制缓存。 Cache-Control: private, max-age=0, no-cache ``` -**no-cache 指令** +### 4. no-cache 指令 该指令出现在请求报文的 Cache-Control 字段中,表示缓存服务器需要先向原服务器验证缓存资源是否过期; 该指令出现在响应报文的 Cache-Control 字段中,表示缓存服务器在进行缓存之前需要先验证缓存资源的有效性。 -**no-store 指令** +### 5. no-store 指令 该指令表示缓存服务器不能对请求或响应的任何一部分进行缓存。 no-cache 不表示不缓存,而是缓存之前需要先进行验证,no-store 才是不进行缓存。 -**max-age 指令** +### 6. max-age 指令 该指令出现在请求报文的 Cache-Control 字段中,如果缓存资源的缓存时间小于该指令指定的时间,那么就能接受该缓存。 @@ -456,7 +456,7 @@ Content-Length: 1024 ## 通信数据转发 -**代理** +### 1. 代理 代理服务器接受客户端的请求,并且转发给其它服务器。 @@ -466,19 +466,19 @@ Content-Length: 1024

-**网关** +### 2. 网关 与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而请求其它非 HTTP 服务器的服务。

-**隧道** +### 3. 隧道 使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。

-# HTTPs +# 六、HTTPs HTTP 有以下安全性问题: @@ -488,7 +488,7 @@ HTTP 有以下安全性问题: HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,再由 SSL 和 TCP 通信。通过使用 SSL,HTTPs 提供了加密、认证和完整性保护。 -## 加密 +## 七、加密 有两种加密方式:对称密钥加密和公开密钥加密。对称密钥加密的加密和解密使用同一密钥,而公开密钥加密使用一对密钥用于加密和解密,分别为公开密钥和私有密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。 @@ -514,7 +514,7 @@ HTTPs 采用 **混合的加密机制** ,使用公开密钥加密用于传输 SSL 提供摘要功能来验证完整性。 -# 各版本比较 +# 八、各版本比较 ## HTTP/1.0 与 HTTP/1.1 的区别 @@ -528,19 +528,19 @@ HTTP/1.1 新增了以下内容: ## HTTP/1.1 与 HTTP/2.0 的区别 -**多路复用** +### 1. 多路复用 HTTP/2.0 使用多路复用技术,使用同一个 TCP 连接来处理多个请求。 -**首部压缩** +### 2. 首部压缩 HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表,从而避免了重复传输。 -**服务端推送** +### 3. 服务端推送 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。 -**二进制格式** +### 4. 二进制格式 HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。