前言:
最近這段時(shí)間慢慢的在補(bǔ)充基礎(chǔ)知識(shí),其中最先開(kāi)始看的一本書(shū)就是【圖解HTTP】這本書(shū)非常適合新手入門,里面的內(nèi)容把廣泛上需要了解的HTTP相關(guān)知識(shí)點(diǎn)都講,又不會(huì)讓讀者記得泛泛或者小兒科,以下是我在閱讀的時(shí)候做的讀書(shū)筆記以加深印象已經(jīng)理解。
第一章 了解Web及網(wǎng)絡(luò)基礎(chǔ)
Web使用一種名為HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)的協(xié)議作為規(guī)范,完成客戶端到服務(wù)器端一系列運(yùn)作流程,也就是說(shuō),Web是建立在HTTP協(xié)議上通信的。
通?;ヂ?lián)網(wǎng)是在 TCP/IP 協(xié)議族的基礎(chǔ)上運(yùn)作的,HTTP屬于這個(gè)族的一個(gè)子集。
TCP/IP 協(xié)議很重要的一個(gè)概念就是分層。按層次分別為:
應(yīng)用層 >>> 傳輸層 >>> 網(wǎng)絡(luò)層 >>> 鏈路層。
一個(gè)HTTP請(qǐng)求發(fā)出后,大致的流程即是這樣的:
首先客戶端在應(yīng)用層發(fā)出一個(gè)想看某個(gè)Web頁(yè)面的HTTP請(qǐng)求 >>>
為方便傳輸,傳輸層把從應(yīng)用層收到的數(shù)據(jù)(HTTP請(qǐng)求報(bào)文)分割成多個(gè)數(shù)據(jù)包并標(biāo)記序號(hào)后,轉(zhuǎn)發(fā)給網(wǎng)絡(luò)層 >>>
在網(wǎng)絡(luò)層增加作為通信目的地的MAC地址后轉(zhuǎn)發(fā)給鏈路層。
至此,發(fā)往網(wǎng)絡(luò)的通信請(qǐng)求就準(zhǔn)備好了。發(fā)送端或者接收端,層與層之間傳遞數(shù)據(jù)時(shí),每一層會(huì)被打上或消去該層所屬的首部信息。
DNS(Domain Name System)服務(wù)是和 HTTP 協(xié)議一樣位于應(yīng)用層的協(xié)議。它提供域名到 IP 地址的解析服務(wù)。
TCP 協(xié)議位于傳輸層,提供可靠的字節(jié)流服務(wù)。因?yàn)閭鬏攲訉?shù)據(jù)分割,TCP 協(xié)議采用三次握手(three-way handshaking)策略以確保數(shù)據(jù)準(zhǔn)確送達(dá):首先發(fā)送一個(gè)帶有 SYN 標(biāo)志的數(shù)據(jù)包給對(duì)方 >>>
接收端收到后回傳一個(gè)帶有 SYN/ACK 標(biāo)志的送達(dá)確認(rèn)信息 >>>
最后發(fā)送端再回傳一個(gè)帶有 ACK 標(biāo)志的數(shù)據(jù)包。
至此,“握手”結(jié)束。IP 協(xié)議位于網(wǎng)絡(luò)層。作用是把各種數(shù)據(jù)包發(fā)送給對(duì)方。在此期間,會(huì)通過(guò)一個(gè) ARP 協(xié)議將 IP 地址解析為 MAC 地址。
第二章 簡(jiǎn)單的HTTP協(xié)議
HTTP 協(xié)議規(guī)定,請(qǐng)求從客戶端發(fā)出,最后服務(wù)器端響應(yīng)請(qǐng)求并返回。也就是說(shuō),一定是從客戶端開(kāi)始建立通信,服務(wù)器端沒(méi)有接收到請(qǐng)求之前不會(huì)發(fā)送響應(yīng)。
請(qǐng)求報(bào)文是由請(qǐng)求方法、請(qǐng)求URI、協(xié)議版本、請(qǐng)求首部字段(可選)和內(nèi)容實(shí)體構(gòu)成的。
GET /html/index.html HTTP/1.1
Host: ddrenched.com
name=ddrenched
- 響應(yīng)報(bào)文是由協(xié)議版本、狀態(tài)碼、狀態(tài)碼原因短語(yǔ)、響應(yīng)首部字段(可選)和主體構(gòu)成。
HTTP/1.1 200 OK
Date: Fri, 30 Jua 2017 10:59:19 GMT
<html>
...
HTTP 是不保存狀態(tài)的協(xié)議:不對(duì)請(qǐng)求和響應(yīng)的通信狀態(tài)進(jìn)行保存。
每當(dāng)有新的請(qǐng)求發(fā)送時(shí),就會(huì)有對(duì)應(yīng)的新響應(yīng)產(chǎn)生。
這是為了快速處理大量任務(wù)。-
HTTP 方法
- GET:獲取資源。該方法用來(lái)請(qǐng)求訪問(wèn)已經(jīng) URI 識(shí)別的資源。
- HEAD:獲取報(bào)文首部。和 GET 方法一樣,只是不返回報(bào)文主 體。常用來(lái)確認(rèn) URI 的有效性和資源的更新時(shí)間等。
- POST:傳輸實(shí)體資源。該方法用來(lái)傳輸實(shí)體的主體。雖然 GET 方法也可以傳輸實(shí)體的主體,但一般用 POST 方法。
- PUT:用來(lái)傳輸文件。要求在請(qǐng)求報(bào)文的主體中包含內(nèi)容,然后保存到請(qǐng)求的 URI 指定的位置。
- DELETE:用來(lái)刪除文件。與PUT方法相反,DELETE 方法按照請(qǐng)求 URI 刪除指定資源。
- OPTION:用來(lái)查詢請(qǐng)求的 URI 資源支持的方法。
CONNECT:要求與代理服務(wù)器通信時(shí)建立隧道,實(shí)現(xiàn)用隧道協(xié)議進(jìn)行 TCP 通信。主要是為了使用 SSL(Secure Socket Layer,安全套接)和 TLS(Transport Layer Security,傳輸層安全)協(xié)議把信息內(nèi)容加密后經(jīng)網(wǎng)絡(luò)隧道傳輸。
持久連接:只要任意一方(客戶端和服務(wù)器端)沒(méi)有明確提出斷開(kāi)連接,則保持 TCP 連接狀態(tài)。
在 HTTP1.1 中,所有連接默認(rèn)都是持久的。Cookie 技術(shù)通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫(xiě)入 Cookie 信息來(lái)控制客戶端狀態(tài)。
Cookie 會(huì)根據(jù)服務(wù)器端發(fā)送的響應(yīng)報(bào)文內(nèi)的一個(gè)叫 Set-Cookie 的首部字段,通知客戶端保存 Cookie。當(dāng)下次客戶端發(fā)送請(qǐng)求到服務(wù)器端時(shí),客戶端會(huì)在報(bào)文中加入 Cookie 值再發(fā)送出去。
第4章 返回結(jié)果的 HTTP 狀態(tài)碼
狀態(tài)碼的職責(zé)是描述客戶端發(fā)出請(qǐng)求的返回結(jié)果,狀態(tài)碼以三位數(shù)字和原因短語(yǔ)組成。
數(shù)字中的第一位指定了響應(yīng)類別:1XX:Informationao(信息性狀態(tài)碼)接受的請(qǐng)求正在處理
2XX:Success(成功狀態(tài)碼)請(qǐng)求正常處理完畢
3XX:Redirection(重定向狀態(tài)碼)需要附加操作以完成請(qǐng)求
4XX:Client Error(客戶端錯(cuò)誤狀態(tài)碼)服務(wù)器無(wú)法處理請(qǐng)求
5XX:Server Error (服務(wù)器錯(cuò)誤狀態(tài)碼)服務(wù)器處理請(qǐng)求錯(cuò)誤
-
2XX 成功
- 200 OK:客戶端發(fā)來(lái)的請(qǐng)求被服務(wù)器正常處理了。
- 204 No Content:服務(wù)器正常處理,但返回的響應(yīng)報(bào)文實(shí)體中沒(méi)有主體。
-
3XX 重定向
- 301 Moved Permanently:永久性重定向。表示請(qǐng)求的的資源已被分配了新的 URI,以后應(yīng)使用資源現(xiàn)在所指的 URI。
如果已經(jīng)把資源對(duì)應(yīng)的 URI 保存為書(shū)簽,這時(shí)應(yīng)該按照 Location 首部字段提示的 URI 重新保存。 - 302 Found:臨時(shí)性重定向。表示請(qǐng)求的資源已被分配了新的 URI,希望用戶(本次)使用新的 URI 訪問(wèn)。
和301狀態(tài)碼相似,但302只是臨時(shí)的,比如 URI 被保存成書(shū)簽,但不會(huì)像301那樣去更新書(shū)簽。 - 303 See Other:表示由于對(duì)應(yīng)的資源存在著另一個(gè) URI,應(yīng)使用 GET 方法定向獲取請(qǐng)求資源。
- 304 Not Modified:表示客戶端發(fā)送附帶請(qǐng)求時(shí)(If-Match,If-None-Match,If-Modified-Since,If-Unmodified-Since,If-Range,中任一首部),服務(wù)器端允許請(qǐng)求訪問(wèn)資源,但因發(fā)生了未滿足條件的情況,直接返回304。
304狀態(tài)碼返回時(shí),不包含任何響應(yīng)主體部分。
304雖然被劃分在3XX中,其實(shí)和重定向沒(méi)什么關(guān)系。 - 307 Temporary Redirect:臨時(shí)重定向。與302有著相同含義。
- 301 Moved Permanently:永久性重定向。表示請(qǐng)求的的資源已被分配了新的 URI,以后應(yīng)使用資源現(xiàn)在所指的 URI。
-
4XX 客戶端錯(cuò)誤
- 400 Bad Request:表示請(qǐng)求報(bào)文中語(yǔ)法錯(cuò)誤。當(dāng)錯(cuò)誤發(fā)生時(shí),需要求改請(qǐng)求內(nèi)容后再次發(fā)送請(qǐng)求。
- 401 Unanthorized:表示發(fā)送的請(qǐng)求需要通過(guò) HTTP 認(rèn)證。
- 403 Forbidden:表示對(duì)請(qǐng)求資源的訪問(wèn)被服務(wù)器拒絕了。
未獲得系統(tǒng)訪問(wèn)權(quán)限,訪問(wèn)權(quán)限出現(xiàn)問(wèn)題等情況都可能發(fā)生403。 - 404 Not Found:表示服務(wù)器上無(wú)法找到請(qǐng)求的資源。
-
5XX 服務(wù)器錯(cuò)誤
- 500 Internal Server Error:表示服務(wù)器執(zhí)行請(qǐng)求時(shí)發(fā)生錯(cuò)誤。
- 503 Service Unavailable:表示服務(wù)器暫時(shí)超載無(wú)法處理。
第5章 與 HTTP 協(xié)作的 Web 服務(wù)器
HTTP/1.1 協(xié)議允許一臺(tái)服務(wù)器搭建多個(gè) Web 站點(diǎn)。
Web 托管服務(wù)可以用一臺(tái)服務(wù)器為多個(gè)域名運(yùn)行,這是使用了 Virtual Host(虛擬主機(jī))的功能。
客戶端使用 HTTP 協(xié)議訪問(wèn)服務(wù)器時(shí),會(huì)經(jīng)常采用域名的方式。在互聯(lián)網(wǎng)上,域名通過(guò) DNS 服務(wù)映射到 IP 地址??梢?jiàn),當(dāng)請(qǐng)求發(fā)送至服務(wù)器時(shí),已經(jīng)是 IP 地址形式的訪問(wèn)了。
由于用作寄存的服務(wù)器的 IP 地址是相同的,多個(gè)虛擬主機(jī)寄存的不同 Web 站點(diǎn)如何區(qū)分呢? 必須在 Host 首部?jī)?nèi)指定主機(jī)名或域名的 URI。
代理。代理服務(wù)器的基本行為就是接受客戶端的請(qǐng)求后轉(zhuǎn)發(fā)給其它服務(wù)器。代理不改變 URI,直接發(fā)送給前方持有資源的目標(biāo)服務(wù)器(稱為源服務(wù)器)。從源服務(wù)器返回的響應(yīng)經(jīng)過(guò)代理服務(wù)器后再傳給客戶端。
在 HTTP 通信中,可以級(jí)聯(lián)多臺(tái)代理服務(wù)器。請(qǐng)求和響應(yīng)的轉(zhuǎn)發(fā)會(huì)經(jīng)由數(shù)臺(tái)類似鎖鏈一樣鏈接起來(lái)的代理服務(wù)器。每次轉(zhuǎn)發(fā),需要附加 Via 首部字段以標(biāo)示經(jīng)過(guò)的主機(jī)信息。
網(wǎng)關(guān)工作機(jī)制和代理十分相似,網(wǎng)關(guān)能使通信線路上的服務(wù)器提供非 HTTP 協(xié)議服務(wù)。
隧道的目的是確??蛻舳伺c服務(wù)器進(jìn)行安全的通信 。
隧道可以按要求建立一條與服務(wù)器的通信線路,屆時(shí)使用加密手段進(jìn)行通信。
第6章 HTTP 首部
---未完