HTTP協(xié)議簡介
1. 使用谷歌/火狐瀏覽器分析
在Web應用中,服務器把網(wǎng)頁傳給瀏覽器,實際上就是把網(wǎng)頁的HTML代碼發(fā)送給瀏覽器,讓瀏覽器顯示出來。而瀏覽器和服務器之間的傳輸協(xié)議是HTTP,所以:
HTML是一種用來定義網(wǎng)頁的文本,會HTML,就可以編寫網(wǎng)頁;
HTTP是在網(wǎng)絡上傳輸HTML的協(xié)議,用于瀏覽器和服務器的通信。
Chrome瀏覽器提供了一套完整地調(diào)試工具,非常適合Web開發(fā)。
安裝好Chrome瀏覽器后,打開Chrome,在菜單中選擇“視圖”,“開發(fā)者”,“開發(fā)者工具”,就可以顯示開發(fā)者工具:
說明
Elements顯示網(wǎng)頁的結(jié)構(gòu)
Network顯示瀏覽器和服務器的通信
我們點Network,確保第一個小紅燈亮著,Chrome就會記錄所有瀏覽器和服務器之間的通信:
2. http協(xié)議的分析
當我們在地址欄輸入www.sina.com時,瀏覽器將顯示新浪的首頁。在這個過程中,瀏覽器都干了哪些事情呢?通過Network的記錄,我們就可以知道。在Network中,找到www.sina.com那條記錄,點擊,右側(cè)將顯示Request Headers,點擊右側(cè)的view source,我們就可以看到瀏覽器發(fā)給新浪服務器的請求:
2.1 瀏覽器請求
說明
最主要的頭兩行分析如下,第一行:
? ? GET / HTTP/1.1
GET表示一個讀取請求,將從服務器獲得網(wǎng)頁數(shù)據(jù),/表示URL的路徑,URL總是以/開頭,/就表示首頁,最后的HTTP/1.1指示采用的HTTP協(xié)議版本是1.1。目前HTTP協(xié)議的版本就是1.1,但是大部分服務器也支持1.0版本,主要區(qū)別在于1.1版本允許多個HTTP請求復用一個TCP連接,以加快傳輸速度。
從第二行開始,每一行都類似于Xxx: abcdefg:
? ? Host: www.sina.com
表示請求的域名是www.sina.com。如果一臺服務器有多個網(wǎng)站,服務器就需要通過Host來區(qū)分瀏覽器請求的是哪個網(wǎng)站。
2.2 服務器響應
繼續(xù)往下找到Response Headers,點擊view source,顯示服務器返回的原始響應數(shù)據(jù):
HTTP響應分為Header和Body兩部分(Body是可選項),我們在Network中看到的Header最重要的幾行如下:
? ? HTTP/1.1 200 OK
200表示一個成功的響應,后面的OK是說明。
如果返回的不是200,那么往往有其他的功能,例如
失敗的響應有404 Not Found:網(wǎng)頁不存在
500 Internal Server Error:服務器內(nèi)部出錯
...等等...
? ? Content-Type: text/html
Content-Type指示響應的內(nèi)容,這里是text/html表示HTML網(wǎng)頁。
請注意,瀏覽器就是依靠Content-Type來判斷響應的內(nèi)容是網(wǎng)頁還是圖片,是視頻還是音樂。瀏覽器并不靠URL來判斷響應的內(nèi)容,所以,即使URL是http://www.baidu.com/meimei.jpg,它也不一定就是圖片。
HTTP響應的Body就是HTML源碼,我們在菜單欄選擇“視圖”,“開發(fā)者”,“查看網(wǎng)頁源碼”就可以在瀏覽器中直接查看HTML源碼:
瀏覽器解析過程
當瀏覽器讀取到新浪首頁的HTML源碼后,它會解析HTML,顯示頁面,然后,根據(jù)HTML里面的各種鏈接,再發(fā)送HTTP請求給新浪服務器,拿到相應的圖片、視頻、Flash、JavaScript腳本、CSS等各種資源,最終顯示出一個完整的頁面。所以我們在Network下面能看到很多額外的HTTP請求。
3. 總結(jié)
3.1 HTTP請求
跟蹤了新浪的首頁,我們來總結(jié)一下HTTP請求的流程:
3.1.1 步驟1:瀏覽器首先向服務器發(fā)送HTTP請求,請求包括:
方法:GET還是POST,GET僅請求資源,POST會附帶用戶數(shù)據(jù);
路徑:/full/url/path;
域名:由Host頭指定:Host: www.sina.com
以及其他相關的Header;
如果是POST,那么請求還包括一個Body,包含用戶數(shù)據(jù)
3.1.1 步驟2:服務器向瀏覽器返回HTTP響應,響應包括:
響應代碼:200表示成功,3xx表示重定向,4xx表示客戶端發(fā)送的請求有錯誤,5xx表示服務器端處理時發(fā)生了錯誤;
響應類型:由Content-Type指定;
以及其他相關的Header;
通常服務器的HTTP響應會攜帶內(nèi)容,也就是有一個Body,包含響應的內(nèi)容,網(wǎng)頁的HTML源碼就在Body中。
3.1.1 步驟3:如果瀏覽器還需要繼續(xù)向服務器請求其他資源,比如圖片,就再次發(fā)出HTTP請求,重復步驟1、2。
Web采用的HTTP協(xié)議采用了非常簡單的請求-響應模式,從而大大簡化了開發(fā)。當我們編寫一個頁面時,我們只需要在HTTP請求中把HTML發(fā)送出去,不需要考慮如何附帶圖片、視頻等,瀏覽器如果需要請求圖片和視頻,它會發(fā)送另一個HTTP請求,因此,一個HTTP請求只處理一個資源(此時就可以理解為TCP協(xié)議中的短連接,每個鏈接只獲取一個資源,如需要多個就需要建立多個鏈接)
HTTP協(xié)議同時具備極強的擴展性,雖然瀏覽器請求的是http://www.sina.com的首頁,但是新浪在HTML中可以鏈入其他服務器的資源,比如<img src="http://i1.sinaimg.cn/home/2013/1008/U8455P30DT20131008135420.png">,從而將請求壓力分散到各個服務器上,并且,一個站點可以鏈接到其他站點,無數(shù)個站點互相鏈接起來,就形成了World Wide Web,簡稱WWW。
3.2 HTTP格式
每個HTTP請求和響應都遵循相同的格式,一個HTTP包含Header和Body兩部分,其中Body是可選的。
HTTP協(xié)議是一種文本協(xié)議,所以,它的格式也非常簡單。
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...
當遇到連續(xù)兩個\r\n時,Header部分結(jié)束,后面的數(shù)據(jù)全部是Body。
3.2.3 HTTP響應的格式:
? ? 200 OK
? ? Header1: Value1
? ? Header2: Value2
? ? Header3: Value3
? ? body data goes here...
HTTP響應如果包含body,也是通過\r\n\r\n來分隔的。
請再次注意,Body的數(shù)據(jù)類型由Content-Type頭來確定,如果是網(wǎng)頁,Body就是文本,如果是圖片,Body就是圖片的二進制數(shù)據(jù)。
當存在Content-Encoding時,Body數(shù)據(jù)是被壓縮的,最常見的壓縮方式是gzip,所以,看到Content-Encoding: gzip時,需要將Body數(shù)據(jù)先解壓縮,才能得到真正的數(shù)據(jù)。壓縮的目的在于減少Body的大小,加快網(wǎng)絡傳輸。