LINUX CH4 基于NDIS的網(wǎng)絡編程-new.ppt_第1頁
LINUX CH4 基于NDIS的網(wǎng)絡編程-new.ppt_第2頁
LINUX CH4 基于NDIS的網(wǎng)絡編程-new.ppt_第3頁
LINUX CH4 基于NDIS的網(wǎng)絡編程-new.ppt_第4頁
LINUX CH4 基于NDIS的網(wǎng)絡編程-new.ppt_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、,第4章 基于NDIS的網(wǎng)絡編程,第二篇 網(wǎng)絡編程方法與技術(shù),第4章 基于NDIS的網(wǎng)絡編程,網(wǎng)絡編程技術(shù) 直接網(wǎng)卡編程(可編程芯片) 基于packet driver的編程技術(shù) 基于NDIS的網(wǎng)絡編程 VPACKET,PACKET32 Libpcap/Winpcap Berkeley Sockets編程技術(shù) Winsock JAVA網(wǎng)絡編程,網(wǎng)絡驅(qū)動程序接口規(guī)范(Network Driver Interface Specification, NDIS)是一個較為成熟的網(wǎng)絡驅(qū)動接口標準,它包含局域網(wǎng)網(wǎng)卡驅(qū)動程序標準、廣域網(wǎng)驅(qū)動程序標準以及存在于協(xié)議和網(wǎng)卡之間的中間驅(qū)動程序標準。 NDIS的一個主

2、要目的就在于將NDIS驅(qū)動程序中一些公用代碼提取出來,使NDIS驅(qū)動程序只需利用和硬件特性有關(guān)的少量的代碼即可,從而降低了開發(fā)的難度并提高開發(fā)效率。,4.1 Windows NT網(wǎng)絡體系結(jié)構(gòu),Windows NT網(wǎng)絡體系結(jié)構(gòu)是基于OSI/RM七層網(wǎng)絡概念模型的。 OSI參考模型中的最底層是物理層。 OSI把數(shù)據(jù)鏈路層分為兩個子層:LLC和MAC。 LLC層定義包括用來保證數(shù)據(jù)從發(fā)送端到接收端正確流動的地址機制,以及用來傳輸?shù)刂?、?shù)據(jù)和錯誤檢查信息的格式域。 MAC子層管理對網(wǎng)絡介質(zhì)的訪問方式、檢查幀錯誤。 在Windows NT網(wǎng)絡體系結(jié)構(gòu)中,LLC子層的功能由傳輸驅(qū)動程序來完成。MAC子層的

3、功能由網(wǎng)卡實現(xiàn)。管理網(wǎng)卡設(shè)備的軟件叫做網(wǎng)卡驅(qū)動程序。 網(wǎng)絡層的關(guān)鍵功能是網(wǎng)絡尋址,為了在網(wǎng)絡中從源到目的端建立路徑而規(guī)劃一個邏輯連接。包括路由、流量控制、數(shù)據(jù)分段和重組等。 傳輸層負責消息傳輸?shù)臏蚀_性、錯誤控制、順序檢測和其他影響端到端數(shù)據(jù)傳輸?shù)目煽啃浴?在Windows NT體系中,LLC子層、網(wǎng)絡層和傳輸層的功能都由傳送驅(qū)動程序(又稱為協(xié)議驅(qū)動程序或協(xié)議)完成。,圖 1 Windows網(wǎng)絡結(jié)構(gòu)體系與協(xié)議模型的對照,SPI:Service Provider Interface; TDI:Transfer Driver Interface NDIS:Network Driver Interfa

4、ce Specification,4.2 NDIS的基本概念,4.2.1 NDIS概述 網(wǎng)絡驅(qū)動程序接口規(guī)范(Network Driver Interface Specification ,簡稱NDIS)是微軟公司和3COM合作開發(fā)的網(wǎng)絡驅(qū)動接口規(guī)范,是在基于X86平臺操作系統(tǒng)(主要是DOS和WINDOWS)上開發(fā)網(wǎng)卡驅(qū)動程序和網(wǎng)絡協(xié)議驅(qū)動程序必須遵守的設(shè)計框架。 Microsoft在以NT為內(nèi)核的操作系統(tǒng)中實現(xiàn)了這個規(guī)范管理庫,從而程序開發(fā)者能夠方便地添加自己對網(wǎng)絡的過濾攔截程序。,NDIS,NDIS定義了操作系統(tǒng)網(wǎng)絡傳輸模塊的一個抽象環(huán)境,在這個環(huán)境中,各層驅(qū)動程序?qū)嶓w之間沒有直接的通信機

