《圖解 HTTP》 讀書筆記
HTTP 在哪里
網(wǎng)絡(luò)設(shè)備之間鱼填,包括計算機與網(wǎng)絡(luò)設(shè)備之間要互相通信,那么雙方必須要基于相同的協(xié)議。如何探測到通信目標(biāo)稽寒,如何發(fā)起通信,怎么傳遞通信信息确丢,怎么樣結(jié)束通信等這些規(guī)則要事先約定搂赋,這些規(guī)則稱為協(xié)議(protocol)。
我們通常使用的網(wǎng)絡(luò)是在 TCP/IP 協(xié)議族的基礎(chǔ)上運作的祷杈,而 HTTP 屬于它的一個子集胡桃。
TCP/IP 分層
TCP/IP 協(xié)議族按層次劃分可以分為 4 個層次,分別是應(yīng)用層龟糕、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層坤塞。
- 應(yīng)用層決定了向用戶提供應(yīng)用服務(wù)時通信的活動。TCP/IP 協(xié)議族里面有不少應(yīng)用服務(wù)挣轨,比如 FTP (File Transfer Protocol,文件傳輸協(xié)議)和 DNS (Domain Name System,域名服務(wù)系統(tǒng)),HTTP 協(xié)議也是在應(yīng)用層封断。
- 傳輸層位于應(yīng)用層之下剪况,提供處于網(wǎng)絡(luò)連接中的兩臺網(wǎng)絡(luò)設(shè)備之間的數(shù)據(jù)傳輸该贾。傳輸層有 2 個常見的協(xié)議寇荧, TCP (Transmission Control Protocol,傳輸控制協(xié)議)和 UDP (User Data Protocol,用戶數(shù)據(jù)報協(xié)議)。
- 網(wǎng)絡(luò)層用來處理網(wǎng)絡(luò)上流動的數(shù)據(jù)包耙替。數(shù)據(jù)包是網(wǎng)絡(luò)傳輸?shù)淖钚?shù)據(jù)單位除抛,該層規(guī)定了數(shù)據(jù)包通過怎么樣的傳輸路線到達(dá)對方翩迈。通常情況下 2 臺計算機之間會有數(shù)量不定的各類網(wǎng)絡(luò)設(shè)備或者計算機,網(wǎng)絡(luò)層的作用就是在眾多傳輸路徑中選擇一條合適的傳輸線路匈仗。
- 鏈路層用來處理了解網(wǎng)絡(luò)的硬件部分何鸡。包括硬件的設(shè)備驅(qū)動,網(wǎng)卡骡男,光纖及連接器等一切傳輸媒介龙亲。
把 TCP/IP 分層是有好處的鳄炉,各層之間的接口部分規(guī)劃好之后簸呈,每個層次的內(nèi)部設(shè)計可以自由變動而無需考慮上層和下層的任務(wù)轿腺。處理應(yīng)用層上的應(yīng)用只需考慮應(yīng)用層面的問題展父,而無需考慮下層的 TCP 協(xié)議或者 UDP 協(xié)議栖茉,也無需考慮數(shù)據(jù)包是如何到達(dá)對方篮绿,更無需考慮網(wǎng)絡(luò)的硬件部分構(gòu)成。
TCP/IP 通信傳輸流
利用 TCP/IP 協(xié)議族進行通信時吕漂,會通過分層結(jié)構(gòu)與對方通信亲配。對于發(fā)送端從應(yīng)用層向下走到網(wǎng)絡(luò)層,對于接收端則從網(wǎng)絡(luò)層向上走到應(yīng)用層惶凝。
以應(yīng)用層的 HTTP 協(xié)議為例吼虎,客戶端在應(yīng)用層首先發(fā)出一個查看 www.baidu.com Web 頁面的 HTTP 請求。接著到了傳輸層苍鲜,TCP 協(xié)議從應(yīng)用層處收到的HTTP報文進行分割思灰,并在各個分割的報文加上傳輸層相關(guān)的 TCP 首部后轉(zhuǎn)發(fā)給網(wǎng)絡(luò)層。在網(wǎng)絡(luò)層混滔,給報文加上網(wǎng)絡(luò)層相關(guān)的 IP 首部后轉(zhuǎn)發(fā)給鏈路層洒疚,最后鏈路層給報文添加上以太網(wǎng)首部歹颓,并發(fā)送數(shù)據(jù)包。流程如上圖左邊部分所示油湖。
接收端的服務(wù)器在鏈路層接收到數(shù)據(jù)之后巍扛,數(shù)據(jù)按序往上層發(fā)送,直到應(yīng)用層乏德。當(dāng)接收端的應(yīng)用層收到數(shù)據(jù)的時候撤奸,服務(wù)器才算真正接收到客戶端發(fā)送的 HTTP 請求。流程如上圖右邊部分所示喊括。
發(fā)送端在層與層之間傳輸數(shù)據(jù)時胧瓜,每經(jīng)過一層都會被加上屬于該層的首部信息。接收端在層與層之間傳輸數(shù)據(jù)時郑什,每經(jīng)過一層都會把該層對應(yīng)的首部去掉贷痪。
IP 協(xié)議
- IP 協(xié)議。IP (Internet Protocol)協(xié)議位于網(wǎng)絡(luò)層蹦误,IP 協(xié)議的作用是把各種數(shù)據(jù)包傳送給對方劫拢。為了保證數(shù)據(jù)包的正常傳輸,IP 協(xié)議規(guī)定了 2 個重要的條件强胰,一個是 IP 地址舱沧,一個是 MAC 地址(Media Access Control Address)。IP 地址指明了網(wǎng)絡(luò)節(jié)點被分配到的地址偶洋,MAC 地址則是網(wǎng)卡的固定地址熟吏。IP 地址可以變換,MAC 地址則是燒錄在硬件里面玄窝,通常情況下無法更改牵寺。
- ARP 協(xié)議。網(wǎng)絡(luò)上的通信依賴于設(shè)備的 MAC 地址恩脂,網(wǎng)絡(luò)上通信的雙方不可能在通信開始前都彼此了解雙方的 MAC 地址帽氓,但是通信的發(fā)送端肯定是了解接收方的 IP 地址。為了解決獲取通信接收方的MAC 地址這個問題俩块,網(wǎng)絡(luò)設(shè)計人員設(shè)計了一個 ARP 協(xié)議(Address Resolution Protocol)黎休,這個 ARP 協(xié)議可以根據(jù)通信方的 IP 地址查出對應(yīng)的 MAC 地址。
- routing 機制玉凯。網(wǎng)絡(luò)傳輸線路千變?nèi)f化势腮,沒有人能夠全面掌握網(wǎng)絡(luò)中的實時傳輸狀況。為了能夠讓參與傳輸過程的計算機漫仆,路由器等網(wǎng)絡(luò)設(shè)備粗略的了解傳輸線路捎拯。設(shè)計人員設(shè)計了一個叫做路由(routing)的機制。就像快遞公司的送貨過程盲厌,寄快遞的人只要將自己的貨物送到快遞集散中心署照,就可以知道快遞公司是否肯收件發(fā)貨座菠,該快遞集散中心檢查貨物的地址,明確下一站該送往哪個區(qū)域的集散中心藤树。接著,下一站的集散中心自己會判斷貨物的下一個線路拓萌。
如上圖所示岁钓。發(fā)送端想往 IP 地址為 192.0.43.10 的地方發(fā)送數(shù)據(jù)包,步驟如下微王。
- 使用 ARP 協(xié)議解析出該 IP 地址對應(yīng)的 MAC 地址屡限。
- 將數(shù)據(jù)包發(fā)送給路由器,路由器根據(jù) routing 機制轉(zhuǎn)發(fā)數(shù)據(jù)包
- IP 地址為 192.0.43.10 的設(shè)備收到數(shù)據(jù)包
TCP 協(xié)議
按 TCP/IP 分層結(jié)構(gòu)來看炕倘,TCP 協(xié)議位于傳輸層钧大。設(shè)計人員設(shè)計 TCP 協(xié)議是為了在不可靠網(wǎng)絡(luò)中,提供可靠字節(jié)流傳輸服務(wù)罩旋。TCP 協(xié)議為了更容易傳輸大數(shù)據(jù)將大數(shù)據(jù)分割成以報文段(segment)為單位的數(shù)據(jù)包進行管理啊央,而且TCP 在數(shù)據(jù)包發(fā)送出去之后,會向?qū)Ψ酱_認(rèn)是否成功送達(dá)涨醋。為了確保數(shù)據(jù)能夠到達(dá)目標(biāo)瓜饥, TCP 協(xié)議設(shè)計了三次握手策略(three-way handshaking),除了三次握手之外浴骂,TCP 協(xié)議還有其他的各種手段來保證通行的可靠性乓土。
- 發(fā)送端首先發(fā)送一個帶 SYN 標(biāo)志的數(shù)據(jù)包給對方
- 接收端收到后,回傳一個帶有 SYN/ACK 的數(shù)據(jù)包表示數(shù)據(jù)包確認(rèn)收到溯警。
- 發(fā)送端收到 SYN/ACK 之后趣苏,再發(fā)送一個帶 ACK 標(biāo)志的數(shù)據(jù)包。
- 握手結(jié)束
DNS 服務(wù)
用戶通常使用域名來訪問一些提供服務(wù)的服務(wù)器梯轻,而不是直接通過 IP 地址食磕。比如,我們要訪問百度的主頁喳挑,通常情況下我們會使用域名而不是 IP 來訪問芬为。設(shè)計人員為這個使用情景設(shè)計了一個 DNS 服務(wù)(Domain Name Server),DNS 提供了域名到 IP 地址之間的解析服務(wù)。
- 發(fā)送端想訪問 www.hackr.jp 這個網(wǎng)頁
- 發(fā)送端使用 DNS 來查詢 www.hackr.jp 的 IP 地址
- 發(fā)送端取得 IP 地址之后蟀悦,發(fā)起請求
HTTP 請求的基本流程
HTTP 與以上提到的幾個協(xié)議的關(guān)系可以用下面這張圖來概括媚朦。
- 客戶端想瀏覽 http://hackr.jp/xss/ 這個 web 頁面
- 客戶端使用 DNS 服務(wù)獲取域名 hackr.jp 對應(yīng)的 IP 地址
- 客戶端利用應(yīng)用層 HTTP 協(xié)議發(fā)起 HTTP 請求
- 客戶端利用傳輸層 TCP 協(xié)議將 HTTP 請求報文分割成報文段,添加 TCP 頭部信息
- 網(wǎng)絡(luò)層利用 IP 協(xié)議和 Routing 機制傳送數(shù)據(jù)包
- 服務(wù)端傳輸層的 TCP 協(xié)議重組請求報文
- 服務(wù)端應(yīng)用層的 HTTP 協(xié)議處理客戶端請求
- 服務(wù)端將請求結(jié)果返回