對Windows TCP/IP協(xié)議棧的一種簡化設(shè)計
摘要:為了讓Windows下的網(wǎng)絡(luò)數(shù)據(jù)快速發(fā)送與接收,提高實時性能,采用對Windows TCP/IP協(xié)議棧進行一種簡化設(shè)計,通過利用Windows提供的用戶與設(shè)備對象的交互,減少Windows從用戶態(tài)到內(nèi)核態(tài)的分層,對Socket層進行簡單的封裝,并且利用零拷貝技術(shù)減少數(shù)據(jù)的拷貝次數(shù)以及設(shè)置多級優(yōu)先級隊列使數(shù)據(jù)按照優(yōu)先級發(fā)送,從而使數(shù)據(jù)達到快速發(fā)送和接收的目的。實驗結(jié)果驗證了這種方法能達到預(yù)期效果。
本文引用地址:http://m.butianyuan.cn/article/154883.htm關(guān)鍵詞:網(wǎng)絡(luò)體系結(jié)構(gòu);協(xié)議驅(qū)動;TCP/IP;零拷貝;優(yōu)先級隊列
隨著現(xiàn)代信息技術(shù)的進一步發(fā)展,對信息傳遞的速度及對大信息量的傳輸都有進一步需求,在這樣的情況下,無論是對于硬件要求還是軟件方面的要求都在提升。而在相同的硬件條件下,如何提高通信的速度、實時性能,軟件的優(yōu)劣在很大程度上影響著這些方面。由于Windo ws的廣泛使用和其方便完善的網(wǎng)絡(luò)結(jié)構(gòu)的支持,針對Windows的網(wǎng)絡(luò)開發(fā)不斷增加,然而由于Windows系統(tǒng)為了包容多種協(xié)議以及Windows分層驅(qū)動的特點,導(dǎo)致數(shù)據(jù)從用戶應(yīng)用程序到網(wǎng)卡經(jīng)過的驅(qū)動層數(shù)很多,勢必導(dǎo)致數(shù)據(jù)的延遲增加,這對那些要求通信實時性能較高的系統(tǒng)來說是無法容忍的。所以研究Windows網(wǎng)絡(luò)體系架構(gòu),對TCP/IP協(xié)議棧進行優(yōu)化,使之適合于對于特定要求的系統(tǒng),有很重要的研究意義和價值。
1 Windows網(wǎng)絡(luò)的多層結(jié)構(gòu)
如圖1所示,標準的Windows網(wǎng)絡(luò)體系結(jié)構(gòu)的最底層是網(wǎng)卡,網(wǎng)卡通過NDIS與網(wǎng)卡(NIC)驅(qū)動程序通信,網(wǎng)卡驅(qū)動程序又通過NDIS與協(xié)議驅(qū)動程序通信。在NIC驅(qū)動程序和協(xié)議驅(qū)動程序之間還可以插進去一個中間驅(qū)動程序。在協(xié)議驅(qū)動程序的上邊,是內(nèi)核模式TDI客戶驅(qū)動程序,通過TDI接口同協(xié)議驅(qū)動程序交互。再往上,則是用戶模式的動態(tài)連接庫(提供WIN32 NETAPI)及網(wǎng)絡(luò)應(yīng)用程序。
從圖1中可以看出,用戶層編寫網(wǎng)絡(luò)程序與其他主機進行通信,發(fā)送數(shù)據(jù)需要經(jīng)過Sockets接口,TDI客戶,TDI傳輸驅(qū)動接口,MDIS協(xié)議驅(qū)動(TCP/IP協(xié)議棧),NIC驅(qū)動程序,網(wǎng)卡,可以看出數(shù)據(jù)從用戶提交給網(wǎng)卡的分層很多,Windows操作系統(tǒng)利用這種分層設(shè)計的方法,有諸多好處,開發(fā)人員可以只關(guān)注整個結(jié)構(gòu)中的某一層;分層可以降低層與層之間的依賴,既可以良好地保證未來的可擴展,在復(fù)用性上也是很好的優(yōu)勢。但是分層結(jié)構(gòu)也不可避免具有一些缺陷,一方面,分層過多會導(dǎo)致系統(tǒng)性能的下降,因為不采用分層結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫,以此獲取相應(yīng)的數(shù)據(jù),如今卻必須通過中間層來完成,其中需要處理數(shù)據(jù)通過各層的信息等操作,這些都降低了系統(tǒng)性能;另一方面是數(shù)據(jù)的拷貝次數(shù)增多,數(shù)據(jù)拷貝操作不單需要占用CPU時間片,同時也需要占用額外的內(nèi)存帶寬,這就增加了系統(tǒng)開銷。這些消耗都會造成數(shù)據(jù)的時間延遲增加,這對于那些對實時性能有特別要求的而又需要利用Windows平臺的系統(tǒng)來說,這是很難容忍的。
2 對Windows TCP/IP協(xié)議棧的簡化設(shè)計
由于Windows網(wǎng)絡(luò)結(jié)構(gòu)分層較多,導(dǎo)致系統(tǒng)性能下降,網(wǎng)絡(luò)數(shù)據(jù)的實時性能得不到體現(xiàn),一種策略是簡化現(xiàn)今Windows TCP/IP協(xié)議棧,減少分層;另一方面,利用零拷貝技術(shù)減少拷貝次數(shù),減少系統(tǒng)性能消耗;可以采用多級優(yōu)先級隊列,讓優(yōu)先級較高的數(shù)據(jù)比優(yōu)先級低的數(shù)據(jù)優(yōu)先發(fā)送的基本策略,采用適當?shù)恼{(diào)度算法進行處理。通過這幾個方面的改進,可以一定程度上彌補Windows系統(tǒng)網(wǎng)絡(luò)通信延遲較大的缺陷。
如圖2所示,第1層為用戶應(yīng)用層;第2層是協(xié)議驅(qū)動,里面包括簡化了的TCP/IP協(xié)議棧,只保留TCP,UDP,ARP,ICMP協(xié)議,并且對Wind ows中的AFD驅(qū)動模塊簡化,一些數(shù)據(jù)結(jié)構(gòu)等就存放在設(shè)備擴展中;第3層是網(wǎng)卡驅(qū)動,第4層就是具體收發(fā)數(shù)據(jù)的網(wǎng)卡。在這幾層里面第2層是最關(guān)鍵的部分,下面就具體如何設(shè)計進行比較詳細的介紹。
2.1 采用零拷貝技術(shù)
簡單一點來說.零拷貝就是一種避免CPU將數(shù)據(jù)從一塊存儲拷貝到另外一塊存儲的技術(shù)。零拷貝技術(shù)可以減少數(shù)據(jù)拷貝和共享總線操作的次數(shù),消除傳輸數(shù)據(jù)在存儲器之間不必要的中間拷貝次數(shù),從而有效地提高數(shù)據(jù)傳輸效率。而且,零拷貝技術(shù)減少了用戶應(yīng)用程序地址空間和操作系統(tǒng)內(nèi)核地址空間之間因為上下文切換而帶來的開銷。在本文中對于TCP/IP協(xié)議棧,采用零拷貝技術(shù),避免操作系統(tǒng)內(nèi)核緩沖區(qū)之間進行數(shù)據(jù)拷貝操作,可以大大提高系統(tǒng)性能。
在接收發(fā)送數(shù)據(jù)時,用NDIS中的NDIS_PACKET包描述符,包描述符中包含了數(shù)據(jù)包的總長度,指向第一個緩沖描述符NDIS_BUFFER的指針,緩沖描述符NDIS_BUFFER里面的Start Virtual Address才是指向真正的數(shù)據(jù)所在的首地址以及包含了此緩沖中的數(shù)據(jù)長度。利用這個NDIS_PACKET包描述符,可以實現(xiàn)無需對數(shù)據(jù)進行拷貝,只要獲得包描述符即可。
當用戶數(shù)據(jù)提交給內(nèi)核緩沖區(qū)時,采用直接I/O的方式,在內(nèi)核中需要分配一個包首部的大小,用于TCP/IP協(xié)議層加上各層的首部,并且把該首部地址以及用戶緩沖區(qū)地址用NDIS_PACKET包描述符封裝。當發(fā)包線程把NDIS_PACKET包提交給協(xié)議棧處理時,不需要把包描述符中的數(shù)據(jù)拷貝到新的緩沖區(qū)中,可以直接利用NDIS提供的函數(shù)得到數(shù)據(jù)的首地址,以及數(shù)據(jù)包的總長度等。在協(xié)議棧中添加上各層首部以及其他操作后,就可以調(diào)用發(fā)包函數(shù)把NDIS_PACKET包描述符提交給網(wǎng)卡驅(qū)動,網(wǎng)卡驅(qū)動通過DMA把數(shù)據(jù)傳送到網(wǎng)卡環(huán)形緩沖區(qū)中,再由網(wǎng)卡發(fā)送出去。
反之,在收包時,網(wǎng)卡通過DMA把數(shù)據(jù)傳輸?shù)絻?nèi)核緩沖區(qū)中,網(wǎng)卡驅(qū)動程序中依然用包描述符來指明數(shù)據(jù)的地址,大小等信息。在收包處理線程中,對數(shù)據(jù)包的拆包等操作,同樣的不需要拷貝到新的緩沖區(qū)中,利用包描述符提供的包地址,大小等信息進行處理即可。
tcp/ip相關(guān)文章:tcp/ip是什么
評論