通過 《HTTP 圖解 》一書來認(rèn)識HTTP(二)

如果和我一樣赖钞,對網(wǎng)絡(luò)毫無概念腰素,并且想去了解HTTP,建議看下HTTP圖解這一本書雪营,很不錯弓千,包含大量的圖畫幫助我們理解HTTP,不會那么枯燥献起,講的很清晰洋访。非常棒的一本書


本篇筆記大部分使用此書原文和原圖,提取了個人覺得比較重要的知識點谴餐,供后期自己回顧學(xué)習(xí)使用


請求報文構(gòu)成

請求報文是由請求方法姻政、請求 URI、協(xié)議版本岂嗓、可選的請求首部字
段和內(nèi)容實體構(gòu)成的扶歪。

請求報文構(gòu)成

請求響應(yīng),響應(yīng)報文

HTTP/1.1 200 OK
  Date: Tue, 10 Jul 2012 06:50:15 GMT
  Content-Length: 362
  Content-Type: text/html
<html>
......

在起始行開頭的 HTTP/1.1 表示服務(wù)器對應(yīng)的 HTTP 版本。
緊挨著的 200 OK 表示請求的處理結(jié)果的狀態(tài)碼(status code)和原 因短語(reason-phrase)摄闸。下一行顯示了創(chuàng)建響應(yīng)的日期時間,是首部字 段(header field)內(nèi)的一個屬性妹萨。
接著以一空行分隔年枕,之后的內(nèi)容稱為資源實體的主體(entity body)。
響應(yīng)報文基本上由協(xié)議版本乎完、狀態(tài)碼(表示請求成功或失敗的數(shù)字 代碼)熏兄、用以解釋狀態(tài)碼的原因短語、可選的響應(yīng)首部字段以及實體主體構(gòu)成树姨。

響應(yīng)報文的構(gòu)成

HTTP 是不保存狀態(tài)的協(xié)議

HTTP 是一種不保存狀態(tài)摩桶,即無狀態(tài)(stateless)協(xié)議。HTTP 協(xié)議 自身不對請求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存帽揪。也就是說在 HTTP 這個 級別硝清,協(xié)議對于發(fā)送過的請求或響應(yīng)都不做持久化處理。

使用 HTTP 協(xié)議转晰,每當(dāng)有新的請求發(fā)送時芦拿,就會有對應(yīng)的新響應(yīng)產(chǎn) 生士飒。協(xié)議本身并不保留之前一切的請求或響應(yīng)報文的信息。這是為了更快地處理大量事務(wù)蔗崎,確保協(xié)議的可伸縮性酵幕,而特意把 HTTP 協(xié)議設(shè)計成 如此簡單的。

隨著 Web 的不斷發(fā)展缓苛,因無狀態(tài)而導(dǎo)致業(yè)務(wù)處理變得棘手 的情況增多了芳撒。比如,用戶登錄到一家購物網(wǎng)站未桥,即使他跳轉(zhuǎn)到該站的 其他頁面后笔刹,也需要能繼續(xù)保持登錄狀態(tài)。針對這個實例钢属,網(wǎng)站為了能 夠掌握是誰送出的請求徘熔,需要保存用戶的狀態(tài)。

HTTP/1.1 雖然是無狀態(tài)協(xié)議淆党,但為了實現(xiàn)期望的保持狀態(tài)功能酷师, 于是引入了 Cookie 技術(shù)。有了 Cookie 再用 HTTP 協(xié)議通信染乌,就可以管 理狀態(tài)了山孔。

告知服務(wù)器意圖的 HTTP 方法

  • GET :獲取資源
    GET 方法用來請求訪問已被 URI 識別的資源。指定的資源經(jīng)服務(wù) 器端解析后返回響應(yīng)內(nèi)容荷憋。也就是說台颠,如果請求的資源是文本,那就保 持原樣返回;如果是像 CGI(Common Gateway Interface勒庄,通用網(wǎng)關(guān)接 口)那樣的程序串前,則返回經(jīng)過執(zhí)行后的輸出結(jié)果。
GET請求響應(yīng)案例
  • POST:傳輸實體主體
    POST 方法用來傳輸實體的主體实蔽。
    雖然用 GET 方法也可以傳輸實體的主體荡碾,但一般不用 GET 方法進(jìn) 行傳輸,而是用 POST 方法局装。雖說 POST 的功能與 GET 很相似坛吁,但 POST 的主要目的并不是獲取響應(yīng)的主體內(nèi)容。
