HTTP協議

一、HTTP協議簡述

     HTTP是一個客戶端和服務器端請求和應答的標準(TCP)。客戶端是終端用戶,服務器端是網站。通過使用Web瀏覽器、網絡爬蟲或者其它的工具,客戶端 發起一個到服務器上指定端口(默認端口爲80)的HTTP請求。(我們稱這個客戶端)叫用戶代理(user agent)。應答的服務器上存儲着(一些)資源,比如HTML文件和圖像。(我們稱)這個應答服務器爲源服務器(origin server)。在用戶代理和源服務器中間可能存在多箇中間層,比如代理,網關,或者隧道(tunnels)。儘管TCP/IP協議是互聯網上最流行的應 用,HTTP協議並沒有規定必須使用它和(基於)它支持的層。 事實上,HTTP可以在任何其他互聯網協議上,或者在其他網絡上實現。HTTP只假定(其下層協議提供)可靠的傳輸,任何能夠提供這種保證的協議都可以被 其使用。


二、HTTP協議通信過程

當我們在瀏覽器的地址欄輸入“www.baidu.com”然後按回車,這之後發生了什麼事,我們直接看到的是打開了對應的網頁,那麼內部客戶端和服務端 是如何通信的呢?

1、URL自動解析

HTTP URL包含了用於查找某個資源的足夠信息,基本格式如下:HTTP://host[“:”port] [abs_path],其中HTTP表示桶蓋HTTP協議來定位網絡資源;host表示合法的主機域名或IP地址,port指定一個端口號,缺省 80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那麼當它作爲請求URI時,必須以“/”的形式給出,通常這個工作 瀏覽器自動幫我們完成。

例如:輸入www.163.com;瀏覽器會自動轉換成:HTTP://www.163.com/

2、獲取IP,建立TCP連接

瀏覽器地址欄中輸入"HTTP://www.xxx.com/"並提交之後,首先它會在DNS本地緩存表中查找,如 果有則直接告訴IP地址。如果沒有則要求網關DNS進行查找,如此下去,找到對應的IP後,則返回會給瀏覽器。

當獲取IP之後,就開始與所請求的Tcp建立三次握手連接,連接建立後,就向服務器發出HTTP請求。

3、客戶端瀏覽器向服務器發出HTTP請求

一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令,接着以頭信息的形式向Web服務器發送一些別的信息,之後瀏覽器發送了一空白行來通 知服務器,它已經結束了該頭信息的發送。

4、Web服務器應答,並向瀏覽器發送數據

客戶機向服務器發出請求後,服務器會客戶機回送應答,

HTTP/1.1 200 OK

應答的第一部分是協議的版本號和應答狀態碼,正如客戶端會隨同請求發送關於自身的信息一樣,服務器也會隨同應答向用戶發送關於它自己的數據及被請求的文 檔。

Web服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就以Content-Type應答頭信息所描述的格式發送 用戶所請求的實際數據

5、Web服務器關閉TCP連接

一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然後如果瀏覽器或者服務器在其頭信息加入了這行代碼

Connection:keep-alive

TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了爲每個請求建立新連接所需的時間,還節約了網絡帶 寬。


三、實例分析HTTP通信

     先介紹一個工具,HTTP Analyzer ,爲一款實時分析 HTTP/HTTPS 數據流的工具。它可以實時捕捉HTTP/HTTPS 協議數據,可以顯示許多信息(包括:文件頭、內容、Cookie、查詢字符竄、提交的數據、重定向的URL地址),可以提供緩衝區信息、清理對話內容、 HTTP狀態信息和其他過濾選項。同時還是一個非常有用的分析、調試和診斷的開發工具。

     下面我們訪問http://www.google.cn/ ,HTTP analyzer將抓包來分析訪問瀏覽器和服務器通信的過程。


1、   運行HTTP Analyzer,選擇菜單Action—start開始抓包;

2、   瀏覽器中輸入 http://www.google.cn/,網頁 打開後,在HTTP Analyzer中選擇Action—stop停止抓包;工具已經詳細列出了訪問的數據包信息。通過截圖見到了解下抓包信息

l           抓包結果和文件頭信息(下圖)


    



l           一次請求的html正文內容(下圖)

    





l           本次請求是否存在cookies信息(下圖)







