標(biāo) 題: Windows網(wǎng)絡(luò)體系結(jié)構(gòu)總結(jié)
作 者: jbwang
時(shí) 間: 2009-11-23,11:22:25
鏈 接: http://bbs.pediy.com/showthread.php?t=101794
做了一些東西自己也看了一些書(shū),最近總結(jié)了一下,想給大家分享一下,高手可以飛過(guò)了。如果有什么問(wèn)題可以給小弟指正一下,多謝!
在介紹Windows網(wǎng)絡(luò)體系架構(gòu)之前,我首先介紹一下Windows中的兩個(gè)重要編程規(guī)范——TDI,NDIS.,然后再介紹網(wǎng)絡(luò)體系的架構(gòu)。
TDI,Transport Driver Interface,傳輸驅(qū)動(dòng)程序接口。\Windows\System32\Drivers\Tdi.sys
在實(shí)現(xiàn)網(wǎng)絡(luò)API驅(qū)動(dòng)程序時(shí),由于牽涉到很多不同協(xié)議,會(huì)用到不同協(xié)議驅(qū)動(dòng)提供的接口,使得開(kāi)發(fā)的工作復(fù)雜化。所以Microsoft在網(wǎng)絡(luò)API驅(qū)動(dòng)程序和協(xié)議驅(qū)動(dòng)之間又增加了一層TDI。TDI接口只是一種"將網(wǎng)絡(luò)請(qǐng)求格式化成IRP,以及申請(qǐng)網(wǎng)絡(luò)地址和數(shù)據(jù)通信"的做法規(guī)范化。遵從TDI標(biāo)準(zhǔn)的傳輸協(xié)議向他們的客戶(如Socket emulator,Netbios emulator等)導(dǎo)出了TDI接口,有利于上下層之間的通信:
? 一方面,對(duì)于TDI上層的網(wǎng)絡(luò)API驅(qū)動(dòng)程序就不需要使用所有協(xié)議驅(qū)動(dòng)程序所提供的接口,直接使用TDI提供的統(tǒng)一接口。
? 另一方面,對(duì)于下層協(xié)議驅(qū)動(dòng)程序(也稱為TDI Transport Provider傳輸器)直接由TDI接口來(lái)調(diào)用,發(fā)出請(qǐng)求。