POST請求響應(yīng)案例


  • PUT :傳輸文件
    PUT 方法用來傳輸文件铐尚。就像 FTP 協(xié)議的文件上傳一樣拨脉,要求在 請求報文的主體中包含文件內(nèi)容,然后保存到請求 URI 指定的位置宣增。
    但是玫膀,鑒于 HTTP/1.1 的 PUT 方法自身不帶驗證機(jī)制,任何人都可 以上傳文件 , 存在安全性問題爹脾,因此一般的 Web 網(wǎng)站不使用該方法匆骗。若 配合 Web 應(yīng)用程序的驗證機(jī)制劳景,或架構(gòu)設(shè)計采用 REST(REpresentational State Transfer,表征狀態(tài)轉(zhuǎn)移)標(biāo)準(zhǔn)的同類 Web 網(wǎng)站碉就,就可能會開放使 用 PUT 方法盟广。

PUT請求響應(yīng)案例


  • HEAD:獲得報文首部
    HEAD 方法和 GET 方法一樣,只是不返回報文主體部分瓮钥。用于確認(rèn) URI 的有效性及資源更新的日期時間等筋量。

HEAD請求響應(yīng)案例


  • DELETE:刪除文件
    DELETE 方法用來刪除文件,是與 PUT 相反的方法碉熄。DELETE 方 法按請求 URI 刪除指定的資源桨武。
    但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一樣不帶驗證機(jī) 制锈津,所以一般的 Web 網(wǎng)站也不使用 DELETE 方法呀酸。當(dāng)配合 Web 應(yīng)用程 序的驗證機(jī)制,或遵守 REST 標(biāo)準(zhǔn)時還是有可能會開放使用的琼梆。

DELETE請求響應(yīng)案例


  • OPTIONS:詢問支持的方法
    OPTIONS 方法用來查詢針對請求 URI 指定的資源支持的方法性誉。

OPTIONS請求響應(yīng)案例


  • TRACE:追蹤路徑,TRACE 方法是讓 Web 服務(wù)器端將之前的請求通信環(huán)回給客戶端的 方法茎杂,基本不用错览,容易引發(fā) XST (Cross-Site Tracing,跨站追蹤)攻擊



  • CONNECT:要求用隧道協(xié)議連接代理
    CONNECT 方法要求在與代理服務(wù)器通信時建立隧道煌往,實現(xiàn)用隧道 協(xié)議進(jìn)行 TCP 通信倾哺。主要使用 SSL(Secure Sockets Layer,安全套接 層)和 TLS(Transport Layer Security刽脖,傳輸層安全)協(xié)議把通信內(nèi)容加 密后經(jīng)網(wǎng)絡(luò)隧道傳輸羞海。
    CONNECT 方法的格式如下所示。
CONNECT 代理服務(wù)器名:端口號 HTTP版本
CONNECT請求響應(yīng)案例


HTTP/1.0 和 HTTP/1.1 支持的方法

HTTP/1.0 和 HTTP/1.1 支持的方法


持久連接節(jié)省通信量

HTTP 協(xié)議的初始版本中曲管,每進(jìn)行一次 HTTP 通信就要斷開一次 TCP 連接却邓。


TCP

以早起的通信情況來說,因為都是些容量很小的文本傳輸翘地,所以即 使這樣也沒有多大問題“┠唬可隨著 HTTP 的普及衙耕,文檔中包含大量圖片的 情況多了起來。
比如勺远,使用瀏覽器瀏覽一個包含多張圖片的 HTML 頁面時橙喘,在發(fā) 送請求訪問 HTML 頁面資源的同時,也會請求該 HTML 頁面里包含的 其他資源胶逢。因此厅瞎,每次的請求都會造成無謂的 TCP 連接建立和斷開饰潜, 增加通信量的開銷。

TCP多次連接


持久連接

為解決上述 TCP 連接的問題和簸,HTTP/1.1 和一部分的 HTTP/1.0 想出 了持久連接(HTTP Persistent Connections彭雾,也稱為 HTTP keep-alive 或 HTTP connection reuse)的方法。持久連接的特點是锁保,只要任意一端沒 有明確提出斷開連接薯酝,則保持 TCP 連接狀態(tài)。

持久連接旨在建立 1 次 TCP 連接后進(jìn)行多次請求和響應(yīng)的交互

