HTTP 基礎(chǔ)

轉(zhuǎn)載自 github:Interview-Notebook,有刪減和改動(dòng)
參考:《圖解 HTTP》

一 、基礎(chǔ)概念

Web 基礎(chǔ)

  • HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)。
  • WWW(World Wide Web)的三種技術(shù):HTML、HTTP、URL。
  • RFC(Request for Comments,征求修正意見書),互聯(lián)網(wǎng)的設(shè)計(jì)文檔。

URL

  • URI(Uniform Resource Indentifier,統(tǒng)一資源標(biāo)識(shí)符)
  • URL(Uniform Resource Locator,統(tǒng)一資源定位符)
  • URN(Uniform Resource Name,統(tǒng)一資源名稱),例如 urn:isbn:0-486-27557-4 。

URI 包含 URL 和 URN,目前 WEB 只有 URL 比較流行,所以見到的基本都是 URL。

請(qǐng)求和響應(yīng)報(bào)文

1. 請(qǐng)求報(bào)文

HTTP_RequestMessageExample.png

2. 響應(yīng)報(bào)文

HTTP_ResponseMessageExample.png

二、HTTP 方法

客戶端發(fā)送的 請(qǐng)求報(bào)文 第一行為請(qǐng)求行,包含了方法字段。

GET

獲取資源

當(dāng)前網(wǎng)絡(luò)請(qǐng)求中,絕大部分使用的是 GET 方法。

HEAD

獲取報(bào)文首部

和 GET 方法一樣,但是不返回報(bào)文實(shí)體主體部分。

主要用于確認(rèn) URL 的有效性以及資源更新的日期時(shí)間等。

POST

傳輸實(shí)體主體

POST 主要用來(lái)傳輸數(shù)據(jù),而 GET 主要用來(lái)獲取資源。

更多 POST 與 GET 的比較請(qǐng)見第八章。

PUT

上傳文件

由于自身不帶驗(yàn)證機(jī)制,任何人都可以上傳文件,因此存在安全性問(wèn)題,一般不使用該方法。

PUT /new.html HTTP/1.1
Host: example.com
Content-type: text/html
Content-length: 16

<p>New File</p>

PATCH

對(duì)資源進(jìn)行部分修改

PUT 也可以用于修改資源,但是只能完全替代原始資源,PATCH 允許部分修改。

PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 100

[description of changes]

DELETE

刪除文件

與 PUT 功能相反,并且同樣不帶驗(yàn)證機(jī)制。

DELETE /file.html HTTP/1.1

OPTIONS

查詢支持的方法

查詢指定的 URL 能夠支持的方法。

會(huì)返回 Allow: GET, POST, HEAD, OPTIONS 這樣的內(nèi)容。

CONNECT

要求用隧道協(xié)議連接代理

要求在與代理服務(wù)器通信時(shí)建立隧道,使用 SSL(Secure Sockets Layer,安全套接層)和 TLS(Transport Layer Security,傳輸層安全)協(xié)議把通信內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸。

CONNECT www.example.com:443 HTTP/1.1

TRACE

追蹤路徑

服務(wù)器會(huì)將通信路徑返回給客戶端。

發(fā)送請(qǐng)求時(shí),在 Max-Forwards 首部字段中填入數(shù)值,每經(jīng)過(guò)一個(gè)服務(wù)器就會(huì)減 1,當(dāng)數(shù)值為 0 時(shí)就停止傳輸。

通常不會(huì)使用 TRACE,并且它容易受到 XST 攻擊(Cross-Site Tracing,跨站追蹤),因此更不會(huì)去使用它。

三、HTTP 狀態(tài)碼

服務(wù)器返回的 響應(yīng)報(bào)文 中第一行為狀態(tài)行,包含了狀態(tài)碼以及原因短語(yǔ),用來(lái)告知客戶端請(qǐng)求的結(jié)果。