5、制,它們之間的交互全部由NDIS(通過操作系統(tǒng)中的NDISLib或NDISWrapper)提供統(tǒng)一例程和調(diào)用來實現(xiàn)。 NDIS負責上下層驅(qū)動程序之間服務原語和實際驅(qū)動程序相應調(diào)用入口之間的轉(zhuǎn)換,分派消息通知。這樣保證了符合NDIS的驅(qū)動程序不需知曉其他驅(qū)動程序的入口就可與之通信,而自身只需向NDIS注冊私有的入口點即可。 這種設(shè)計思路保證了基于NDIS的驅(qū)動程序開發(fā)可以與平臺無關(guān),具有高度的源代碼移植性。 下圖2描述的是Windows NT網(wǎng)絡驅(qū)動程序的組件。,Native Media Type,NDIS,Windows NT支持三種網(wǎng)絡驅(qū)動程序: 網(wǎng)卡驅(qū)動程序(與硬件打交道) 中間協(xié)議驅(qū)動程

6、序(在不同協(xié)議之間進行轉(zhuǎn)換) 傳送驅(qū)動程序(通信協(xié)議,如TCP/IP,IPX/SPX等) 標準的WINDOWS網(wǎng)絡體系結(jié)構(gòu)的最底層是網(wǎng)卡,網(wǎng)卡通過NDIS與網(wǎng)卡(NIC)驅(qū)動程序通信,網(wǎng)卡驅(qū)動程序又通過NDIS與協(xié)議驅(qū)動程序通信。在NIC驅(qū)動程序和協(xié)議驅(qū)動程序之間可能還存在一個中間驅(qū)動程序。 在協(xié)議驅(qū)動程序的上邊,是內(nèi)核模式TDI用戶驅(qū)動程序,通過TDI接口同協(xié)議驅(qū)動程序交互。再往上,則是用戶模式的動態(tài)鏈接庫(提供WIN32 API)及網(wǎng)絡應用程序。 WINDOWS NT中的許多網(wǎng)絡組件都是以內(nèi)核模式驅(qū)動程序方式實現(xiàn)的。,4.2.2 NDIS驅(qū)動程序分類,1.網(wǎng)卡(NIC)驅(qū)動程序 網(wǎng)卡驅(qū)動程

7、序(NIC Driver,又稱MAC Driver)通過NDIS提供的調(diào)用訪問和管理網(wǎng)卡上的DMA、I/O、IRQ、內(nèi)存資源,負責接收來自網(wǎng)卡的數(shù)據(jù)包并傳遞給上層驅(qū)動程序,把上層要發(fā)送的數(shù)據(jù)包發(fā)給網(wǎng)卡。 網(wǎng)卡驅(qū)動程序管理實際的網(wǎng)絡硬件,它是在協(xié)議驅(qū)動程序和不同的網(wǎng)卡之間架起一道橋梁,允許高層驅(qū)動程序通過它來發(fā)送和接收包、復位和停止NIC、查詢和設(shè)置NIC的特性。 發(fā)送:NIC驅(qū)動程序通過NDIS從上層驅(qū)動程序接收數(shù)據(jù)包,根據(jù)實際網(wǎng)卡的不同特點和要求,將數(shù)據(jù)送入網(wǎng)卡的發(fā)送緩沖區(qū); 接收:將網(wǎng)卡接收緩沖區(qū)中接收到的數(shù)據(jù),通過NDIS傳送到相應的協(xié)議驅(qū)動程序。 NIC驅(qū)動程序的數(shù)據(jù)處理流程入圖3所示

8、。,NDIS,NDIS,NDIS是網(wǎng)卡驅(qū)動程序及下層的各網(wǎng)絡接口卡(NIC)與上層的各協(xié)議驅(qū)動程序及操作系統(tǒng)之間進行通信的接口。 Windows定義NDIS(NDIS接口函數(shù)庫), 這個庫處理管理網(wǎng)絡上異步通信中涉及的許多細節(jié)。NDIS庫給出一個完整的內(nèi)核模式系統(tǒng)函數(shù)集,使得用戶編制的NDIS驅(qū)動程序不需要與操作系統(tǒng)打交道。 根據(jù)從NDIS接口庫得到的幫助的多少,NIC驅(qū)動程序可分類為小端口或全驅(qū)動程序。最初的windows網(wǎng)卡驅(qū)動程序需要自己管理有關(guān)硬件細節(jié)、同步、排隊等方面的事情,稱為全(FULL)網(wǎng)卡驅(qū)動程序。 現(xiàn)在,通過小端口網(wǎng)卡驅(qū)動程序,這些事情都由NDIS來做了,這樣既減輕了開發(fā)難

