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