摘要:html
本文剖析了瀏覽器輸入URL到整個頁面顯示的整個過程,以百度首頁爲例,結合Wireshark俘獲分組進行詳細分析整個過程,從而更好地瞭解TCP/IP協議棧。正則表達式
1、俘獲分組小程序
1.1 準備工做瀏覽器
(1) 清空瀏覽器緩存緩存
首先清空Web瀏覽器的高速緩存,確保Web網頁是從網絡中獲取,而不是從高速緩衝取得[1]。谷歌瀏覽器,Options --> Under the Hood --> Clear browsing data。服務器
(2)清空DNS緩存網絡
在客戶端清空DNS高速緩存,確保Web服務器域名到IP地址映射是從網絡請求。在Windows XP,在命令行輸入ipconfig/flushdns完成操做。ui
圖1 清空DNS高速緩存spa
(3)設置過濾規則.net
爲了便於分析,在截取數據包以前,設置過濾規則。在Filter ToolBar,輸入過渡規則正則表達式,這裏過濾ARP協議(地址解析協議),以下:
圖2 設置過濾規則
(4)關閉網絡應用程序
爲使俘獲的報文僅跟訪問URL相關,關閉其餘網絡應用程序(如QQ)。
1.2 啓動Wireshrk分組俘獲器
Capture --> Interfaces,彈出以下窗口,設置接口,點擊Start啓動分組俘獲器。
圖3 啓動Wireshark分組俘獲器
1.3 瀏覽器輸入URL
這裏,以百度爲例,在瀏覽器輸入:http://www.baidu.com,回車。
1.4 中止分組俘獲
圖4 Wireshark俘獲分取實例
2、概述
Web的應用層協議是超文本傳輸協議HTTP,HTTP協議由兩部分程序實現:客戶機程序、服務器程序,協議定義了這些報文的格式以及客戶機和服務器如何進行報文交換的。Web服務器用於存儲Web對象,每一個對象由URL尋址,Web客戶機一般指瀏覽器。瀏覽器向服務器發出對Web頁中所包含對象的HTTP請求報文,服務器接受請求並用包含這些對象的HTTP響應報文進行響應。Web頁是由對象組成,對象簡單來講就是文件(如圖形文件、Java小程序、聲音剪輯文件),這些文件經過一個URL地址尋址。Web頁一般含有一個基本的HTML文件和幾個引用對象。
從在瀏覽器輸入http://www.baidu.com/並回車,到瀏覽器窗口顯示百度首頁,這中間經歷多個過程,也涉及到諸多協議(如圖4),接下來,結合俘獲的分組分析這期間都發生了些什麼。
2.1 域名解析(17~18)
首先須要將URL(存放對象的服務器主機名和對象的路徑名)解析成IP地址,具體步驟爲:
(1)同一臺用戶主機上運行着DNS應用的客戶機端(如瀏覽器)
(2)從上述URL抽取主機名www.baidu.com,傳給DNS應用的客戶機端(瀏覽器)
(3)該DNS客戶機向DNS服務器發送一個包含主機名的請求(DNS查詢報文)
(4)該DNS客戶機收到一份回答報文(即DNS回答報文),該報文包含該主機名對應的IP地址119.75.218.70
步驟(3)、(4)分別對應於上圖的前兩條DNS報文1七、18,進一步獲取這兩步的細節,就得理解DNS協議,詳情見:
博文《結合Wireshark捕獲分組深刻理解TCP/IP協議棧之DNS協議》
2.2 創建TCP連接(19~24)
HTTP使用TCP做爲底層傳輸協議,須要先創建鏈接,即瀏覽器由IP地址定位的HTTP服務器發送一個TCP連接。TCP鏈接創建及TCP報文分析,見:
博文《結合Wireshark捕獲分組深刻理解TCP/IP協議棧之TCP協議(TCP報文格式+三次握手實例)》
2.3 提取內容
2.3.1 概述
客戶機發送HTTP請求報文給服務器,服務器返回HTTP響應報文,關於HTTP報文格式及實例,詳情見:
博文《結合Wireshark捕獲分組深刻理解TCP/IP協議棧之HTTP協議》
服務器返回客戶機所請求的頁面內容,交給瀏覽器,瀏覽器解釋HTML文件(瀏覽器本質上是一個HTML解釋器),顯示文本。服務器返回的實體主體部份內容以下(經過瀏覽器查看源代碼或者查看響應報文的實體主體):
圖5 百度首頁HTML語言
2.3.2 俘獲分組分析(26~32)
從圖4能夠看出,HTTP請求報文到HTTP響應報文,中間還有若干TCP報文段,以下:
圖6 請求至響應間相關報文段
看上去挺亂的,先給出我分析後的示意圖,然後再分析,以下:
圖7 請求至響應間相關報文段示意圖
首先,客戶機發送HTTP請求報文25,服務器響應該報文26(由於HTTP傳輸層協議是TCP,可靠傳輸)。接着,服務器返回HTTP響應報文,因HTTP報文太大(3835字節),網絡層對其進行分片,共4片,以下圖(截自Wireshark俘獲的HTTP響應報文):
圖8 數據分片實例
那爲何每兩個TCP報文段纔有一個確認,這是因爲爲了提升效率,TCP實行累積確認,即收到多個報文段以後,再一次確認。
2.3 瀏覽器顯示文本內容
至此,瀏覽器收到百度首頁基本HTML頁面,瀏覽器解釋該HTML頁面(是否是也調用了JS解釋器解釋JavaScript腳本了?),結果以下:
圖9 瀏覽器解釋百度首頁基本HTML頁面
很明顯,這與平時看到的首頁不一樣,帶X的框框、百度一下按鈕,這是由於這些對象還未得到。
2.4 瀏覽器取回並顯示文件中的全部對象
瀏覽器(客戶機的代理)會繼續向相應的服務器請求所需內容,從Wireshark俘獲分組可知,瀏覽器請求了圖片、JavaScript對象,以下:
圖10 瀏覽器請求文件中其餘對象
有一點我沒搞懂,爲什麼請求/favicon.ico對象?在HTML文件找不到相關的代碼,頁面也沒顯示該圖標。求指點,謝謝:-)
這下Web頁面全部對象都到齊了,瀏覽器解釋全部對象並顯示,最終若是以下:
圖11 百度首頁
瀏覽器解釋對象有3種方式:內置解釋器(如HTML解釋器)、插件、輔助應用程序。經過服務器上的各類腳本生成完整Web頁面,服務器返回一個頁面也返回一些有關頁面的附加信息(包括MEME類型),對於內置類型的對象直接由內置解釋器解釋,其餘的,瀏覽器參照MIME類型表,調用相應的查看器處理該對象。
3、其餘問題
3.1 其餘DNS報文
Wireshark俘獲的分組中包含着不少DNS報文,事實上,只有前面兩組DNS報文是須要的,其餘的則是預取。能夠看出,瀏覽器將百度首頁HTML所涉及的URL(充分利用空閒時間,減小等待時間)
圖12 DNS報文實例
這麼多的分組,如何快速配對呢?經過標識數快速配對(如上圖所示),或者打開報文在Domain Name System底下的一行Request In或Response In會告知與哪一個報文編號匹配。
3.2 其餘TCP報文段
其餘TCP報文段,要麼是TCP鏈接創建,要麼是傳輸數據,根據博文《結合Wireshark捕獲分組深刻理解TCP/IP協議棧之TCP協議(TCP報文格式+三次握手實例)》很容易分析的。
3.3 SSDP協議
從圖4能夠看出,訪問頁面以前和以後有大量SSDP報文。SSDP(簡單服務發現協議,Simple Service Discovery Protocol)定義瞭如何在網絡上發現網絡服務的方法。不管是控制點,或是UPnP設備,工做中都必然用到SSDP,設備接入網絡以後,要利用它向網絡廣播本身的存在(廣播的信息中還有設備位置的描述),以便儘快與對應的控制點創建聯繫;控制點則利用SSDP來搜索本身將要控制的設備在哪裏.而且能夠排除已經存在的設備和控制點――只爲新近的或還沒有"聯絡"上的雙方服務[1]。
3.4 NBNS
Wireshark還俘獲一個NBNS報文。網絡基本輸入/輸出系統 (NetBIOS) 名稱服務器 (NBNS) 協議是 TCP/IP 上的 NetBIOS (NetBT) 協議族的一部分,它在基於 NetBIOS 名稱訪問的網絡上提供主機名和地址映射方法。
參考資料:
[1] 百度百科詞條:SSDP
[2] Andrew S.Tanenbaum.計算機網絡[M].
[3] 《計算機網絡--自頂向下方法與Internet特點》[M].
[4] 百度百科詞條:NBNS
本實例的Wireshark俘獲分組pcapng原文件 Wireshark俘獲分組實例.rar
請求至響應間相關報文報visio原文件 請求至響應間相關報文段.rar
from:http://blog.chinaunix.net/uid-9112803-id-3212207.html