9、度,且執(zhí)行速度更快,移植性好,不以來于操作系統(tǒng)。,NDIS,2.傳送驅(qū)動程序(協(xié)議驅(qū)動程序) 傳送驅(qū)動程序負責實現(xiàn)特定的網(wǎng)絡協(xié)議,如TCP/IP或IPX/SPX。它獨立于低層的網(wǎng)絡硬件,使用NDIS 網(wǎng)卡驅(qū)動程序或中間驅(qū)動程序在一個或多個物理網(wǎng)絡連接上傳送包。,NDIS,3. 中間協(xié)議驅(qū)動程序 NDIS中間驅(qū)動程序是傳送驅(qū)動程序和NDIS小端口驅(qū)動程序之間的夾層,對于傳送驅(qū)動程序來說,中間驅(qū)動程序表現(xiàn)為NDIS小端口(虛擬的網(wǎng)卡驅(qū)動程序),對于網(wǎng)卡驅(qū)動程序來說,它表現(xiàn)為傳送驅(qū)動程序。 NDIS中間驅(qū)動程序主要用于進行協(xié)議轉(zhuǎn)換,在有遺留傳送驅(qū)動程序而且想把它連接到對傳送驅(qū)動程序未知的某種新的介質(zhì)

10、時,是十分有用的。在這種情況下,中間驅(qū)動程序執(zhí)行各種必要的傳送驅(qū)動程序和NIC小端口之間進行數(shù)據(jù)格式的轉(zhuǎn)換,管理新的介質(zhì)。比如中間驅(qū)動程序把LAN協(xié)議轉(zhuǎn)換為ATM協(xié)議?;?qū)AN的IEEE 802.3數(shù)據(jù)格式轉(zhuǎn)換為WAN的PPP格式。 一個中間層驅(qū)動程序可疊加在另一中間層驅(qū)動程序上。,NDIS,4 TDI 所有的Windows NT傳送驅(qū)動程序都通過傳送驅(qū)動程序接口(TDI)為內(nèi)核模式網(wǎng)絡客戶程序提供服務。TDI規(guī)范定義支持基于連接的和非連接的協(xié)議的低級接口。為所有傳送驅(qū)動程序顯露一個共同的接口,簡化了傳送驅(qū)動程序和它們支持的客戶程序的實現(xiàn)。它負責接受上層數(shù)據(jù),打包,再調(diào)用NDIS庫函數(shù)將數(shù)據(jù)

11、發(fā)送至下層驅(qū)動程序。,4.3 小端口網(wǎng)卡驅(qū)動程序(miniport NIC driver),4.3.1 開發(fā)小端口驅(qū)動程序的目的 NDIS小端口驅(qū)動程序直接管理硬件,給上層提供一個接口,其主要功能是接口初始化、發(fā)送、中斷處理、重置、參數(shù)查詢與設(shè)置和報文接收等。 小端口驅(qū)動程序使得開發(fā)者能夠針對硬件編寫代碼。前面已經(jīng)提到全網(wǎng)卡驅(qū)動程序(full NIC driver)必須處理很多復雜的機制,但小端口通常不需要關(guān)心那些復雜的機制。而且小端口更加易于開發(fā)和測試。 NDIS的小端口函數(shù)庫(以NdisM.為前綴)作為NDIS庫的一部分處理多處理器同步機制。下面各項是NDIS庫對小端口的支持。,小端口網(wǎng)卡

12、驅(qū)動程序,w 過濾數(shù)據(jù)包 w同步和多處理器支持 w支持多包發(fā)送和接收 w支持全雙工操作 小端口必須支持NDIS定義的媒質(zhì)類型,而且要滿足以下幾點需要: (1)簡便性 小端口應僅調(diào)用NdisXxx函數(shù),使驅(qū)動程序可以運行在CISC和 RISC平臺上,而不能包含其他依賴性的代碼。NDIS使小端口獨立于不同的處理器。 (2)多處理器支持 任何一個驅(qū)動程序都要有多處理器支持。NDIS庫已經(jīng)提供該支持。 (3)功能需求 驅(qū)動程序必須能用NDIS注冊,能分配、初始化、檢查和釋放包描述符。包描述符是有公有和私有成員的一個數(shù)據(jù)結(jié)構(gòu),并包含緩沖區(qū)的指針。,小端口網(wǎng)卡驅(qū)動程序,4.3.2 小端口驅(qū)動程序的結(jié)構(gòu) 一