在Windows VISTA版本之后,TDI就不再使用了,取而代之的是Windows filter platform和Winsock kernel。
NDIS,Network Driver Interface Specification,網(wǎng)絡(luò)驅(qū)動(dòng)程序接口規(guī)范,在操作系統(tǒng)中的位置
\Windows\System32\Drivers\NDIS.sys
當(dāng)一個(gè)協(xié)議驅(qū)動(dòng)程序想要按照其協(xié)議的格式解析網(wǎng)上讀寫(xiě)的數(shù)據(jù)時(shí),而這些數(shù)據(jù)必須通過(guò)網(wǎng)絡(luò)適配器才能取得,期望協(xié)議驅(qū)動(dòng)程序能夠理解市場(chǎng)上的每一款網(wǎng)絡(luò)適配器的細(xì)微區(qū)別是不可能的。所以在1989年,由Microsoft和3Com聯(lián)合開(kāi)發(fā)的了NDIS,使得協(xié)議驅(qū)動(dòng)程序可以以一種與設(shè)備無(wú)關(guān)的方式來(lái)跟網(wǎng)絡(luò)適配器驅(qū)動(dòng)程序進(jìn)行通信。遵從NDIS的網(wǎng)絡(luò)適配器驅(qū)動(dòng)程序稱為NDIS minport driver。
NDIS規(guī)范實(shí)現(xiàn)了與TDI標(biāo)準(zhǔn)類似的功能,都是將復(fù)雜的下層調(diào)用規(guī)范化、標(biāo)準(zhǔn)化,大大提高了Windows操作系統(tǒng)的可擴(kuò)展性和兼容性。也表現(xiàn)在兩個(gè)方面:
? 對(duì)于下層,讓網(wǎng)絡(luò)適配器制造商很easy的開(kāi)發(fā)自己的設(shè)備驅(qū)動(dòng)程序,也就是Ndis miniport driver。這些miniport driver直接利用NDIS提供的接口發(fā)送指令,NDIS對(duì)這些格式化的指令進(jìn)行解析,做進(jìn)一步處理。(這些處理就到了HAL了)
? 對(duì)于上層,多個(gè)協(xié)議驅(qū)動(dòng)程序與下層minport driver之間的通信,也都是通過(guò)統(tǒng)一的NDIS接口,NidsAllocatePacket,NdisSend等函數(shù)來(lái)收發(fā)數(shù)據(jù)。
廢話兩句:TDI和NDIS兩大接口規(guī)范,有力的提升了Windows操作系統(tǒng)對(duì)不同設(shè)備廠商的支持,降低了設(shè)備廠商對(duì)設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)的難度;也增加了對(duì)于不同網(wǎng)絡(luò)協(xié)議的支持,給用戶更強(qiáng)大的網(wǎng)絡(luò)功能支持。這種設(shè)計(jì)我們也可以在Windows存儲(chǔ)管理中看到,從中我們似乎可以了解到一些,Windows操作系統(tǒng)在商業(yè)上取得成功的原因。Linux操作系統(tǒng)中沒(méi)有這樣的驅(qū)動(dòng)層次結(jié)構(gòu)。
設(shè)備制造商開(kāi)發(fā)的Ndis miniport driver直接調(diào)用NDIS庫(kù)中的接口函數(shù),因此不需要考慮重入的問(wèn)題,就是一個(gè)請(qǐng)求尚未結(jié)束的時(shí)候,新的請(qǐng)求又進(jìn)來(lái)了。NDIS庫(kù)對(duì)請(qǐng)求進(jìn)行了序列化,但是這種序列化也妨礙了多處理器的擴(kuò)展性。所以NDIS5中提供了非序列化的操作項(xiàng)。下面,我來(lái)介紹一下,Deserialized和Serialized minport driver的區(qū)別:
Deserialized NDIS miniport driver自己序列化對(duì)MinportXxx函數(shù)的操作,排隊(duì)和管理多個(gè)并發(fā)請(qǐng)求的任務(wù)都由驅(qū)動(dòng)程序自己來(lái)完成。而Serialized NDIS miniport driver以上的工作都是依賴于NDIS庫(kù)來(lái)完成的。從性能角度看,Deserialized NDIS miniport driver的性能是Serialized NDIS miniport driver性能的2倍多,所以到NDIS6.0之后的所有Miniport driver都是deserialize的。
以上是我參考MSDN以及自己的一些理解畫(huà)出來(lái)的windows網(wǎng)絡(luò)架構(gòu)圖,下面我就從上到下來(lái)簡(jiǎn)單介紹一下其中的各個(gè)層。
1. 網(wǎng)絡(luò)應(yīng)用程,Network applicantion,用戶態(tài)的應(yīng)用程序調(diào)用Windows操作系統(tǒng)提供的網(wǎng)絡(luò)API,網(wǎng)絡(luò)API包括:
a) Windows套接字(winsock)
b) 遠(yuǎn)程過(guò)程調(diào)用RPC
c) Web訪問(wèn)API
d) 命名管道和郵件槽
e) 其他網(wǎng)絡(luò)API
這些API既可以在用戶模式下實(shí)現(xiàn),也可以同時(shí)在用戶模式和內(nèi)核模式下實(shí)現(xiàn)。從本質(zhì)上說(shuō)這些API是下層提供接口的另一層封裝而已。
2. TDI Clients,傳輸驅(qū)動(dòng)程序接口客戶,是內(nèi)核模式的設(shè)備驅(qū)動(dòng)程序,用于實(shí)現(xiàn)網(wǎng)絡(luò)API的內(nèi)核部分。將網(wǎng)絡(luò)API的請(qǐng)求轉(zhuǎn)換成IRP,通過(guò)TDI標(biāo)準(zhǔn)格式化后,發(fā)送給下層的協(xié)議驅(qū)動(dòng)(也就是TDI傳輸器)。從sockets emulator的架構(gòu)圖看到,TDI Clients的實(shí)現(xiàn)可以有用戶態(tài)的部分,也有內(nèi)核態(tài)的部分。AFD輔助功能驅(qū)動(dòng)程序通過(guò)向協(xié)議驅(qū)動(dòng)程序發(fā)送TDI IRP來(lái)執(zhí)行網(wǎng)絡(luò)套接字操作,比如發(fā)送和接受消息。AFD沒(méi)有不是確定使用哪一個(gè)協(xié)議驅(qū)動(dòng),而是上層通知其要使用的協(xié)議名稱,然后AFD去打開(kāi)相應(yīng)協(xié)議的設(shè)備對(duì)象。
3. TDI Transport Providers、TDI傳輸器、NDIS協(xié)議驅(qū)動(dòng)程序、協(xié)議驅(qū)動(dòng)程序,所有這些其實(shí)就是指的同一個(gè)東西,我在后面就稱其為協(xié)議驅(qū)動(dòng)程序。這個(gè)部分就是我們對(duì)某個(gè)協(xié)議的具體實(shí)現(xiàn)部分。做過(guò)網(wǎng)絡(luò)協(xié)議開(kāi)發(fā)的朋友一定知道,協(xié)議其實(shí)就是雙發(fā)協(xié)商好的一套通信的規(guī)則。以IP協(xié)議為例,實(shí)際上就是對(duì)網(wǎng)絡(luò)數(shù)據(jù)的一種處理方式,根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包的解析結(jié)構(gòu),做出相應(yīng)的處理。Windows的tcpip.sys就實(shí)現(xiàn)了多個(gè)協(xié)議,ip、tcp、udp、arp、icmp、igmp,它為上層的TDI Clients提供了5個(gè)設(shè)備對(duì)象,用于訪問(wèn)使用這些協(xié)議,TDI Clients打開(kāi)這些設(shè)備對(duì)象,向其發(fā)送IRP請(qǐng)求來(lái)實(shí)現(xiàn)自己的操作。通過(guò)DDK的DeviceTree我們可以得到這些設(shè)備對(duì)象
a) \Device\Rawip
b) \Device\Tcp
c) \Device\Udp
d) \Device\IPMULTICAST
e) \Device\Ip
協(xié)議驅(qū)動(dòng)程序處理的數(shù)據(jù)是通過(guò)NDIS庫(kù)中提供的接口來(lái)獲取的,不需要發(fā)送IRP來(lái)取得。在DDK XP中提供了一個(gè)協(xié)議驅(qū)動(dòng)程序了源程序Ndisuio,DDK XP后的版本提供的是Ndisport。在DriverEntry中我們可以看到,驅(qū)動(dòng)程序一開(kāi)始就注冊(cè)了一個(gè)NDIS_PROTOCOL_CHARACTERISTICS,這個(gè)結(jié)構(gòu)體中是一堆NdisXxxx函數(shù)。NDIS規(guī)范在這里就開(kāi)始發(fā)揮它的作用了。
協(xié)議驅(qū)動(dòng)程序的另一個(gè)作用就是監(jiān)聽(tīng)網(wǎng)絡(luò)數(shù)據(jù),自己開(kāi)發(fā)一個(gè)網(wǎng)絡(luò)協(xié)議通過(guò)Ndis API獲得所有的網(wǎng)絡(luò)數(shù)據(jù),但是不能夠攔截網(wǎng)絡(luò)數(shù)據(jù),因?yàn)槠渌麉f(xié)議驅(qū)動(dòng)也可以通過(guò)Nids API獲取數(shù)據(jù)。一個(gè)典型的應(yīng)用就是Winpcap了,使用NPF.SYS來(lái)捕獲網(wǎng)絡(luò)數(shù)據(jù),并且做好充分緩沖處理,防止大數(shù)據(jù)量到來(lái)時(shí)出現(xiàn)數(shù)據(jù)包丟失的情況。詳情情節(jié)winpcap的開(kāi)源代碼。
具體的協(xié)議驅(qū)動(dòng)開(kāi)發(fā)過(guò)程,我就不細(xì)述了,大家可以參看Ndisuio和DDK doc,我推薦boywhp的一篇文檔《NDIS協(xié)議驅(qū)動(dòng)開(kāi)發(fā)》給大家。
4. NDIS,Network Driver Interface Specification,網(wǎng)絡(luò)協(xié)議接口標(biāo)準(zhǔn)。從圖中我們可以看到包裹在其中的兩個(gè)驅(qū)動(dòng)程序,一個(gè)是NDIS intermediate driver,NDIS中間層驅(qū)動(dòng)程序,另一個(gè)是NDIS minport driver,小端口驅(qū)動(dòng)程序。下面簡(jiǎn)單介紹一下這兩個(gè)驅(qū)動(dòng)程序:
a) Ndis intermediate driver,NDIS中間層驅(qū)動(dòng)程序,對(duì)于上層的protocol driver它充當(dāng)minport driver的作用,對(duì)于下層的minport driver它充當(dāng)一個(gè)protocol driver的作用,所以在驅(qū)動(dòng)程序DriverEntry中就注冊(cè)NDIS_PROTOCOL_CHARACTERISTICS和NDIS_MINIPORT_CHARACTERISTICS,使用protocol characteristics中NDIS API從miniport driver那里取得數(shù)據(jù)包,再用miniport characteristics的NDIS API向上層的protocol driver發(fā)送數(shù)據(jù)包。Nids intermediate driver最大的優(yōu)勢(shì)就是所有miniport driver的數(shù)據(jù)包都要通過(guò)它這里倒手給protocol driver,所以網(wǎng)絡(luò)防火墻就看上了這塊風(fēng)水寶地。現(xiàn)在很多網(wǎng)絡(luò)防火墻都使用NDIS intermediate driver做數(shù)據(jù)包的過(guò)濾和攔截工作,過(guò)濾的規(guī)則設(shè)置到MPSendPackets,PTReceive,PTReceiveRacket這三個(gè)函數(shù)。具體開(kāi)發(fā)過(guò)程請(qǐng)大家參考DDK提供的PassThru源代碼,www.ndis.com, 網(wǎng)上有很多相關(guān)的資料。
NDIS 6.0之后,filter driver就取代了Ndis intermediate driver,WDK中提供源碼。
b) Ndis miniport driver一般是由設(shè)備廠商提供的,在DDK中也提供了miniport driver的一個(gè)例子e100bex,支持Intel EtherExpressTM PRO/100+ Ethernet PCI adapter 和Intel EtherExpressTM PRO/100B PCI adapter兩款網(wǎng)絡(luò)適配器。
5. 最后介紹一下總線,計(jì)算機(jī)總線有好幾種,USB總線、ISA總線、PCI總線、虛擬總線等,一般都是以PCI總線作為根總線,在Windows系統(tǒng)中其他的總線可以理解為PCI總線上的一個(gè)設(shè)備。PCI總線作為根總線,其傳輸速度較高,可以達(dá)到133MB/S,顯卡和網(wǎng)卡很多都是用PCI插槽。
PCI-ISA橋設(shè)備,也稱為南橋,實(shí)現(xiàn)了ISA總線與PCI總線的橋接, 南橋還包括終端、IDE、USB、DMA等控制器設(shè)備。其中USB-HOST設(shè)備實(shí)現(xiàn)了USB總線和PCI總線的橋接。HOST/PCI橋稱為北橋,是主處理器中心啊到基礎(chǔ)PCI局部總線。南橋和北橋組成了主板的芯片組,通過(guò)芯片的擴(kuò)展實(shí)現(xiàn)了多種總線與基礎(chǔ)PCI局部總線的橋接。
總線驅(qū)動(dòng)程序和PNP管理器實(shí)現(xiàn)了即插即用的功能,物理設(shè)備對(duì)象PDO就是由總線驅(qū)動(dòng)程序產(chǎn)生的。
posted on 2011-02-22 14:48
shaker(太子) 閱讀(1165)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C++