WIN7系統核心網路堆疊實現簡述

2021-07-10 16:13:15 字數 3075 閱讀 6155

了解windows平台內部網路堆疊實現架構,對於我們開發 ndis驅動,tdi驅動,wsk驅動,wfp驅動等網路驅動更有幫助。

因為windows並不是開源系統,不像linux那樣可以從源**中詳細了解網路堆疊的實現流程,

所以只能從msdn文件,wdk驅動開發包的例項**,以及網路上零碎的資料來做個大致的了解。

我們從底層往上層一直到使用者層了解win7的網路堆疊流程。

最底層的是ndis驅動結構,這個是跟網絡卡相關的介面規範,ndis介面規範是比較優秀的,

至少比linux在這方面做得好,因為想在linux中做個攔截鏈路層資料報的驅動,都找不到乙個通用的介面**。

ndis又分為三層,最底層的是微埠驅動,是直接操作物理網絡卡的驅動,由她來管理物理網絡卡從物理網路上收發資料報,

第二層是ndis中間驅動。他的功能比較神奇,既可以攔截資料報,又可以實現復合網絡卡等功能。

他朝下提供的是協議驅動介面,朝上提供的是微埠驅動介面,所以他是把最底層和最上層的結合到一塊了。

ndis最上一次是協議驅動。這一層的所有的協議驅動,都是平等級的,平等的獲取來自各個網絡卡的各種資料報,

然後分析處理自己感興趣的資料報。比如 tcpip.sys 就是windows裡最著名的協議驅動。

ndis的三層模式從最早的windows版本到最新版本,都是相容的。

從win7以後,又出現了 ndis filter,這個是屬於ndis第2層,就是中間驅動那一層,

如果我們只是過濾資料報,按照原來的中間驅動做法,既要開發乙個微埠又要開發乙個協議驅動,非常麻煩,

所以ndis filter結合了兩者,極大的簡化了我們開發ndis過濾驅動的複雜度。

ndis 從上而下:

ndis 協議驅動(實現各種協議驅動,分析處理自己感興趣的資料報,比如tcpip.sys處理ip包)

|ndis 中間驅動( win7之後出現新的 ndis filter)

|ndis微埠驅動(物理網絡卡)

我們接著往上走,來到 tcpip.sys協議驅動裡,tcpip.sys實現 ip包的處理,

按照tcpip層次結構,他分層為 網路層(ip層)和傳輸層(tcp/udp層),都在這個驅動裡實現,

至於 對ip包的分析以及tcp的組合重傳等演算法本來就複雜,但是也是通用的,我們可以從開源系統裡找到tcpip堆疊的實現影子。

我們只說windows平台相關的,

在winxp以及以前的版本裡,tcpip.sys協議驅動只向上層提供了 tdi介面 ,簡單說就是tcpip.sys協議驅動建立一些標準裝置,

(\device\tcp 對應tcp協議, \device\udp 對應udp協議, \device\rawip 對應原始包, )

然後提供一些標準的 irp請求命令,當上層驅動開啟這些裝置,傳送irp標準請求,就可收發網路資料報。

對windows來說,就是把網路包的處理變成windows核心中標準 irp請求。

我們再開發標準的裝置過濾驅動程式,掛載到這些標準裝置棧上,攔截irp命令,就能實現網路資料報的攔截修改等功能,

這就是我們在tdi開發中經常做的事情,雖然思路簡單,但是這些irp命令被微軟搞得蠻囉嗦的,所以做來也就比較臃腫和囉嗦了。

至於 win7以後,tcpip.sys協議驅動向上提供的介面就非常豐富了,我們後面再描述。

再往上走,是afd.sys驅動,他負責管理網路套接字,比如每個套接字內部緩衝管理,埠管理等等。

最後那就是我們的應用層的套接字介面,比如我們在應用程式裡呼叫 socket( af_inet,sock_stream,0)  函式, 進入到 核心,

