天天看點

166 python網絡程式設計 - HTTP協定簡介

1. 使用谷歌/火狐浏覽器分析

在Web應用中,伺服器把網頁傳給浏覽器,實際上就是把網頁的HTML代碼發送給浏覽器,讓浏覽器顯示出來。而浏覽器和伺服器之間的傳輸協定是HTTP,是以:

  • HTML是一種用來定義網頁的文本,會HTML,就可以編寫網頁;
  • HTTP是在網絡上傳輸HTML的協定,用于浏覽器和伺服器的通信。

Chrome浏覽器提供了一套完整地調試工具,非常适合Web開發。

安裝好Chrome浏覽器後,打開Chrome,在菜單中選擇“視圖”,“開發者”,“開發者工具”,就可以顯示開發者工具:

166 python網絡程式設計 - HTTP協定簡介

說明:

  • Elements顯示網頁的結構
  • Network顯示浏覽器和伺服器的通信

我們點Network,確定第一個小紅燈亮着,Chrome就會記錄所有浏覽器和伺服器之間的通信:

2. http協定的分析

當我們在位址欄輸入www.sina.com時,浏覽器将顯示新浪的首頁。在這個過程中,浏覽器都幹了哪些事情呢?通過Network的記錄,我們就可以知道。在Network中,找到www.sina.com那條記錄,點選,右側将顯示Request Headers,點選右側的view source,我們就可以看到浏覽器發給新浪伺服器的請求:

2.1 浏覽器請求

166 python網絡程式設計 - HTTP協定簡介
166 python網絡程式設計 - HTTP協定簡介

說明

最主要的頭兩行分析如下,第一行:

GET / HTTP/1.1
      

GET表示一個讀取請求,将從伺服器獲得網頁資料,/表示URL的路徑,URL總是以/開頭,/就表示首頁,最後的HTTP/1.1訓示采用的HTTP協定版本是1.1。目前HTTP協定的版本就是1.1,但是大部分伺服器也支援1.0版本,主要差別在于1.1版本允許多個HTTP請求複用一個TCP連接配接,以加快傳輸速度。

從第二行開始,每一行都類似于Xxx: abcdefg:

Host: www.sina.com
      

表示請求的域名是www.sina.com。如果一台伺服器有多個網站,伺服器就需要通過Host來區分浏覽器請求的是哪個網站。

2.2 伺服器響應

繼續往下找到Response Headers,點選view source,顯示伺服器傳回的原始響應資料:

166 python網絡程式設計 - HTTP協定簡介

HTTP響應分為Header和Body兩部分(Body是可選項),我們在Network中看到的Header最重要的幾行如下:

HTTP/1.1 200 OK
      

200表示一個成功的響應,後面的OK是說明。

如果傳回的不是200,那麼往往有其他的功能,例如

  • 失敗的響應有404 Not Found:網頁不存在
  • 500 Internal Server Error:伺服器内部出錯
  • …等等…
Content-Type: text/html
      

Content-Type訓示響應的内容,這裡是text/html表示HTML網頁。

請注意,浏覽器就是依靠Content-Type來判斷響應的内容是網頁還是圖檔,是視訊還是音樂。浏覽器并不靠URL來判斷響應的内容,是以,即使URL是http://www.baidu.com/meimei.jpg,它也不一定就是圖檔。

HTTP響應的Body就是HTML源碼,我們在菜單欄選擇“視圖”,“開發者”,“檢視網頁源碼”就可以在浏覽器中直接檢視HTML源碼:

166 python網絡程式設計 - HTTP協定簡介

浏覽器解析過程

當浏覽器讀取到新浪首頁的HTML源碼後,它會解析HTML,顯示頁面,然後,根據HTML裡面的各種連結,再發送HTTP請求給新浪伺服器,拿到相應的圖檔、視訊、Flash、JavaScript腳本、CSS等各種資源,最終顯示出一個完整的頁面。是以我們在Network下面能看到很多額外的HTTP請求。

166 python網絡程式設計 - HTTP協定簡介

3. 總結

3.1 HTTP請求

跟蹤了新浪的首頁,我們來總結一下HTTP請求的流程:

3.1.1 步驟1:浏覽器首先向伺服器發送HTTP請求,請求包括:

方法:GET還是POST,GET僅請求資源,POST會附帶使用者資料;

路徑:/full/url/path;

域名:由Host頭指定:Host: www.sina.com

以及其他相關的Header;

如果是POST,那麼請求還包括一個Body,包含使用者資料

3.1.1 步驟2:伺服器向浏覽器傳回HTTP響應,響應包括:

響應代碼:200表示成功,3xx表示重定向,4xx表示用戶端發送的請求有錯誤,5xx表示伺服器端處理時發生了錯誤;

響應類型:由Content-Type指定;

通常伺服器的HTTP響應會攜帶内容,也就是有一個Body,包含響應的内容,網頁的HTML源碼就在Body中。

3.1.1 步驟3:如果浏覽器還需要繼續向伺服器請求其他資源,比如圖檔,就再次發出HTTP請求,重複步驟1、2。
Web采用的HTTP協定采用了非常簡單的請求-響應模式,進而大大簡化了開發。當我們編寫一個頁面時,我們隻需要在HTTP請求中把HTML發送出去,不需要考慮如何附帶圖檔、視訊等,浏覽器如果需要請求圖檔和視訊,它會發送另一個HTTP請求,是以,一個HTTP請求隻處理一個資源(此時就可以了解為TCP協定中的短連接配接,每個連結隻擷取一個資源,如需要多個就需要建立多個連結)

HTTP協定同時具備極強的擴充性,雖然浏覽器請求的是http://www.sina.com的首頁,但是新浪在HTML中可以鍊入其他伺服器的資源,比如

src="http://i1.sinaimg.cn/home/2013/1008/U8455P30DT20131008135420.png">
      

伺服器上,并且,一個站點可以連結到其他站點,無數個站點互相連結起來,就形成了World Wide Web,簡稱WWW。

166 python網絡程式設計 - HTTP協定簡介

3.2 HTTP格式

每個HTTP請求和響應都遵循相同的格式,一個HTTP包含Header和Body兩部分,其中Body是可選的。

HTTP協定是一種文本協定,是以,它的格式也非常簡單。

3.2.1 HTTP GET請求的格式:
GET /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3
      

每個Header一行一個,換行符是\r\n。

3.2.2 HTTP POST請求的格式:
POST /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body data goes here...
      

當遇到連續兩個\r\n時,Header部分結束,後面的資料全部是Body。

3.2.3 HTTP響應的格式:
200 OK
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body data goes here...
      

HTTP響應如果包含body,也是通過\r\n\r\n來分隔的。

上一篇: PHP性能優化
下一篇: 布隆過濾器

繼續閱讀