(2018-04-15.Python從Zero到One)四、web服務(wù)器案例__4.1.1HTTP協(xié)議簡(jiǎn)介

上一篇文章為:→3.4.10gevent版-TCP服務(wù)器

HTTP協(xié)議簡(jiǎn)介

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

在Web應(yīng)用中,服務(wù)器把網(wǎng)頁(yè)傳給瀏覽器,實(shí)際上就是把網(wǎng)頁(yè)的HTML代碼發(fā)送給瀏覽器,讓瀏覽器顯示出來(lái)。而瀏覽器和服務(wù)器之間的傳輸協(xié)議是HTTP,所以:

  • HTML是一種用來(lái)定義網(wǎng)頁(yè)的文本,會(huì)HTML,就可以編寫網(wǎng)頁(yè);

  • HTTP是在網(wǎng)絡(luò)上傳輸HTML的協(xié)議,用于瀏覽器和服務(wù)器的通信。

Chrome瀏覽器提供了一套完整地調(diào)試工具,非常適合Web開發(fā)。

安裝好Chrome瀏覽器后,打開Chrome,在菜單中選擇“視圖”,“開發(fā)者”,“開發(fā)者工具”,就可以顯示開發(fā)者工具:

day20_web服務(wù)器anli-01.png

說(shuō)明

  • Elements顯示網(wǎng)頁(yè)的結(jié)構(gòu)
  • Network顯示瀏覽器和服務(wù)器的通信

我們點(diǎn)Network,確保第一個(gè)小紅燈亮著,Chrome就會(huì)記錄所有瀏覽器和服務(wù)器之間的通信:

day20_web服務(wù)器anli-02.png

2. http協(xié)議的分析

當(dāng)我們?cè)诘刂窓谳斎?a target="_blank" rel="nofollow">www.sina.com時(shí),瀏覽器將顯示新浪的首頁(yè)。在這個(gè)過(guò)程中,瀏覽器都干了哪些事情呢?通過(guò)Network的記錄,我們就可以知道。在Network中,找到www.sina.com那條記錄,點(diǎn)擊,右側(cè)將顯示Request Headers,點(diǎn)擊右側(cè)的view source,我們就可以看到瀏覽器發(fā)給新浪服務(wù)器的請(qǐng)求:

2.1 瀏覽器請(qǐng)求

day20_web服務(wù)器anli-03.png
day20_web服務(wù)器anli-04.png

說(shuō)明

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

    GET / HTTP/1.1

GET表示一個(gè)讀取請(qǐng)求,將從服務(wù)器獲得網(wǎng)頁(yè)數(shù)據(jù),/表示URL的路徑,URL總是以/開頭,/就表示首頁(yè),最后的HTTP/1.1指示采用的HTTP協(xié)議版本是1.1。目前HTTP協(xié)議的版本就是1.1,但是大部分服務(wù)器也支持1.0版本,主要區(qū)別在于1.1版本允許多個(gè)HTTP請(qǐng)求復(fù)用一個(gè)TCP連接,以加快傳輸速度。

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

    Host: www.sina.com

表示請(qǐng)求的域名是www.sina.com。如果一臺(tái)服務(wù)器有多個(gè)網(wǎng)站,服務(wù)器就需要通過(guò)Host來(lái)區(qū)分瀏覽器請(qǐng)求的是哪個(gè)網(wǎng)站。

2.2 服務(wù)器響應(yīng)

繼續(xù)往下找到Response Headers,點(diǎn)擊view source,顯示服務(wù)器返回的原始響應(yīng)數(shù)據(jù):

day20_web服務(wù)器anli-05.png

HTTP響應(yīng)分為Header和Body兩部分(Body是可選項(xiàng)),我們?cè)贜etwork中看到的Header最重要的幾行如下:

    HTTP/1.1 200 OK

200表示一個(gè)成功的響應(yīng),后面的OK是說(shuō)明。

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

  • 失敗的響應(yīng)有404 Not Found:網(wǎng)頁(yè)不存在
  • 500 Internal Server Error:服務(wù)器內(nèi)部出錯(cuò)
  • ...等等...
    Content-Type: text/html

Content-Type指示響應(yīng)的內(nèi)容,這里是text/html表示HTML網(wǎng)頁(yè)。

請(qǐng)注意,瀏覽器就是依靠Content-Type來(lái)判斷響應(yīng)的內(nèi)容是網(wǎng)頁(yè)還是圖片,是視頻還是音樂(lè)。瀏覽器并不靠URL來(lái)判斷響應(yīng)的內(nèi)容,所以,即使URL是http://www.baidu.com/meimei.jpg,它也不一定就是圖片。

HTTP響應(yīng)的Body就是HTML源碼,我們?cè)诓藛螜谶x擇“視圖”,“開發(fā)者”,“查看網(wǎng)頁(yè)源碼”就可以在瀏覽器中直接查看HTML源碼:

day20_web服務(wù)器anli-06.png

瀏覽器解析過(guò)程

當(dāng)瀏覽器讀取到新浪首頁(yè)的HTML源碼后,它會(huì)解析HTML,顯示頁(yè)面,然后,根據(jù)HTML里面的各種鏈接,再發(fā)送HTTP請(qǐng)求給新浪服務(wù)器,拿到相應(yīng)的圖片、視頻、Flash、JavaScript腳本、CSS等各種資源,最終顯示出一個(gè)完整的頁(yè)面。所以我們?cè)贜etwork下面能看到很多額外的HTTP請(qǐng)求。