13、個小端口驅(qū)動程序包括驅(qū)動程序?qū)ο?、?qū)動程序代碼和NDIS庫代碼。 Windows NT DDK 提供ndis.h作為小端口的主頭文件。這個頭文件定義了小端口的入口、NDIS庫函數(shù)和公有數(shù)據(jù)結(jié)構(gòu)。,小端口網(wǎng)卡驅(qū)動程序,NDIS使用一個叫做邏輯適配器的軟件對象來表示系統(tǒng)的每一個網(wǎng)卡。邏輯適配器與一個由I/O子系統(tǒng)管理的Windows NT設(shè)備對象相關(guān)聯(lián)。代表網(wǎng)卡的設(shè)備對象包含該網(wǎng)卡的信息,如網(wǎng)卡名、IP地址和網(wǎng)卡硬件地址,也包含硬件驅(qū)動程序的當前狀態(tài),如綁定數(shù)量、綁定句柄、邏輯適配器信息等。初始化時NDIS把這個結(jié)構(gòu)的句柄傳送給MiniportInitialize; 此結(jié)構(gòu)由NDIS保留。 一個小

14、端口驅(qū)動程序被調(diào)用來初始化一個它所管理的適配器時,它創(chuàng)建一個自己的內(nèi)部數(shù)據(jù)結(jié)構(gòu)來表示該適配器。驅(qū)動程序用這個數(shù)據(jù)結(jié)構(gòu)來保存用于管理網(wǎng)卡的設(shè)備狀態(tài)信息。 小端口網(wǎng)卡驅(qū)動程序調(diào)用NdisMSetAttributes或NdisMSetAttributesEx將這個結(jié)構(gòu)的句柄傳遞給NDIS, 當NDIS調(diào)用此小端口的入口時,就將該句柄傳遞給驅(qū)動程序。該數(shù)據(jù)結(jié)構(gòu)由小端口自己擁有并保留。,小端口網(wǎng)卡驅(qū)動程序,4.3.3 小端口網(wǎng)卡驅(qū)動程序的函數(shù) 表1描述了小端口驅(qū)動程序的函數(shù)。NDIS代替上層網(wǎng)絡程序調(diào)用這些函數(shù),例如上層的協(xié)議驅(qū)動程序。 整個網(wǎng)卡驅(qū)動程序由一系列供NDIS調(diào)用的功能函數(shù)及DriverEn

15、try例程組成 。要注意的是,下面所提到的例程,除了DriverEntry例程外,其它例程的名稱都可任取,因為經(jīng)注冊后,NDIS只使用各例程的地址。,表1 小端口函數(shù)調(diào)用,小端口網(wǎng)卡驅(qū)動程序,主要的小端口函數(shù)調(diào)用如下: DriverEntry例程是操作系統(tǒng)調(diào)用網(wǎng)卡驅(qū)動程序的入口,在DriverEntry例程內(nèi),網(wǎng)卡驅(qū)動程序調(diào)用NDIS進行注冊,讓NDIS知道網(wǎng)卡驅(qū)動程序的入口點及其上各函數(shù)的入口地址,以備NDIS在必要時調(diào)用。 初始化過程由MiniportInitialize例程來完成,它使網(wǎng)絡接口卡和網(wǎng)卡驅(qū)動程序處于初始狀態(tài),以準備發(fā)送和接收數(shù)據(jù)包。包括初始化變量、網(wǎng)卡復位等操作。 網(wǎng)卡驅(qū)動

16、程序的狀態(tài)信息處理由MiniportQueryInformation和MiniportSetInformation來查詢和設(shè)置。前者用來向上層網(wǎng)絡驅(qū)動程序報告諸如網(wǎng)卡類型、幀大小、硬件地址等信息,而后者則接收來自上層的設(shè)置,如多播地址、包過濾選擇等。,小端口網(wǎng)卡驅(qū)動程序,數(shù)據(jù)傳輸方面操作有MiniportSend、MiniportTransferData、MiniportSendPackets、MiniportReceivePacket等多種例程,取決與網(wǎng)卡及驅(qū)動程序支持的數(shù)據(jù)傳送方式。如驅(qū)動程序支持多包同時發(fā)送,則要求用MiniportSendPackets例程;如果一次只傳送一個包,則要求

17、用MiniportSend例程。 中斷處理由MiniportISR和MiniportHandleInterrupt來執(zhí)行,前者是網(wǎng)卡中斷程序,而后者是中斷延遲處理程序。另外MiniportDisalbeInterrupt和MiniportEnableInterrupt用于控制中斷。這些函數(shù)主要用來用中斷方式對網(wǎng)卡進行數(shù)據(jù)接收和發(fā)送及其他處理,對于不采用中斷處理的網(wǎng)卡來說,則不需要。 還有一些例程,如MiniportHalt、MiniportReset用于NDIS在特殊的情況下調(diào)用。,小端口網(wǎng)卡驅(qū)動程序,4.3.3 NDIS小端口驅(qū)動程序設(shè)計(自學了解) 1.初始化NDIS庫以及注冊驅(qū)動程序 2

