深度剖析WinPcap之(四)——WinPcap的體系架構(1)

WinPcap是Win32平臺下用於數據包捕獲與網絡分析的一個架構。它包含一個內核層數據包過濾器,一個底層動態鏈接庫(packet.dll),與一個高層並獨立於系統的庫(wpcap.dll)。

1.1 WinPcap的主要組成

WinPcap的各個主要組成部分如圖2-1所示。
clip_p_w_picpath001[1]
圖2-1 WinPcap的主要組成
首先,爲了訪問網絡上傳輸的原始數據,一個捕獲系統需要繞過操作系統的協議棧。 這需要一部分程序運行於操作系統的內核中,來與網絡接口驅動直接交互。該部分與操作系統密切相關,WinPcap的解決方案是實現一個叫做Netgroup Packet Filter(NPF)的設備驅動程序,並對Windows 95、Windows 98、Windows ME、Windows NT 4、Windows 2000 與Windows XP等不同操作系統提供不同版本的驅動程序。這些驅動程序提供了數據包捕獲與發送的基本特性,同時也提供諸如一個可編程的過濾系統與一個監控引擎之類的更高級特性。第一個特性可用於限制一個捕獲會話,只捕獲特定的網絡數據包(比如,可以只捕獲一個特定主機生成的ftp數據包)。第二個特性提供了一個強大但簡單的方式,來獲取網絡流量的統計信息 (比如,可以獲取網絡負載或兩個主機間所交換數據的數量)。
其次,捕獲系統必須導出一個接口,使得用戶層應用程序可使用內核驅動所提供的特性。WinPcap提供兩個不同的庫:packet.dll與wpcap.dll。第一個庫提供一個底層的API,可用來直接訪問驅動程序的函數,提供一個獨立於微軟的不同操作系統的編程接口。第二個庫導出了更強大的、更高層的捕獲函數接口,並提供與UNIX捕獲庫libpcap的兼容性。這些函數使得數據包的捕獲能獨立於底層網絡硬件與操作系統。

1.2 數據包捕獲的基本過程

WinPcap從網絡上捕獲一個數據包,然後遞送給應用程序,所調用的組件如圖2-2,圖2-3所示。
clip_p_w_picpath003
圖2-2 NPF結構

1.2.1 網卡與NIC設備驅動

現代NIC板載內存的數量通常限制爲幾千字節。在不依賴主機工作站的能力下,這些內存在全連接速度(full link speed)下需要滿足數據包的接收與發送。此外,NIC在數據包被存儲在板載內存中時,就執行一些初步的的檢查,諸如CRC錯誤、短以太網幀,因此無效幀可以立即被丟棄。
在一個有效數據包被NIC接收後,將對總線控制器產生一個總線數據傳輸請求。此時,NIC控制了總線,傳輸數據包到工作站主內存中的NIC緩衝區中(參見圖2-3),釋放總線,產生一個硬件中斷給高級可編程中斷控制器(Advanced Programmable Interrupt Controller,APIC)芯片。該芯片叫醒操作系統的中斷處理例程(OS interrupt handling routine),其觸發NIC設備驅動程序的中斷服務程序(ISR)。
一個寫的好的設備驅動程序的ISR只做很少的事情。最基本的事情,它要檢查該中斷是否是它自己要處理的的(在x86機器中一箇中斷可被多個設備共享),並做出應答。接着,ISR調度一個較低優先級的函數(稱作延遲過程調用,DPC),該函數稍後處理硬件請求與告知上層驅動程序(如協議層的驅動程序,數據包捕獲驅動程序)一個數據包被接收了。當沒有中斷被掛起時CPU將處理DPC例程。當NIC設備驅動程序正在執行處理時,來自NIC的中斷被禁用,因爲在處理下一個服務前一個數據包的處理必須完成。此外,既然中斷的產生是一個耗費很大的操作,現代NIC允許多個數據包被送入一箇中斷的上下文中,因此上層驅動程序每次激活是要能夠處理多個數據包的。
clip_p_w_picpath005
圖2-3 從NIC到應用程序的路徑

1.2.2 數據包捕獲驅動

數據包捕獲組件通常對其它的軟件模塊(如協議棧)是透明的,並不對標準的系統行爲帶來影響。它們僅僅在系統中插入一個鉤子——通常使用一個回調函數tap()——只要一個新的數據包從網絡上到來,它們就能夠被告知。tap()函數所作的第一步就是對數據包執行過濾。在Win32平臺下數據包捕獲組件通常作爲一個網絡協議驅動程序被實現。

1.2.3 用戶層的接口支持

必須導出一個接口,使得用戶層應用程序可使用數據包捕獲組件所提供的功能,一般通過給用戶提供易於使用的庫來實現。WinPcap提供packet.dll與wpcap.dll兩個庫,這些庫使得應用程序對數據包捕獲功能的使用能獨立於底層網絡硬件與操作系統。

 

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