day20_web服務(wù)器anli-07.png

3. 總結(jié)

3.1 HTTP請(qǐng)求

跟蹤了新浪的首頁(yè),我們來(lái)總結(jié)一下HTTP請(qǐng)求的流程:

3.1.1 步驟1:瀏覽器首先向服務(wù)器發(fā)送HTTP請(qǐng)求,請(qǐng)求包括:

方法:GET還是POST,GET僅請(qǐng)求資源,POST會(huì)附帶用戶數(shù)據(jù);

路徑:/full/url/path;

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

以及其他相關(guān)的Header;

如果是POST,那么請(qǐng)求還包括一個(gè)Body,包含用戶數(shù)據(jù)

3.1.1 步驟2:服務(wù)器向?yàn)g覽器返回HTTP響應(yīng),響應(yīng)包括:

響應(yīng)代碼:200表示成功,3xx表示重定向,4xx表示客戶端發(fā)送的請(qǐng)求有錯(cuò)誤,5xx表示服務(wù)器端處理時(shí)發(fā)生了錯(cuò)誤;

響應(yīng)類型:由Content-Type指定;

以及其他相關(guān)的Header;

通常服務(wù)器的HTTP響應(yīng)會(huì)攜帶內(nèi)容,也就是有一個(gè)Body,包含響應(yīng)的內(nèi)容,網(wǎng)頁(yè)的HTML源碼就在Body中。

3.1.1 步驟3:如果瀏覽器還需要繼續(xù)向服務(wù)器請(qǐng)求其他資源,比如圖片,就再次發(fā)出HTTP請(qǐng)求,重復(fù)步驟1、2。

Web采用的HTTP協(xié)議采用了非常簡(jiǎn)單的請(qǐng)求-響應(yīng)模式,從而大大簡(jiǎn)化了開發(fā)。當(dāng)我們編寫一個(gè)頁(yè)面時(shí),我們只需要在HTTP請(qǐng)求中把HTML發(fā)送出去,不需要考慮如何附帶圖片、視頻等,瀏覽器如果需要請(qǐng)求圖片和視頻,它會(huì)發(fā)送另一個(gè)HTTP請(qǐng)求,因此,一個(gè)HTTP請(qǐng)求只處理一個(gè)資源(此時(shí)就可以理解為TCP協(xié)議中的短連接,每個(gè)鏈接只獲取一個(gè)資源,如需要多個(gè)就需要建立多個(gè)鏈接)

HTTP協(xié)議同時(shí)具備極強(qiáng)的擴(kuò)展性,雖然瀏覽器請(qǐng)求的是http://www.sina.com的首頁(yè),但是新浪在HTML中可以鏈入其他服務(wù)器的資源,比如<img src="http://i1.sinaimg.cn/home/2013/1008/U8455P30DT20131008135420.png">,從而將請(qǐng)求壓力分散到各個(gè)服務(wù)器上,并且,一個(gè)站點(diǎn)可以鏈接到其他站點(diǎn),無(wú)數(shù)個(gè)站點(diǎn)互相鏈接起來(lái),就形成了World Wide Web,簡(jiǎn)稱WWW。

day20_web服務(wù)器anli-08.png

3.2 HTTP格式

每個(gè)HTTP請(qǐng)求和響應(yīng)都遵循相同的格式,一個(gè)HTTP包含Header和Body兩部分,其中Body是可選的。

HTTP協(xié)議是一種文本協(xié)議,所以,它的格式也非常簡(jiǎn)單。

3.2.1 HTTP GET請(qǐng)求的格式:

    GET /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3

每個(gè)Header一行一個(gè),換行符是\r\n。

3.2.2 HTTP POST請(qǐng)求的格式:

    POST /path HTTP/1.1
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body data goes here...

當(dāng)遇到連續(xù)兩個(gè)\r\n時(shí),Header部分結(jié)束,后面的數(shù)據(jù)全部是Body。

3.2.3 HTTP響應(yīng)的格式:

    200 OK
    Header1: Value1
    Header2: Value2
    Header3: Value3

    body data goes here...

HTTP響應(yīng)如果包含body,也是通過(guò)\r\n\r\n來(lái)分隔的。

請(qǐng)?jiān)俅巫⒁?,Body的數(shù)據(jù)類型由Content-Type頭來(lái)確定,如果是網(wǎng)頁(yè),Body就是文本,如果是圖片,Body就是圖片的二進(jìn)制數(shù)據(jù)。

當(dāng)存在Content-Encoding時(shí),Body數(shù)據(jù)是被壓縮的,最常見的壓縮方式是gzip,所以,看到Content-Encoding: gzip時(shí),需要將Body數(shù)據(jù)先解壓縮,才能得到真正的數(shù)據(jù)。壓縮的目的在于減少Body的大小,加快網(wǎng)絡(luò)傳輸。


下一篇文章為:→4.1.2Web靜態(tài)服務(wù)器-1-顯示固定的頁(yè)面
最后編輯于
?著作權(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)容

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