狀態(tài)碼 類別 原因短語(yǔ)
1XX Informational(信息性狀態(tài)碼) 接收的請(qǐng)求正在處理
2XX Success(成功狀態(tài)碼) 請(qǐng)求正常處理完畢
3XX Redirection(重定向狀態(tài)碼) 需要進(jìn)行附加操作以完成請(qǐng)求
4XX Client Error(客戶端錯(cuò)誤狀態(tài)碼) 服務(wù)器無(wú)法處理請(qǐng)求
5XX Server Error(服務(wù)器錯(cuò)誤狀態(tài)碼) 服務(wù)器處理請(qǐng)求出錯(cuò)

1XX 信息

  • 100 Continue :表明到目前為止都很正常,客戶端可以繼續(xù)發(fā)送請(qǐng)求或者忽略這個(gè)響應(yīng)。

2XX 成功

  • 200 OK

  • 204 No Content :請(qǐng)求已經(jīng)成功處理,但是返回的響應(yīng)報(bào)文不包含實(shí)體的主體部分。一般在只需要從客戶端往服務(wù)器發(fā)送信息,而不需要返回?cái)?shù)據(jù)時(shí)使用。

  • 206 Partial Content :表示客戶端進(jìn)行了范圍請(qǐng)求。響應(yīng)報(bào)文包含由 Content-Range 指定范圍的實(shí)體內(nèi)容。

3XX 重定向

  • 301 Moved Permanently :永久性重定向

  • 302 Found :臨時(shí)性重定向

  • 303 See Other :和 302 有著相同的功能,但是 303 明確要求客戶端應(yīng)該采用 GET 方法獲取資源。

  • 注:雖然 HTTP 協(xié)議規(guī)定 301、302 狀態(tài)下重定向時(shí)不允許把 POST 方法改成 GET 方法,但是大多數(shù)瀏覽器都會(huì)在 301、302 和 303 狀態(tài)下的重定向把 POST 方法改成 GET 方法。

  • 304 Not Modified :如果請(qǐng)求報(bào)文首部包含一些條件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,如果不滿足條件,則服務(wù)器會(huì)返回 304 狀態(tài)碼。

  • 307 Temporary Redirect :臨時(shí)重定向,與 302 的含義類似,但是 307 要求瀏覽器不會(huì)把重定向請(qǐng)求的 POST 方法改成 GET 方法。

4XX 客戶端錯(cuò)誤

  • 400 Bad Request :請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤。

  • 401 Unauthorized :該狀態(tài)碼表示發(fā)送的請(qǐng)求需要有認(rèn)證信息(BASIC 認(rèn)證、DIGEST 認(rèn)證)。如果之前已進(jìn)行過(guò)一次請(qǐng)求,則表示用戶認(rèn)證失敗。

  • 403 Forbidden :請(qǐng)求被拒絕,服務(wù)器端沒(méi)有必要給出拒絕的詳細(xì)理由。

  • 404 Not Found

5XX 服務(wù)器錯(cuò)誤

  • 500 Internal Server Error :服務(wù)器正在執(zhí)行請(qǐng)求時(shí)發(fā)生錯(cuò)誤。

  • 503 Service Unavilable :服務(wù)器暫時(shí)處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù),現(xiàn)在無(wú)法處理請(qǐng)求。

四、HTTP 首部

有 4 種類型的首部字段:通用首部字段、請(qǐng)求首部字段、響應(yīng)首部字段和實(shí)體首部字段。

各種首部字段及其含義如下(不需要全記,僅供查閱):

通用首部字段

首部字段名 說(shuō)明
Cache-Control 控制緩存的行為
Connection 控制不再轉(zhuǎn)發(fā)給代理的首部字段、管理持久連接
Date 創(chuàng)建報(bào)文的日期時(shí)間
Pragma 報(bào)文指令
Trailer 報(bào)文末端的首部一覽
Transfer-Encoding 指定報(bào)文主體的傳輸編碼方式
Upgrade 升級(jí)為其他協(xié)議
Via 代理服務(wù)器的相關(guān)信息
Warning 錯(cuò)誤通知