持久連接的好處在于減少了 TCP 連接的重復(fù)建立和斷開所造成的 額外開銷爽柒,減輕了服務(wù)器端的負(fù)載吴菠。另外,減少開銷的那部分時間浩村,使 HTTP 請求和響應(yīng)能夠更早地結(jié)束做葵,這樣 Web 頁面的顯示速度也就相應(yīng) 提高了。
在 HTTP/1.1 中心墅,所有的連接默認(rèn)都是持久連接酿矢,但在 HTTP/1.0 內(nèi) 并未標(biāo)準(zhǔn)化。雖然有一部分服務(wù)器通過非標(biāo)準(zhǔn)的手段實現(xiàn)了持久連接嗓化,但服務(wù)器端不一定能夠支持持久連接棠涮。毫無疑問,除了服務(wù)器端刺覆,客戶 端也需要支持持久連接严肪。

管線化

持久連接使得多數(shù)請求以管線化(pipelining)方式發(fā)送成為可能。 從前發(fā)送請求后需等待并收到響應(yīng)谦屑,才能發(fā)送下一個請求驳糯。管線化技術(shù) 出現(xiàn)后,不用等待響應(yīng)亦可直接發(fā)送下一個請求氢橙。
這樣就能夠做到同時并行發(fā)送多個請求酝枢,而不需要一個接一個地等 待響應(yīng)了。

不等待響應(yīng)悍手,直接發(fā)送下一個請求

比如帘睦,當(dāng)請求一個包含 10 張圖片的 HTML Web 頁面,與挨個連接 相比坦康,用持久連接可以讓請求更快結(jié)束竣付。而管線化技術(shù)則比持久連接還 要快。請求數(shù)越多滞欠,時間差就越明顯古胆。


使用 Cookie 的狀態(tài)管理

如果讓服務(wù)器管理全部客戶端狀態(tài)則會成為負(fù)擔(dān),于是引 入了 Cookie 技術(shù)筛璧。Cookie 技術(shù)通過在請求和響應(yīng)報文中寫入 Cookie 信 息來控制客戶端的狀態(tài)逸绎。
Cookie 會根據(jù)從服務(wù)器端發(fā)送的響應(yīng)報文內(nèi)的一個叫做 Set-Cookie 的首部字段信息惹恃,通知客戶端保存 Cookie。當(dāng)下次客戶端再往該服務(wù)器 發(fā)送請求時棺牧,客戶端會自動在請求報文中加入 Cookie 值后發(fā)送出去巫糙。
服務(wù)器端發(fā)現(xiàn)客戶端發(fā)送過來的 Cookie 后,會去檢查究竟是從哪 一個客戶端發(fā)來的連接請求陨帆,然后對比服務(wù)器上的記錄曲秉,最后得到之前 的狀態(tài)信息。

Cookie交互場景

請求報文(沒有 Cookie 信息的狀態(tài))

GET /reader/ HTTP/1.1
Host: hackr.jp
* 首部字段內(nèi)沒有 Cookie 的相關(guān)信息

響應(yīng)報文(服務(wù)器端生成 Cookie 信息)

HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed, 10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8

二次請求報文(自動發(fā)送保存著的 Cookie 信息)

GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1342077140226724
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疲牵,一起剝皮案震驚了整個濱河市承二,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纲爸,老刑警劉巖亥鸠,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異识啦,居然都是意外死亡负蚊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門颓哮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來家妆,“玉大人,你說我怎么就攤上這事冕茅∩思” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵姨伤,是天一觀的道長哨坪。 經(jīng)常有香客問我,道長乍楚,這世上最難降的妖魔是什么当编? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮徒溪,結(jié)果婚禮上忿偷,老公的妹妹穿的比我還像新娘。我一直安慰自己臊泌,他們只是感情好鲤桥,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缺虐,像睡著了一般芜壁。 火紅的嫁衣襯著肌膚如雪礁凡。 梳的紋絲不亂的頭發(fā)上高氮,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天慧妄,我揣著相機(jī)與錄音,去河邊找鬼剪芍。 笑死塞淹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罪裹。 我是一名探鬼主播饱普,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼状共!你這毒婦竟也來了套耕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤峡继,失蹤者是張志新(化名)和其女友劉穎冯袍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碾牌,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡康愤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舶吗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡誓琼,死狀恐怖踊赠,靈堂內(nèi)的尸體忽然破棺而出筐带,到底是詐尸還是另有隱情伦籍,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站洛二,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妓雾。R本人自食惡果不足惜械姻,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一楷拳、第九天 我趴在偏房一處隱蔽的房頂上張望欢揖。 院中可真熱鬧奋蔚,春花似錦旺拉、人聲如沸蛾狗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔼夜。三九已至求冷,卻和暖如春匠题,著一層夾襖步出監(jiān)牢的瞬間韭山,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工秃诵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彪杉。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像渴丸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子土童,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容