了解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系統方法,讓從來沒有裝過系統的使用者也可以輕鬆給自己的電腦重灌系統了。開啟軟體後我們可...