請(qǐng)求首部字段

首部字段名 說(shuō)明
Accept 用戶代理可處理的媒體類型
Accept-Charset 優(yōu)先的字符集
Accept-Encoding 優(yōu)先的內(nèi)容編碼
Accept-Language 優(yōu)先的語(yǔ)言(自然語(yǔ)言)
Authorization Web 認(rèn)證信息
Expect 期待服務(wù)器的特定行為
From 用戶的電子郵箱地址
Host 請(qǐng)求資源所在服務(wù)器
If-Match 比較實(shí)體標(biāo)記(ETag)
If-Modified-Since 比較資源的更新時(shí)間
If-None-Match 比較實(shí)體標(biāo)記(與 If-Match 相反)
If-Range 資源未更新時(shí)發(fā)送實(shí)體 Byte 的范圍請(qǐng)求
If-Unmodified-Since 比較資源的更新時(shí)間(與 If-Modified-Since 相反)
Max-Forwards 最大傳輸逐跳數(shù)
Proxy-Authorization 代理服務(wù)器要求客戶端的認(rèn)證信息
Range 實(shí)體的字節(jié)范圍請(qǐng)求
Referer 對(duì)請(qǐng)求中 URI 的原始獲取方
TE 傳輸編碼的優(yōu)先級(jí)
User-Agent HTTP 客戶端程序的信息

響應(yīng)首部字段

首部字段名 說(shuō)明
Accept-Ranges 是否接受字節(jié)范圍請(qǐng)求
Age 推算資源創(chuàng)建經(jīng)過(guò)時(shí)間
ETag 資源的匹配信息
Location 令客戶端重定向至指定 URI
Proxy-Authenticate 代理服務(wù)器對(duì)客戶端的認(rèn)證信息
Retry-After 對(duì)再次發(fā)起請(qǐng)求的時(shí)機(jī)要求
Server HTTP 服務(wù)器的安裝信息
Vary 代理服務(wù)器緩存的管理信息
WWW-Authenticate 服務(wù)器對(duì)客戶端的認(rèn)證信息

實(shí)體首部字段

首部字段名 說(shuō)明
Allow 資源可支持的 HTTP 方法
Content-Encoding 實(shí)體主體適用的編碼方式
Content-Language 實(shí)體主體的自然語(yǔ)言
Content-Length 實(shí)體主體的大小
Content-Location 替代對(duì)應(yīng)資源的 URI
Content-MD5 實(shí)體主體的報(bào)文摘要
Content-Range 實(shí)體主體的位置范圍
Content-Type 實(shí)體主體的媒體類型
Expires 實(shí)體主體過(guò)期的日期時(shí)間
Last-Modified 資源的最后修改日期時(shí)間

五、具體應(yīng)用

Cookie

HTTP 協(xié)議是無(wú)狀態(tài)的,主要是為了讓 HTTP 協(xié)議盡可能簡(jiǎn)單,使得它能夠處理大量事務(wù)。HTTP/1.1 引入 Cookie 來(lái)保存狀態(tài)信息。

Cookie 是服務(wù)器發(fā)送給客戶端的數(shù)據(jù),該數(shù)據(jù)會(huì)被保存在瀏覽器中,并且客戶端的下一次請(qǐng)求報(bào)文會(huì)包含該數(shù)據(jù)。通過(guò) Cookie 可以讓服務(wù)器知道兩個(gè)請(qǐng)求是否來(lái)自于同一個(gè)客戶端,從而實(shí)現(xiàn)保持登錄狀態(tài)等功能。

1. 創(chuàng)建過(guò)程

服務(wù)器發(fā)送的響應(yīng)報(bào)文包含 Set-Cookie 字段,客戶端得到響應(yīng)報(bào)文后把 Cookie 內(nèi)容保存到瀏覽器中。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[page content]