呼叫 afd.sys驅動裡的 afdcreate(函式名不一定正確),開啟 tdi介面 \device\tcp 裝置,朝這裝置傳送 irp_mj_create命令,

如果我們安裝了tdi過濾驅動,就能在過濾驅動裡抓取到這個命令,我們就可以攔截處理了。

從上而下:

socket(.. sock_stream)

|afdcreate     ( afd.sys驅動)

|ntcreatefile( 開啟 \device\tcp裝置,傳送 mj_create建立命令

|  --> (tdi filter 標準的裝置過濾驅動 )

tdi ( tcpip.sys實現的tdi介面做具體的處理)

再回到 win7以後的版本來,win7 在tcpip.sys上向上提供的介面非常的豐富,而此時tdi介面只是為了相容作為乙個附加元件被實現。

他提供 wsk(winsock kernel),就是核心態的套接字,這是以前版本沒有的,我們可以在核心態使用套接字就跟在應用層那樣使用。

比如我們要實現乙個極致高效的伺服器,在核心態就完成網路資料的處理,使用wsk就是最好的選擇。

這個概念,linux版本很早就應該有了,我估計windows是仿照 linux的思路。

他提供wfp(windows filter platform),主要是過濾使用的,他同 ndis filter不一樣的,他們位置都不一樣,

wfp只是在 tcpip.sys 的ndis協議層驅動裡,向上層驅動提供資料報時候,所做的是更高層的過濾, 

ndis filter是 ndis中間驅動位置,更為底層和徹底的包過濾。

wfp像極了 linux系統裡 的netfilter, 估計也是仿照linux思路開發的,但是 netfilter更簡單。

netfilter只工作在ip層,只能filter 住 ip層的資料報,

而wfp分得更加細緻,他能 filter網路層(ip層)的包,也能filter傳輸層(tcp層)的包,還能filter 更上層的包。

最後看看 作為相容 tdi 是如何被tcpip.sys載入的, 我們在 win7以後的版本,能找到 乙個叫 tdx.sys 的驅動,

他就是為了相容 tdi介面的驅動模組,

當我們 應用程式呼叫 socket ,進入到 afd.sys驅動,

afdcreate函式會檢查 /tcp/udp/rawip/tcp6/udp6/rawip6 等六個裝置是不是有我們的tdi過濾裝置驅動,

如果有的話,就進入到 winxp那樣的流程,

否則就直接進入到 tcpip.sys 驅動處理(估計這時就直接呼叫wsk介面)。

以上就是粗淺的理解,大致流程是沒什麼問題,可能有些細節地方會有差錯,不吝指教!

win7 共享網路

window7 建立無線共享 網上搜尋很多,也弄過幾次,但都不算太詳細,自己寫個 以備後用 一步 現在電腦網絡卡一般都應該能支援 承載網路,所以直接進入 下一步 敲入命令,記得管理員執行cmd.exe netsh wlan set hostednetwork mode allow ssid 無線網路...

再見Win7 記錄Win7系統的安裝

本人從事機器視覺開發,一直用win7系統。近日買了個膝上型電腦,惠普的暗夜精靈3plus,早聽說這個電腦不支援win7,但是我不信邪,偏要試試。從早上10點,收到電腦,到下午6點,各種嘗試,各種搜尋,最終得出乙個結論,真的不行。安裝不了win7.文章的附圖就是最後的狀態了,雖然能裝上,但是進系統就藍...

怎麼重灌Win7系統?Win7系統重灌教程

重灌win7系統對於自己動手操作的使用者來說可能是很簡單的事情,但是對於從來沒有動手操作的使用者來說重灌系統是很頭疼的事情,那麼要怎麼重灌win7系統呢?下面易捷一鍵重灌系統網小編就教大家一種超級簡單的重灌win7系統方法,讓從來沒有裝過系統的使用者也可以輕鬆給自己的電腦重灌系統了。開啟軟體後我們可...