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

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