客戶端之后發(fā)送請(qǐng)求時(shí),會(huì)從瀏覽器中讀出 Cookie 值,在請(qǐng)求報(bào)文中包含 Cookie 字段。

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

2. 分類

  • 會(huì)話期 Cookie:瀏覽器關(guān)閉之后它會(huì)被自動(dòng)刪除,也就是說(shuō)它僅在會(huì)話期內(nèi)有效。
  • 持久性 Cookie:指定一個(gè)特定的過(guò)期時(shí)間(Expires)或有效期(Max-Age)之后就成為了持久性的 Cookie。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

3. Set-Cookie

屬性 說(shuō)明
NAME=VALUE 賦予 Cookie 的名稱和其值(必需項(xiàng))
expires=DATE Cookie 的有效期(若不明確指定則默認(rèn)為瀏覽器關(guān)閉前為止)
path=PATH 將服務(wù)器上的文件目錄作為 Cookie 的適用對(duì)象(若不指定則默認(rèn)為文檔所在的文件目錄)
domain=域名 作為 Cookie 適用對(duì)象的域名(若不指定則默認(rèn)為創(chuàng)建 Cookie 的服務(wù)器的域名)
Secure 僅在 HTTPs 安全通信時(shí)才會(huì)發(fā)送 Cookie
HttpOnly 加以限制,使 Cookie 不能被 JavaScript 腳本訪問(wèn)

4. Session 和 Cookie 區(qū)別

Session 是服務(wù)器用來(lái)跟蹤用戶的一種手段,每個(gè) Session 都有一個(gè)唯一標(biāo)識(shí):Session ID。當(dāng)服務(wù)器創(chuàng)建了一個(gè) Session 時(shí),給客戶端發(fā)送的響應(yīng)報(bào)文包含了 Set-Cookie 字段,其中有一個(gè)名為 sid 的鍵值對(duì),這個(gè)鍵值對(duì)就是 Session ID。客戶端收到后就把 Cookie 保存在瀏覽器中,并且之后發(fā)送的請(qǐng)求報(bào)文都包含 Session ID。HTTP 就是通過(guò) Session 和 Cookie 這兩種方式一起合作來(lái)實(shí)現(xiàn)跟蹤用戶狀態(tài)的,Session 用于服務(wù)器端,Cookie 用于客戶端。

5. 瀏覽器禁用 Cookie 的情況

會(huì)使用 URL 重寫技術(shù),在 URL 后面加上 sid=xxx 。

6. 使用 Cookie 實(shí)現(xiàn)用戶名和密碼的自動(dòng)填寫

網(wǎng)站腳本會(huì)自動(dòng)從保存在瀏覽器中的 Cookie 讀取用戶名和密碼,從而實(shí)現(xiàn)自動(dòng)填寫。

但是如果 Set-Cookie 指定了 HttpOnly 屬性,就無(wú)法通過(guò) Javascript 腳本獲取 Cookie 信息,這是出于安全性考慮。

緩存

1. 優(yōu)點(diǎn)

  1. 降低服務(wù)器的負(fù)擔(dān);
  2. 提高響應(yīng)速度(緩存資源比服務(wù)器上的資源離客戶端更近)。

2. 實(shí)現(xiàn)方法

  1. 讓代理服務(wù)器進(jìn)行緩存;
  2. 讓客戶端瀏覽器進(jìn)行緩存。

3. Cache-Control 字段

HTTP 通過(guò) Cache-Control 首部字段來(lái)控制緩存。

Cache-Control: private, max-age=0, no-cache

4. no-cache 指令

該指令出現(xiàn)在請(qǐng)求報(bào)文的 Cache-Control 字段中,表示緩存服務(wù)器需要先向原服務(wù)器驗(yàn)證緩存資源是否過(guò)期;

該指令出現(xiàn)在響應(yīng)報(bào)文的 Cache-Control 字段中,表示緩存服務(wù)器在進(jìn)行緩存之前需要先驗(yàn)證緩存資源的有效性。