18、.注冊網(wǎng)卡 3.發(fā)送數(shù)據(jù) 4.接收數(shù)據(jù) 5.中斷處理 6.傳輸終結(jié)處理,4.4 NDIS中間驅(qū)動程序,4.4.1 IMDriver概述 NDIS中間驅(qū)動程序(intermediate driver,簡稱IMDriver)既提供MiniportXxx函數(shù),又提供ProtocolXxx函數(shù),一個典型的中間驅(qū)動程序位于一個或多個NDIS網(wǎng)卡驅(qū)動程序之上和一個傳輸驅(qū)動程序之下。,NDIS中間驅(qū)動程序,4.4.2 NDIS中間驅(qū)動程序的功能 (1)Intermediate driver的作用為:作為上下驅(qū)動程序之間的橋梁,一是把從上層驅(qū)動送來的數(shù)據(jù)包發(fā)送到下層驅(qū)動程序;二是當收到從下層驅(qū)動程序送來的數(shù)據(jù)

19、包時,通知上層驅(qū)動程序。 (2)提供MiniportSetInformation和MiniportQueryInformation函數(shù),來處理上層驅(qū)動程序發(fā)送的請求并調(diào)用NdisRequest將請求傳向低層的網(wǎng)卡驅(qū)動程序。 (3)使用NdisSend和NdisSendPacket來發(fā)送包。 (4)初始化。DriverEntry例程作為初始化驅(qū)動程序,并使用NDIS_INIT_FUNCTION宏來清理例程。,4.4.3 NDIS中間驅(qū)動程序的工作原理,如圖所示為中間層驅(qū)動程序的結(jié)構(gòu)示意圖。所有來自于網(wǎng)卡的數(shù)據(jù)幀首先傳遞給網(wǎng)卡驅(qū)動程序,然后數(shù)據(jù)幀傳遞給傳輸層驅(qū)動程序。如果在兩者之間插入中間層驅(qū)動程

20、序,對上層TCP/IP協(xié)議表現(xiàn)為一個虛擬網(wǎng)卡,并且提供微端口函數(shù)接口;對下層表現(xiàn)為Protocol,并提供Protocol函數(shù)調(diào)用接口。所有出入網(wǎng)卡的數(shù)據(jù)幀均會被該驅(qū)動程序捕獲。 如果把處理程序放在該層則可以完全控制出入網(wǎng)卡的數(shù)據(jù),而且還可以對數(shù)據(jù)幀進行過濾。,NDIS中間驅(qū)動程序的工作原理,1.初始化-DriverEntry例程 同普通驅(qū)動程序一樣,NDIS中間層驅(qū)動程序也有一個名為DriverEntry初始化入口函數(shù)。 在一個中間驅(qū)動程序里,DriverEntry必須滿足下面各項。 (1)調(diào)用NdisMInitializeWrapper對網(wǎng)卡驅(qū)動程序進行封裝,并將返回的句柄保存在NdisW

21、rapperHandle。 (2)注冊小端口函數(shù)。調(diào)用NdisIMRegisterLayeredMiniport或NdisMRegisterMiniport注冊中間驅(qū)動程序MiniportXxx函數(shù),調(diào)用上述函數(shù)時要用到第1步中返回的句柄。 (3)注冊協(xié)議。如果中間驅(qū)動程序?qū)⒁壎ㄔ贜DIS驅(qū)動程序上,就要調(diào)用NdisRegisterProtocol注冊中間驅(qū)動程序的ProtocolXxx函數(shù)。 DriverEntry必須初始化封裝并注冊為小端口驅(qū)動程序。如果中間驅(qū)動程序也輸出函數(shù)集,那么DriverEntry也必須初始化為協(xié)議驅(qū)動程序。,NDIS中間驅(qū)動程序的工作原理,2. IMDriver的注冊 3. 協(xié)議驅(qū)動的注冊 4. 動態(tài)綁定 5. IMDriver的數(shù)據(jù)包管理 6. 在IMDriver中接收數(shù)據(jù),4.4.4 NDIS中間驅(qū)動程序的實現(xiàn),1. 注冊 2. 初始化 3. 發(fā)送數(shù)據(jù)包 4. 接收數(shù)據(jù)包,NDIS-HOOK,IM Driver 功能比較強大,但編程接口復雜。最麻煩的是安裝,自動化安裝太困難。 NDIS-HOOK 克服了上

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論