Windows網路體繫結構總結(轉自看雪,作者:jbwang)

來源:互聯網
上載者:User

標 題: 【原創】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,所以網路防火牆就看上了這塊風水寶地。現在很多網路防火牆都使用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就是由匯流排驅動程式產生的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.