5. no-store 指令

該指令表示緩存服務(wù)器不能對(duì)請(qǐng)求或響應(yīng)的任何一部分進(jìn)行緩存。

no-cache 不表示不緩存,而是緩存之前需要先進(jìn)行驗(yàn)證,no-store 才是不進(jìn)行緩存。

6. max-age 指令

該指令出現(xiàn)在請(qǐng)求報(bào)文的 Cache-Control 字段中,如果緩存資源的緩存時(shí)間小于該指令指定的時(shí)間,那么就能接受該緩存。

該指令出現(xiàn)在響應(yīng)報(bào)文的 Cache-Control 字段中,表示緩存資源在緩存服務(wù)器中保存的時(shí)間。

Expires 字段也可以用于告知緩存服務(wù)器該資源什么時(shí)候會(huì)過(guò)期。在 HTTP/1.1 中,會(huì)優(yōu)先處理 Cache-Control : max-age 指令;而在 HTTP/1.0 中,Cache-Control : max-age 指令會(huì)被忽略掉。

持久連接

當(dāng)瀏覽器訪問(wèn)一個(gè)包含多張圖片的 HTML 頁(yè)面時(shí),除了請(qǐng)求訪問(wèn) HTML 頁(yè)面資源,還會(huì)請(qǐng)求圖片資源,如果每進(jìn)行一次 HTTP 通信就要斷開一次 TCP 連接,連接建立和斷開的開銷會(huì)很大。持久連接只需要建立一次 TCP 連接就能進(jìn)行多次 HTTP 通信。

持久連接需要使用 Connection 首部字段進(jìn)行管理。HTTP/1.1 開始 HTTP 默認(rèn)是持久化連接的,如果要斷開 TCP 連接,需要由客戶端或者服務(wù)器端提出斷開,使用 Connection : close;而在 HTTP/1.1 之前默認(rèn)是非持久化連接的,如果要維持持續(xù)連接,需要使用 Connection : Keep-Alive。

管線化處理

HTTP/1.1 支持管線化處理,可以同時(shí)發(fā)送多個(gè)請(qǐng)求和響應(yīng),而不需要發(fā)送一個(gè)請(qǐng)求然后等待響應(yīng)之后再發(fā)下一個(gè)請(qǐng)求。

編碼

編碼(Encoding)主要是為了對(duì)實(shí)體進(jìn)行壓縮。常用的編碼有:gzip、compress、deflate、identity,其中 identity 表示不執(zhí)行壓縮的編碼格式。

分塊傳輸編碼

Chunked Transfer Coding,可以把數(shù)據(jù)分割成多塊,讓瀏覽器逐步顯示頁(yè)面。

多部分對(duì)象集合

一份報(bào)文主體內(nèi)可含有多種類型的實(shí)體同時(shí)發(fā)送,每個(gè)部分之間用 boundary 字段定義的分隔符進(jìn)行分隔,每個(gè)部分都可以有首部字段。

例如,上傳多個(gè)表單時(shí)可以使用如下方式:

Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

范圍請(qǐng)求

如果網(wǎng)絡(luò)出現(xiàn)中斷,服務(wù)器只發(fā)送了一部分?jǐn)?shù)據(jù),范圍請(qǐng)求使得客戶端能夠只請(qǐng)求未發(fā)送的那部分?jǐn)?shù)據(jù),從而避免服務(wù)器端重新發(fā)送所有數(shù)據(jù)。

在請(qǐng)求報(bào)文首部中添加 Range 字段指定請(qǐng)求的范圍,請(qǐng)求成功的話服務(wù)器發(fā)送 206 Partial Content 狀態(tài)。

GET /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
Range: bytes=0-1023
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
...
(binary content)

內(nèi)容協(xié)商