l           一次請求的整個數據包信息,包括頭信息和正文(下圖)。





    

     你會發現瀏覽器中只點擊了一個超級鏈接,卻發送了多個數據包。那是因爲,我們請求的網頁文件中有很多圖片、音樂、電影等信息時,服務器返回的信息中並不直 接包含圖片數據,而只是保存該圖片的鏈接,當瀏覽器進行解釋的時候,遇到圖片的url時,才向服務器發出對圖片的請求信息。

       下面我們來詳細分析HTTP的請求和響應信息:

1)HTTP請求消息,當客戶端和服務端建立TCP連接後,客戶端就會向服務器發送一個請求信息, 如:

       [1] GET / HTTP/1.1

       [2] Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* 客戶端可識別的內容類型列表。

       [3] Accept-Language: zh-cn 客戶端所能解釋的語言:簡體中文

       [4] UA-CPU: x86

       [5] Accept-Encoding: gzip, deflate 客戶端可以解釋的類型

       [6] User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; InfoPath.1; CIBA) 客戶端瀏覽器型號

       [7] Host: http://www.google.cn/ 提交請求頁面

       [8] Connection: Keep-Alive TCP連接保持打開

       [9]

       該請求信息主要由4部分組成:

l           請求方法URI協議/版本:以上代碼第[1]行“GET”表示請求方法,,“HTTP/1.1代表協議和協議的版本,HTTP請求可以使用多種請求方法, 最常用的爲GET和POST方法

l           請求頭:[2]-[8]行,包含許多有關客戶端環境和請求正文的有用信息。

l           空行 :[9] 請求頭和請求正文之間是一個空行,這個行非常重要,表示請求頭已經結束,接下來是正文,這個行非常重要,它表示請求頭已經結束,接下來是請求正文。

l           請求正文。請求正文中可以包含客戶提交的查詢字符串信息,如用戶名和密碼等。這裏沒有。

這裏有一點值得說明的是:請求方法中的GET和POST方法;

               GET方法是默認的HTTP請求方法,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼,同時它將作爲URL的一 部分向Web服務器發送,因此,如果使用GET方法來提交表單數據就存在着安全隱患上,同時這個URL長度還有限制,不允許超過1k。

               POST方法是GET方法的一個替代方法,它主要是向Web服務器提交表單數據,尤其是大批量的數據。POST方法克服了GET方法的一些缺點。通過 POST方法提交表單數據時,數據不是作爲URL請求的一部分而是作爲標準數據傳送給Web服務器,這就克服了GET方法中的信息無法保密和數據量太小的 缺點。因此,出於安全的考慮以及對用戶隱私的尊重,通常表單提交時採用POST方法。

2)HTTP響應消息,響應跟請求類似,如:

[1]HTTP/1.1 200 OK

[2]Cache-Control: private, max-age=0

[3]Date: Fri, 27 Feb 2009 07:53:36 GMT

[4]Expires: -1

[5]Content-Type: text/html; charset=UTF-8

[6]Set-Cookie: PREF=ID=cc4a31ab6792ef2c:NW=1:TM=1235721216:LM=1235721216:S=q1hQBu-1KdamAWK-; expires=Sun, 27-Feb-2011 07:53:36 GMT; path=/; domain=.google.cn

[7]Content-Encoding: gzip

[8]Server: gws

[9]Transfer-Encoding: chunked

[10]

[11]ddc

該響應信息也以對應的4部分組成:

l           協議狀態描述,HTTP/1.1表示協議版本,200 OK表示服務器已經成功處理了客戶端發出的請求。200表示HTTP的應答碼成功。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的類型:

               1XX-信息類(Information),表示收到Web瀏覽器請求,正在進一步的處理中

               2XX-成功類(Successful),表示用戶請求被正確接收,理解和處理例如:200 OK

               3XX-重定向類(Redirection),表示請求沒有成功,客戶必須採取進一步的動作。

               4XX-客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOT Found,意味着請求中所引用的文檔不存在。

               5XX-服務器錯誤(Server Error)表示服務器不能完成對請求的處理:如 500

l           響應頭:跟請求頭一樣,它指出服務器的功能,標識出響應數據的細節。

l           空行:也是屬於響應頭和響應正文之間必須存在的一個空行,表示響應頭結束,接下來是響應正文

l           響應正文:也就是服務器返回的網頁內容。

根據上文的描述,再結合工具實際驗證一回,相信應該能對HTTP協議和其通信流程有個大致的瞭解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章