1. 程式人生 > >HTTP協議分析

HTTP協議分析

連接 alt 命令 coo png bubuko 上傳 http通信 提交表單

實驗環境

?操作機:Windows XP

實驗目的

0、HTTP協議的基本概念及工作流程

1、捕獲HTTP數據包的方法

2、分析HTTP的連接數據包

3、HTTP數據包的篩選技術

4、分析HTTP的數據傳輸數據包

實驗工具

?wireshark

實驗步驟

了解HTTP工作流程

HTTP是一個無狀態的協議。所謂的無狀態指的是客戶端(Web瀏覽器)和服務器之間不需要建立持久的連接。這也就意味著當一個客戶端向服務器發出請求,然後服務器返回響應之後,連接也就關閉了。服務器並不會保留連接的相關信息,HTTP遵循的是請求(Request)/應答(Response)模型。客戶端(Web瀏覽器)向服務器發送請求,服務器處理請求並返回適當的應答。所有的HTTP連接都被構造成一套請求和應答。在這個過程中要經歷4個階段,包括建立連接、發送請求信息、發送響應信息和關閉連接,如下圖所示:
技術分享圖片

由上圖可知,HTTP的工作流程為:
1、客戶端通過TCP的三次握手建立與服務器的連接。
2、當TCP連接成功建立後,客戶端向服務器發送HTTP請求。
3、服務器收到客戶端的HTTP請求後,將回復響應數據包,並向客戶端發送數據。
4、客戶端通過TCP四次握手,與服務器斷開TCP連接。

HTTP連接數據包的捕獲

剛才說了,HTTP需要使用TCP的三次握手來建立連接,那麽我們在使用Wireshark進行數據包的捕獲時,需要在篩選條件中加上TCP這個篩選條件。我們的目標是捕獲到使用HTTP瀏覽網頁的數據包。那麽當我們開啟捕獲後,就可以打開瀏覽器,嘗試瀏覽www.baidu.com網站,就可以獲取與HTTP連接相關的一系列數據包。

由於瀏覽網頁會使用GET方法,所以我們可以在篩選器中輸入http.request.method==GET,這樣就可以篩選出所有的GET方法了。篩選後可以發現第44號數據包排在了第一位,那麽這個其實就是我們要尋找的,與百度建立連接的HTTP的數據包。我們可以對其進行著色處理,這樣所有與其相關的數據包都會擁有相同的顏色。之後點擊篩選器旁邊的Clear,清除篩選條件,這樣我們就可以看到完整的HTTP連接了。
技術分享圖片

HTTP連接數據包的分析

分析上一步篩選出來的文件。可以發現,整個通信是從客戶端192.168.147.129到百度的Web服務器119.75.218.70的三次握手開始的:
技術分享圖片

當連接建立之後,第一個標記為HTTP的數據包是從客戶端發往服務器的:
技術分享圖片

可以發現,HTTP數據包通過TCP被傳輸到服務器的80端口,也就是HTTP通信的標準端口(8080端口也常被使用)。
接下來可以看到,這個數據包所請求的方法是GET,所請求的URI是“/”,請求的版本為HTTP/1.1。這些信息告訴我們這個客戶端請求使用HTTP的1.1版本,下載Web服務器的根目錄(/)。這裏面還包含有客戶端向服務器發送的關於自己的信息。這些信息包含了類似於使用用戶代理(User-Agent)、瀏覽器接受的語言(Accept-Language)以及Cookie等信息。為了保證兼容性,服務器可以利用這些信息決定返回給客戶端的數據。
當服務器接收到了數據包4中的HTTP請求,它就會響應一個TCP ACK,用於數據包的確認,並在6到26號數據包中傳輸所請求的數據。HTTP只被用來發布客戶端和服務器的應用層命令。當進行數據傳輸時,除了在數據流的開始和結束部分,是看不到應用層的控制信息的。
服務器將數據在6、7、8號數據包中發送,9號數據包是來自客戶端的確認,10到24號數據包也是服務器發給客戶端的數據,25號數據包是客戶端發出的另一個確認。盡管HTTP仍然負責這些傳輸,但所有這些數據包在Wireshark中都被顯示為TCP分片而不是HTTP數據包。當數據傳輸結束後,數據的重組裝流就已經發送完了,就到了最後一個數據包:
技術分享圖片

HTTP使用了一些預定義的響應碼來表示請求方法的結果。這裏我們看到了一個帶有200狀態碼的數據包,表示一次成功的請求方法。這個數據包裏面包含有一個時間戳,以及一些關於Web服務器內容編碼和配置參數的額外信息。當客戶端接收到這個數據包後,這次的處理也就完成了。

HTTP傳送數據包分析

我們剛才所研究的是從Web服務器下載數據的過程,現在來研究一下上傳數據。當我們在網站上進行提交表單或者上傳文件的操作時,往往就能夠捕獲含有POST方法的數據包。最開始依舊是TCP的三次握手,之後客戶端(172.16.16.128)向Web服務器(69.163.176.56)發送了一個HTTP的數據包:
技術分享圖片

這個數據包使用了POST方法來向Web服務器上傳數據以供處理。這裏使用的POST方法指明了URI為/wp-comments-post.php,以及HTTP 1.1請求版本。如果想查看上傳數據的內容,可以展開下方的HTML Form URL Encoded查看。 當這個數據包傳輸完之後,服務器會發送一個ACK數據包,並在第6個數據包中傳輸了一個響應碼302(表示“找到”)作為回應:
技術分享圖片

技術分享圖片

302響應碼是HTTP的一個常用的重定向手段。這個數據包的Location域指明了客戶端被重定向的位置。此時,這個地方就是評論所發表的原先的網頁。最後,服務器傳送一個狀態碼200,並且這個頁面的內容會在接下來的一些數據包中進行發送,從而完成傳輸。

參考資料

【1】https://www.ichunqiu.com/course/51449
【2】謝希仁. 計算機網絡.第5版[M]. 電子工業出版社, 2008.

HTTP協議分析