通過(guò)內(nèi)容協(xié)商返回最合適的內(nèi)容,例如根據(jù)瀏覽器的默認(rèn)語(yǔ)言選擇返回中文界面還是英文界面。

涉及以下首部字段:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language。

虛擬主機(jī)

HTTP/1.1 使用虛擬主機(jī)技術(shù),使得一臺(tái)服務(wù)器擁有多個(gè)域名,并且在邏輯上可以看成多個(gè)服務(wù)器。

使用 Host 首部字段進(jìn)行處理。

通信數(shù)據(jù)轉(zhuǎn)發(fā)

1. 代理

代理服務(wù)器接受客戶端的請(qǐng)求,并且轉(zhuǎn)發(fā)給其它服務(wù)器。

使用代理的主要目的是:緩存、網(wǎng)絡(luò)訪問(wèn)控制以及訪問(wèn)日志記錄。

代理服務(wù)器分為正向代理和反向代理兩種,用戶察覺得到正向代理的存在,而反向代理一般位于內(nèi)部網(wǎng)絡(luò)中,用戶察覺不到。

2. 網(wǎng)關(guān)

與代理服務(wù)器不同的是,網(wǎng)關(guān)服務(wù)器會(huì)將 HTTP 轉(zhuǎn)化為其它協(xié)議進(jìn)行通信,從而請(qǐng)求其它非 HTTP 服務(wù)器的服務(wù)。

3. 隧道

使用 SSL 等加密手段,為客戶端和服務(wù)器之間建立一條安全的通信線路。隧道本身不去解析 HTTP 請(qǐng)求。

六、HTTPs

HTTP 有以下安全性問(wèn)題:

  1. 使用明文進(jìn)行通信,內(nèi)容可能會(huì)被竊聽;
  2. 不驗(yàn)證通信方的身份,通信方的身份有可能遭遇偽裝;
  3. 無(wú)法證明報(bào)文的完整性,報(bào)文有可能遭篡改。

HTTPs 并不是新協(xié)議,而是 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是說(shuō) HTTPs 使用了隧道進(jìn)行通信。

通過(guò)使用 SSL,HTTPs 具有了加密、認(rèn)證和完整性保護(hù)。

ssl-offloading.jpg

加密

1. 對(duì)稱密鑰加密

對(duì)稱密鑰加密(Symmetric-Key Encryption),加密的加密和解密使用同一密鑰。

  • 優(yōu)點(diǎn):運(yùn)算速度快;
  • 缺點(diǎn):密鑰容易被獲取。
7fffa4b8-b36d-471f-ad0c-a88ee763bb76.png

2. 公開密鑰加密

公開密鑰加密(Public-Key Encryption),也稱為非對(duì)稱密鑰加密,使用一對(duì)密鑰用于加密和解密,分別為公開密鑰和私有密鑰。公開密鑰所有人都可以獲得,通信發(fā)送方獲得接收方的公開密鑰之后,就可以使用公開密鑰進(jìn)行加密,接收方收到通信內(nèi)容后使用私有密鑰解密。

  • 優(yōu)點(diǎn):更為安全;
  • 缺點(diǎn):運(yùn)算速度慢;
39ccb299-ee99-4dd1-b8b4-2f9ec9495cb4.png

3. HTTPs 采用的加密方式

HTTPs 采用混合的加密機(jī)制,使用公開密鑰加密用于傳輸對(duì)稱密鑰,之后使用對(duì)稱密鑰加密進(jìn)行通信。(下圖中的 Session Key 就是對(duì)稱密鑰)

How-HTTPS-Works.png

認(rèn)證

通過(guò)使用 證書 來(lái)對(duì)通信方進(jìn)行認(rèn)證。

數(shù)字證書認(rèn)證機(jī)構(gòu)(CA,Certificate Authority)是客戶端與服務(wù)器雙方都可信賴的第三方機(jī)構(gòu)。服務(wù)器的運(yùn)營(yíng)人員向 CA 提出公開密鑰的申請(qǐng),CA 在判明提出申請(qǐng)者的身份之后,會(huì)對(duì)已申請(qǐng)的公開密鑰做數(shù)字簽名,然后分配這個(gè)已簽名的公開密鑰,并將該公開密鑰放入公開密鑰證書后綁定在一起。

進(jìn)行 HTTPs 通信時(shí),服務(wù)器會(huì)把證書發(fā)送給客戶端,客戶端取得其中的公開密鑰之后,先進(jìn)行驗(yàn)證,如果驗(yàn)證通過(guò),就可以開始通信。

使用 OpenSSL 這套開源程序,每個(gè)人都可以構(gòu)建一套屬于自己的認(rèn)證機(jī)構(gòu),從而自己給自己頒發(fā)服務(wù)器證書。瀏覽器在訪問(wèn)該服務(wù)器時(shí),會(huì)顯示“無(wú)法確認(rèn)連接安全性”或“該網(wǎng)站的安全證書存在問(wèn)題”等警告消息。

mutualssl_small.png

完整性

SSL 提供報(bào)文摘要功能來(lái)驗(yàn)證完整性。

七、Q and A

Get 請(qǐng)求和 Post 請(qǐng)求的區(qū)別

  • 參數(shù)傳遞:GET 的參數(shù)只能帶在URL后面,URL有長(zhǎng)度限制,一般為2048個(gè)字符。POST 請(qǐng)求參數(shù)在 body 中,長(zhǎng)度無(wú)明確規(guī)定的限制。GET 因?yàn)閰?shù)在URL中可見,安全性較差。
  • 冪等性:GET 是冪等的,POST 不是冪等的。引入冪等主要是為了處理同一個(gè)請(qǐng)求重復(fù)發(fā)送的情況,比如在請(qǐng)求響應(yīng)前失去連接,如果方法是冪等的,就可以放心地重發(fā)一次請(qǐng)求。GET后退按鈕/刷新無(wú)害,POST數(shù)據(jù)會(huì)被重新提交(瀏覽器應(yīng)該告知用戶數(shù)據(jù)會(huì)被重新提交)。
  • 可緩存性:GET 是可被緩存的,POST是不可被緩存的。
  • GET 不可指定編碼類型(只允許ASCII字符),POST 可以指定編碼類型,也允許二進(jìn)制數(shù)據(jù)。
  • GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包。對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù)); 而對(duì)于POST,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 本系列主要分析OKHttp源代碼的框架和設(shè)計(jì)思想,因?yàn)镺KHttp實(shí)現(xiàn)了HTTP協(xié)議,所以在做源代碼分析之前...
    嘎啦果安卓獸閱讀 4,288評(píng)論 1 15
  • 本篇文章篇幅比較長(zhǎng),先來(lái)個(gè)思維導(dǎo)圖預(yù)覽一下。 一、概述 1.計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)分層 2.TCP/IP 通信傳輸流 ...
    滌生_Woo閱讀 56,193評(píng)論 24 557
  • 1. 網(wǎng)絡(luò)基礎(chǔ)TCP/IP HTTP基于TCP/IP協(xié)議族,HTTP屬于它內(nèi)部的一個(gè)子集。 把互聯(lián)網(wǎng)相關(guān)聯(lián)的協(xié)議集...
    yozosann閱讀 3,600評(píng)論 0 20
  • 本文是《圖解HTTP》讀書筆記的第二篇,主要包括此書的第六章內(nèi)容,因?yàn)榈诹碌膬?nèi)容較多,而且比較重要,所以單獨(dú)寫為...
    lijiankun24閱讀 1,498評(píng)論 0 6
  • 30mins 平和的一次站樁。 偶爾走神,又自然的回來(lái)。 身體的感覺不突出,后面一小段全身發(fā)熱,越來(lái)越熱,尤其是上...
    Marmotgo閱讀 202評(píng)論 0 0

友情鏈接更多精彩內(nèi)容