一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的方法及裝置制造方法
【專利摘要】本發(fā)明提供了一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的方法及裝置;所述方法包括:接收應(yīng)用程序發(fā)送給協(xié)議棧的單鏈表形式的第一數(shù)據(jù);將所述第一數(shù)據(jù)中各數(shù)據(jù)塊按照單鏈表的順序依次映射到傳輸控制協(xié)議TCP段中,在一個TCP段中映射的數(shù)據(jù)塊的長度小于或等于預(yù)定長度;所述映射是指將表示所述數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的信息寫入所述TCP段;將映射得到的TCP段依次加入發(fā)送隊列。本發(fā)明能夠在協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的過程中避免復(fù)制,提高處理性能。
【專利說明】一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及網(wǎng)絡(luò)領(lǐng)域,尤其涉及一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的方法及裝置。
【背景技術(shù)】
[0002]目前比較常用的專用協(xié)議棧大致分為兩種,一種是以Iinux或者FreeBSD標(biāo)準(zhǔn)協(xié)議棧為基礎(chǔ)的商用專有協(xié)議棧,另一種是遵守TCP協(xié)議棧標(biāo)準(zhǔn),按照某種系統(tǒng)框架進(jìn)行修改而得出的開源的輕量級協(xié)議棧,最常見的能夠移植商用的就是LWIP協(xié)議棧。其他的協(xié)議棧類似OpenTCP這些開源的協(xié)議棧大多適用于理論研究以及協(xié)議棧教學(xué)使用,其實現(xiàn)雖然提出一些比較實用的技術(shù)和概念,但缺乏一些具體實現(xiàn)方案,商業(yè)化難度較大。
[0003]傳統(tǒng)TCP協(xié)議棧在接收和發(fā)送數(shù)據(jù)的時候至少存在有三次數(shù)據(jù)內(nèi)存復(fù)制,報文從網(wǎng)卡接收到內(nèi)核空間需要一次復(fù)制,內(nèi)核空間傳遞到用戶空間需要一次復(fù)制,從用戶空間把數(shù)據(jù)交給應(yīng)用程序需要一次復(fù)制;發(fā)送的過程與之類似?,F(xiàn)有各種協(xié)議?;径际强紤]到兼容各種不同的應(yīng)用程序,因此協(xié)議棧中的一些內(nèi)存復(fù)制操作其實是不可避免的,而內(nèi)存復(fù)制是會造成一定的性能下降的。
[0004]目前LWIP協(xié)議棧由于其資源消耗小,處理流程實現(xiàn)簡潔而被廣泛使用在嵌入式的數(shù)據(jù)處理終端上,例如圖像采集終端,可視化監(jiān)控終端設(shè)備上。
[0005]LffIP協(xié)議棧使用mbuf(存儲器緩存)作為接收和發(fā)送數(shù)據(jù)的數(shù)據(jù)載體來傳遞數(shù)據(jù),雖然避免了從內(nèi)核空間傳遞到用戶空間這一次復(fù)制,但是仍然沒有能夠避免另外兩次復(fù)制的發(fā)生。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的技術(shù)解決問題是如何在協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的過程中避免復(fù)制,提聞處理性能。
[0007]為了解決上述問題,本發(fā)明提供了一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的方法,包括:
[0008]S101、接收應(yīng)用程序發(fā)送給協(xié)議棧的單鏈表形式的第一數(shù)據(jù);
[0009]S102、將所述第一數(shù)據(jù)中各數(shù)據(jù)塊按照單鏈表的順序依次映射到傳輸控制協(xié)議TCP段中,在一個TCP段中映射的數(shù)據(jù)塊的長度小于或等于預(yù)定長度;所述映射是指將表示所述數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的信息寫入所述TCP段;將映射得到的TCP段依次加入發(fā)送隊列。
[0010]可選地,所述步驟S102包括:
[0011]S201、當(dāng)接收到所述第一數(shù)據(jù)后,創(chuàng)建TCP段作為當(dāng)前TCP段;
[0012]S202、將所述第一數(shù)據(jù)中未映射完成的數(shù)據(jù)塊按照所述單鏈表的順序依次映射到所述當(dāng)前TCP段中,當(dāng)映射到所述當(dāng)前TCP段中的數(shù)據(jù)塊的數(shù)據(jù)長度達(dá)到預(yù)定長度或所述第一數(shù)據(jù)已全部映射完成時進(jìn)行步驟S203 ;[0013]S203、將所述當(dāng)前TCP段加入發(fā)送隊列的末尾;
[0014]S204、判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則進(jìn)行步驟S205 ;
[0015]S205、創(chuàng)建新的TCP段,將新創(chuàng)建的TCP段的地址記錄在所述當(dāng)前TCP段中;將新創(chuàng)建的TCP段作為當(dāng)前TCP段,返回步驟S202。
[0016]可選地,所述步驟S202包括:
[0017]S202A、在當(dāng)前TCP段中創(chuàng)建分片,所述分片包括數(shù)據(jù)首地址和數(shù)據(jù)長度;創(chuàng)建分片后根據(jù)所述單鏈表的順序,查找所述第一數(shù)據(jù)中第一個未映射完的數(shù)據(jù)塊;將所查找到的數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)在發(fā)送緩沖區(qū)的起始地址寫入所創(chuàng)建的分片的數(shù)據(jù)首地址;
[0018]S202B、比較該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度與當(dāng)前TCP段的剩余長度;所述剩余長度為所述預(yù)定長度與所述當(dāng)前TCP段中已映射的數(shù)據(jù)塊的總長度之差;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度小于所述剩余長度,則進(jìn)行步驟S202C ;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度等于所述剩余長度,則將數(shù)據(jù)塊的長度或所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,進(jìn)行步驟S203 ;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度大于所述剩余長度,則將所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,進(jìn)行步驟S203 ;
[0019]S202C、將數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度;判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則返回步驟S202A。
[0020]可選地,所述TCP段各包括一個用于描述本TCP段的結(jié)構(gòu)體tcp_Seg ;所述tcp_seg包含本TCP段中所映射的數(shù)據(jù)塊的數(shù)據(jù)總長度,其值等于該TCP段中所有分片的數(shù)據(jù)長度的總和;所述tcp_seg還包含本TCP段中第一個分片的地址;
[0021]所述將新創(chuàng)建的TCP段的地址記錄在當(dāng)前TCP段中的步驟包括:
[0022]將新創(chuàng)建的TCP段的tcp_seg的地址記錄在當(dāng)前TCP段的tcp_seg中;
[0023]所述分片還包括本TCP段中前一個和下一個分片的地址。
[0024]可選地,所述的方法還包括:
[0025]當(dāng)協(xié)議棧收到包含數(shù)據(jù)的報文且連接處于已建立狀態(tài)時,將接收到的報文控制塊加入接收鏈表的末尾,將接收到的報文控制塊中表示數(shù)據(jù)起始位置的指針設(shè)置為該報文控制塊在接收數(shù)據(jù)緩沖區(qū)中的起始地址。
[0026]本發(fā)明還提供了一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的裝置,包括:
[0027]發(fā)送數(shù)據(jù)接口模塊,用于接收應(yīng)用程序發(fā)送給協(xié)議棧的單鏈表形式的第一數(shù)據(jù);
[0028]映射模塊,用于將所述第一數(shù)據(jù)中各數(shù)據(jù)塊按照單鏈表的順序依次映射到TCP段中,在一個TCP段中映射的數(shù)據(jù)塊的長度小于或等于預(yù)定長度;所述映射是指將表示所述數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的信息寫入所述TCP段;將映射得到的TCP段依次加入發(fā)送隊列。
[0029]可選地,所述映射模塊包括:
[0030]映射控制單元、映射執(zhí)行單元、發(fā)送控制單元;
[0031]所述映射控制單元用于當(dāng)接收到所述第一數(shù)據(jù)后,創(chuàng)建TCP段作為當(dāng)前TCP段發(fā)送給所述映射執(zhí)行單元;
[0032]所述映射執(zhí)行單元用于將所述第一數(shù)據(jù)中未映射完成的數(shù)據(jù)塊按照單鏈表的順序依次映射到所述當(dāng)前TCP段中,當(dāng)映射到所述當(dāng)前TCP段中的數(shù)據(jù)塊的數(shù)據(jù)長度達(dá)到預(yù)定長度或所述第一數(shù)據(jù)已全部映射完成時通知所述發(fā)送控制單元;
[0033]所述發(fā)送控制單元用于將所述當(dāng)前TCP段加入發(fā)送隊列的末尾,然后通知所述映射控制單兀;
[0034]所述映射控制單元還用于當(dāng)收到所述發(fā)送控制單元的通知后,判斷所述第一數(shù)據(jù)中是否存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則創(chuàng)建新的TCP段,將新創(chuàng)建的TCP段的地址記錄在所述當(dāng)前TCP段中;將新創(chuàng)建的TCP段作為當(dāng)前TCP段,發(fā)送給所述映射執(zhí)行單元。
[0035]可選地,所述映射執(zhí)行單元包括:
[0036]分片子單元,用于在當(dāng)前TCP段中創(chuàng)建分片,所述分片包括數(shù)據(jù)首地址和數(shù)據(jù)長度;還用于創(chuàng)建分片后根據(jù)所述單鏈表的順序,查找所述第一數(shù)據(jù)中第一個未映射完的數(shù)據(jù)塊;將所查找到的數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)在發(fā)送緩沖區(qū)的起始地址寫入所創(chuàng)建的分片的數(shù)據(jù)首地址;
[0037]比較子單元,用于比較該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度與當(dāng)前TCP段的剩余長度;所述剩余長度為所述預(yù)定長度與所述當(dāng)前TCP段中已映射的數(shù)據(jù)塊的總長度之差;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度小于所述剩余長度,則通知所述分片子單元;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度等于所述剩余長度,則指示所述分片子單元將數(shù)據(jù)塊的長度或所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,通知所述發(fā)送控制模塊;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度大于所述剩余長度,則指示所述分片子單元將所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,通知所述發(fā)送控制模塊;
[0038]所述分片子單元還用于當(dāng)收到所述比較子單元的通知后將數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度;判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則結(jié)束;如果存在則創(chuàng)建分片。
[0039]可選地,所述映射控制單元所創(chuàng)建的TCP段各包括一個用于描述本TCP段的結(jié)構(gòu)體tcp_seg ;所述tcp_seg包含本TCP段中所映射的數(shù)據(jù)塊的數(shù)據(jù)總長度,其值等于該TCP段中所有分片的數(shù)據(jù)長度的總和;所述tcp_Seg還包含本TCP段中第一個分片的地址;
[0040]所述映射控制單元將新創(chuàng)建的TCP段的地址記錄在當(dāng)前TCP段中是指將該新創(chuàng)建的TCP段的tcp_seg的地址記錄在當(dāng)前TCP段的tcp_seg中;
[0041]所述分片還包括本TCP段中前一個和下一個分片的地址。
[0042]可選地,所述的裝置還包括:
[0043]接收數(shù)據(jù)接口模塊,用于當(dāng)協(xié)議棧收到包含數(shù)據(jù)的報文且連接處于已建立狀態(tài)時,將接收到的報文控制塊加入接收鏈表的末尾,將接收到的報文控制塊中表示數(shù)據(jù)起始位置的指針設(shè)置為該報文控制塊在接收數(shù)據(jù)緩沖區(qū)中的起始地址。
[0044]本發(fā)明的至少一個實施例通過在專有協(xié)議棧中使用單鏈表對數(shù)據(jù)進(jìn)行傳輸,避免了低效的內(nèi)存復(fù)制,可以提高系統(tǒng)整體的處理性能,適用于處理基于協(xié)議棧的數(shù)據(jù)傳輸,要求系統(tǒng)處理性能比較高的網(wǎng)絡(luò)應(yīng)用系統(tǒng)。本發(fā)明的一個優(yōu)化方案使用單鏈表結(jié)構(gòu)向應(yīng)用程序傳遞數(shù)據(jù),通過把驅(qū)動收到的報文直接傳遞給應(yīng)用程序從而避免了數(shù)據(jù)在協(xié)議棧中的復(fù)制。本發(fā)明的又一個優(yōu)化方案使用共享的接收/發(fā)送數(shù)據(jù)緩沖區(qū)傳遞數(shù)據(jù),避免了數(shù)據(jù)接收和發(fā)送時在應(yīng)用程序和協(xié)議棧之間的內(nèi)存復(fù)制操作。【專利附圖】
【附圖說明】
[0045]圖1為實施例一中發(fā)送隊列的鏈表形式的不意圖;
[0046]圖2為實施例一的具體例子中發(fā)送隊列的示意圖;
[0047]圖3為實施例一的具體例子中發(fā)送的流程示意圖;
[0048]圖4為實施例一的具體例子中接收鏈表的示意圖;
[0049]圖5為實施例一的具體例子中接收的流程示意圖。
【具體實施方式】
[0050]下面將結(jié)合附圖及實施例對本發(fā)明的技術(shù)方案進(jìn)行更詳細(xì)的說明。
[0051]需要說明的是,如果不沖突,本發(fā)明實施例以及實施例中的各個特征可以相互結(jié)合,均在本發(fā)明的保護范圍之內(nèi)。另外,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
[0052]實施例一、一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的方法,包括:
[0053]S101、接收應(yīng)用程序發(fā)送給協(xié)議棧的單鏈表形式的第一數(shù)據(jù);
[0054]S102、將所述第一數(shù)據(jù)中各數(shù)據(jù)塊按照單鏈表的順序依次映射到TCP段中,在一個TCP段中映射的數(shù)據(jù)塊的長度小于或等于預(yù)定長度;所述映射是指將表示所述數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的信息寫入所述TCP段;將映射得到的TCP段依次加入發(fā)送隊列。
[0055]本實施例中,所述第一數(shù)據(jù)是以單鏈表形式存儲的,可以將該單鏈表中每個節(jié)點視為所述第一數(shù)據(jù)中一個數(shù)據(jù)塊,各節(jié)點分別包括用于存儲數(shù)據(jù)的區(qū)域,以及用于指示下一個節(jié)點在發(fā)送數(shù)據(jù)緩沖區(qū)中的起始地址的指針。
[0056]本實施例中,所述協(xié)議??梢缘幌抻跒門CP協(xié)議棧或其它遵守TCP協(xié)議棧標(biāo)準(zhǔn)開發(fā)的協(xié)議棧。
[0057]本實施例中,發(fā)送數(shù)據(jù)的時候,應(yīng)用程序直接以單鏈表的形式將待發(fā)送的第一數(shù)據(jù)交給協(xié)議棧,然后發(fā)送給IP層。協(xié)議棧僅接受以鏈表形式發(fā)送的數(shù)據(jù),本實施例中是將應(yīng)用程序傳遞給協(xié)議棧的鏈表根據(jù)預(yù)定長度(可以但不限于為TCP連接的最大段長度)重新分割為適當(dāng)?shù)腡CP段,形成一個新的邏輯數(shù)據(jù)鏈表(即所述發(fā)送隊列),提交給驅(qū)動層進(jìn)行發(fā)送,以此避免了數(shù)據(jù)發(fā)送時產(chǎn)生的內(nèi)存復(fù)制。所述TCP段是所述協(xié)議棧處理數(shù)據(jù)收發(fā)的最小單位,每個TCP段最大可以包含TCP最大段長度(即所述預(yù)定長度)指定的數(shù)據(jù)長度。
[0058]由于專用協(xié)議棧的適用場景一般都是對專門的應(yīng)用場景而進(jìn)行設(shè)計的,換言之其上層的應(yīng)用處理流程相對是固定不變的,而且專用協(xié)議棧一般都是為了最大限度的滿足應(yīng)用場景的需要而使用的,因此在對處理性能有很高要求的應(yīng)用系統(tǒng)中,一個能夠不進(jìn)行內(nèi)存復(fù)制的協(xié)議棧實現(xiàn)是很有價值的。
[0059]本實施例的一種實施方式中,所述步驟S102具體可以包括:
[0060]S201、當(dāng)接收到所述第一數(shù)據(jù)后,創(chuàng)建TCP段作為當(dāng)前TCP段;
[0061]S202、將所述第一數(shù)據(jù)中未映射完成的數(shù)據(jù)塊按照所述單鏈表的順序依次映射到所述當(dāng)前TCP段中,當(dāng)映射到所述當(dāng)前TCP段中的數(shù)據(jù)塊的數(shù)據(jù)長度達(dá)到預(yù)定長度或所述第一數(shù)據(jù)已全部映射完成時進(jìn)行步驟S203 ;[0062]S203、將所述當(dāng)前TCP段加入發(fā)送隊列的末尾;
[0063]S204、判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則進(jìn)行步驟S205 ;
[0064]S205、創(chuàng)建新的TCP段,將新創(chuàng)建的TCP段的地址記錄在所述當(dāng)前TCP段中;將新創(chuàng)建的TCP段作為當(dāng)前TCP段,返回步驟S202。
[0065]該實施方式中,所述步驟S202具體可以包括:
[0066]S202A、在當(dāng)前TCP段中創(chuàng)建分片,所述分片包括數(shù)據(jù)首地址和數(shù)據(jù)長度;創(chuàng)建分片后根據(jù)所述單鏈表的順序,查找所述第一數(shù)據(jù)中第一個未映射完的數(shù)據(jù)塊;將所查找到的數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)在發(fā)送緩沖區(qū)的起始地址寫入所創(chuàng)建的分片的數(shù)據(jù)首地址;[0067]S202B、比較該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度與當(dāng)前TCP段的剩余長度;所述剩余長度為所述預(yù)定長度與所述當(dāng)前TCP段中已映射的數(shù)據(jù)塊的總長度之差;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度小于所述剩余長度,則進(jìn)行步驟S202C ;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度等于所述剩余長度,則將數(shù)據(jù)塊的長度或所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,進(jìn)行步驟S203 ;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度大于所述剩余長度,則將所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,進(jìn)行步驟S203 ;
[0068]S202C、將數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度;判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則返回步驟S202A。
[0069]本實施方式中,所述分片(slot)通過記錄兩個參數(shù):數(shù)據(jù)首地址和數(shù)據(jù)長度,來描述映射到TCP段中的數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中的起止位置;通常一個數(shù)據(jù)塊對應(yīng)于一個分片,分片的起始位置表示所對應(yīng)的數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中的起始地址,數(shù)據(jù)長度表示所對應(yīng)的數(shù)據(jù)塊所包含的數(shù)據(jù)的長度;但當(dāng)一個數(shù)據(jù)塊的長度大于所述剩余長度時,它將被映射到兩個TCP段的兩個分片中,第一個TCP段的分片的數(shù)據(jù)長度為所述剩余長度;第二個TCP段的分片中的數(shù)據(jù)長度則為該數(shù)據(jù)塊未映射完成的部分的長度(即該數(shù)據(jù)塊的原長度減去所述剩余長度),數(shù)據(jù)首地址為該數(shù)據(jù)塊未映射完成的部分在發(fā)送數(shù)據(jù)緩沖區(qū)中的起始地址。所述分片是用來為IP層和設(shè)備驅(qū)動程序提供足夠信息,以便可以把一個TCP段組成一個網(wǎng)絡(luò)報文進(jìn)行發(fā)送的。
[0070]本實施方式是用數(shù)據(jù)首地址加數(shù)據(jù)長度表示數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中的起止位置,在其它實施方式中,也可以采用數(shù)據(jù)首地址加數(shù)據(jù)末地址的方式、或數(shù)據(jù)末地址加數(shù)據(jù)長度的方式來表不。
[0071]本實施方式的一種備選方案中,所述TCP段各包括一個用于描述本TCP段的結(jié)構(gòu)
體tcp_seg,即tcp_seg和TCP段--對應(yīng),每個tcp_seg包含本TCP段中映射的數(shù)據(jù)塊的
數(shù)據(jù)總長度,其值等于該TCP段中所有分片的數(shù)據(jù)長度的總和,每個tcp_Seg還包含本TCP段中第一個slot的地址;
[0072]TCP段中的各slot除了數(shù)據(jù)首地址和數(shù)據(jù)長度之外,還包括本TCP段中前一個和下一個slot (如果存在的話)的地址。
[0073]本備選方案中,所述將新創(chuàng)建的TCP段的地址記錄在當(dāng)前TCP段中的步驟包括:
[0074]將新創(chuàng)建的TCP段的tcp_seg的地址記錄在當(dāng)前TCP段的tcp_seg中。
[0075]即,每個tcp_seg還包含了下一個TCP段(如果存在的話)的地址。[0076]這樣在本備選方案中,所形成的發(fā)送隊列可視為一個tcp_Seg組成的鏈表,每個tcp_seg中又包含一個slot的鏈表,如圖1所示;每個TCP段包括一個結(jié)構(gòu)體tcp_seg,以及一個或多個用于記錄所述第一數(shù)據(jù)中各數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的slot。
[0077]本備選方案中,發(fā)送隊列的一個具體的例子如圖2所示,假設(shè)所述預(yù)定長度為2048字節(jié),各slot22中的字段“prev”和“next”分別表示本TCP段中前一個和下一個slot的地址,各tcp_seg21中包括數(shù)據(jù)總長度、用于記錄下一個tcp_seg的地址的字段“seg”、以及用于記錄本TCP段中第一個slot地址的字段“slot”。
[0078]該備選方案中,一個具體的數(shù)據(jù)接收的例子如圖3所示,接收流程包括步驟S301 ?S309。
[0079]S301,開始寫入;初始化數(shù)據(jù)起始地址為需要發(fā)送的第一數(shù)據(jù)對應(yīng)的單鏈表中第一個數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中的起始地址,使用一個數(shù)據(jù)塊指針記錄當(dāng)前數(shù)據(jù)塊,并將其初始化為指向所述第一個數(shù)據(jù)塊,使用一個整型變量記錄當(dāng)前數(shù)據(jù)塊中已經(jīng)處理過的數(shù)據(jù)偏移量并初始化為O。
[0080]S302,查找發(fā)送隊列中最后一個未發(fā)送的TCP段。
[0081]S303,判斷查找到的TCP段是否還可添加數(shù)據(jù),當(dāng)映射到該TCP段的數(shù)據(jù)塊的數(shù)據(jù)總長度小于所述預(yù)定長度時,表示該TCP段可添加數(shù)據(jù),以該TCP段作為當(dāng)前TCP段,進(jìn)行步驟S305 ;如果不可添加數(shù)據(jù),則進(jìn)行步驟S304。
[0082]S304,創(chuàng)建TCP段作為當(dāng)前TCP段,生成當(dāng)前TCP段的tcp_Seg并進(jìn)行初始化,將當(dāng)前TCP段中已映射的數(shù)據(jù)塊的數(shù)據(jù)總長度設(shè)置為O。
[0083]S305,在當(dāng)前TCP段中創(chuàng)建分片。
[0084]S306,填寫所創(chuàng)建的分片,設(shè)置其數(shù)據(jù)首地址為所述數(shù)據(jù)起始地址,設(shè)置其數(shù)據(jù)長度為當(dāng)前數(shù)據(jù)塊的數(shù)據(jù)長度和所述剩余長度之間較小的一個(相等時任選其一)。
[0085]S307,更新所述數(shù)據(jù)起始地址為原數(shù)據(jù)起始地址加上該分片的數(shù)據(jù)長度,判斷當(dāng)前數(shù)據(jù)塊的數(shù)據(jù)長度是否大于所述剩余長度,如果大于則進(jìn)行步驟S308 ;如果不大于則進(jìn)行步驟S309。
[0086]S308,更新所述整型變量為原數(shù)據(jù)偏移量加上該分片的數(shù)據(jù)長度,以記錄當(dāng)前數(shù)據(jù)塊中已處理的數(shù)據(jù)的位置;當(dāng)前數(shù)據(jù)塊的數(shù)據(jù)長度更新為原始數(shù)據(jù)長度減去該分片的數(shù)據(jù)長度,返回步驟S304。
[0087]滿足這個分支的分片可以保證當(dāng)前數(shù)據(jù)塊內(nèi)的數(shù)據(jù)尚未處理完,并且此時TCP段長度等于所述預(yù)定長度。
[0088]S309,移動所述數(shù)據(jù)塊指針指向下一個數(shù)據(jù)塊,以下一個數(shù)據(jù)塊作為當(dāng)前數(shù)據(jù)塊。滿足這個分支的分片可以保證當(dāng)前數(shù)據(jù)塊內(nèi)的數(shù)據(jù)已經(jīng)處理完并且此時TCP段長度小于或等于所述預(yù)定長度。
[0089]S310,判斷數(shù)據(jù)塊是否映射完,如果數(shù)據(jù)塊已映射完則進(jìn)行步驟S312 ;如果沒映射完則進(jìn)行步驟311。
[0090]S311,更新tcp_seg中當(dāng)前TCP段中已映射的數(shù)據(jù)塊的數(shù)據(jù)總長度為原先的數(shù)據(jù)總長度加上所述分片的數(shù)據(jù)長度;判斷該數(shù)據(jù)總長度是否等于所述預(yù)定長度,如果等于則返回步驟S304 ;如果不等于則返回步驟S305。
[0091]S312,將上述操作生成的TCP段按照生成順序插入發(fā)送隊列。[0092]本實施例的一種實施方式中,所述方法還可以包括:
[0093]當(dāng)協(xié)議棧收到包含數(shù)據(jù)的報文且連接處于已建立狀態(tài)時,將接收到的報文控制塊加入接收鏈表的末尾,將接收到的報文控制塊中表示數(shù)據(jù)起始位置的指針設(shè)置為該報文控制塊在接收數(shù)據(jù)緩沖區(qū)中的起始地址;
[0094]當(dāng)應(yīng)用程序接收數(shù)據(jù)的時候,通過Socket API將所述接收鏈表全部取走,即可完成接收過程。
[0095]本實施方式中,接收鏈表如圖4所示,其中順序存放了所有接收到的報文控制塊23,假設(shè)各報文控制塊23的長度為2048字節(jié);將接收到的報文控制塊23加入接收鏈表的末尾,意味著接收鏈表中原末尾的報文控制塊23中用于指示下一節(jié)點地址的指針“next”會被設(shè)置為接收到的報文控制塊23的地址,而接收到的報文控制塊23中用于指示上一節(jié)點地址的指針“prev”則會被設(shè)置為所述原末尾的報文控制塊23的地址。其中,報文控制塊23的地址通常是指該報文控制塊23在接收數(shù)據(jù)緩沖區(qū)中的起始地址。
[0096]在數(shù)據(jù)接收過程中只有指針的賦值和對接收鏈表增加節(jié)點的操作,沒有進(jìn)行數(shù)據(jù)的復(fù)制操作,應(yīng)用程序通過報文控制塊可以找到數(shù)據(jù)的起始位置和數(shù)據(jù)長度,以便對數(shù)據(jù)進(jìn)行處理。本實施方式以接收鏈表為核心,由于接收到的報文控制塊中已經(jīng)包含數(shù)據(jù),因此可以通過在接收報文的時候直接將報文控制塊做成單鏈表,然后把這個單鏈表返回給應(yīng)用程序來避免接收數(shù)據(jù)時產(chǎn)生的內(nèi)存復(fù)制。
[0097]本實施方式中,包括數(shù)據(jù)接收(協(xié)議棧接收報文并發(fā)送給應(yīng)用程序)和數(shù)據(jù)發(fā)送(應(yīng)用程序通過協(xié)議棧發(fā)送數(shù)據(jù))兩個部分,應(yīng)用程序必須使用接收數(shù)據(jù)緩沖區(qū)或者發(fā)送數(shù)據(jù)緩沖區(qū)來存儲數(shù)據(jù),所述接收數(shù)據(jù)緩沖區(qū)和所述發(fā)送數(shù)據(jù)緩沖區(qū)分別是專門用于接收和發(fā)送報文的、可以被系統(tǒng)任何模塊訪問的共享內(nèi)存緩沖區(qū),由驅(qū)動程序維護,接收數(shù)據(jù)緩沖區(qū)和發(fā)送數(shù)據(jù)緩沖區(qū)之間可以相互轉(zhuǎn)換。
[0098]本實施方式中,一個具體的數(shù)據(jù)接收的例子如圖5所示,接收流程包括步驟S501 ?S509。
[0099]S501、協(xié)議棧接收報文。
[0100]S502、判斷報文是否包含數(shù)據(jù),如果不包含則返回步驟S501,即等待接收下一次的報文;如果包含則進(jìn)行步驟S503。
[0101]S503、設(shè)置接收數(shù)據(jù)緩沖區(qū)的指針。
[0102]S504、判斷接收鏈表是否為空,如果不為空則直接進(jìn)行步驟S506 ;如果為空則進(jìn)行步驟S505。
[0103]S505、設(shè)置連接的數(shù)據(jù)接收狀態(tài),即將連接設(shè)置為已經(jīng)建立的狀態(tài)。
[0104]S506、在接收數(shù)據(jù)緩沖區(qū)中將所接收到的報文控制塊加入接收鏈表。
[0105]S507、判斷數(shù)據(jù)接收狀態(tài)是否被設(shè)置,如果是則進(jìn)行步驟S508 ;如果不是則返回步驟S501,即等待接收下一次的報文。
[0106]S508、通知應(yīng)用程序。
[0107]S509、清除數(shù)據(jù)接收狀態(tài),返回步驟S501,即等待接收下一次的報文。
[0108]實施例二、一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的裝置,包括:
[0109]發(fā)送數(shù)據(jù)接口模塊,用于接收應(yīng)用程序發(fā)送給協(xié)議棧的單鏈表形式的第一數(shù)據(jù);
[0110]映射模塊,用于將所述第一數(shù)據(jù)中各數(shù)據(jù)塊按照單鏈表的順序依次映射到TCP段中,在一個TCP段中映射的數(shù)據(jù)塊的長度小于或等于預(yù)定長度;所述映射是指將表示所述數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的信息寫入所述TCP段;將映射得到的TCP段依次加入發(fā)送隊列。
[0111]本實施例的一種實施方式中,所述映射模塊具體可以包括:
[0112]映射控制單元、映射執(zhí)行單元、發(fā)送控制單元;
[0113]所述映射控制單元用于當(dāng)接收到所述第一數(shù)據(jù)后,創(chuàng)建TCP段作為當(dāng)前TCP段發(fā)送給所述映射執(zhí)行單元;
[0114]所述映射執(zhí)行單元用于將所述第一數(shù)據(jù)中未映射完成的數(shù)據(jù)塊按照單鏈表的順序依次映射到所述當(dāng)前TCP段中,當(dāng)映射到所述當(dāng)前TCP段中的數(shù)據(jù)塊的數(shù)據(jù)長度達(dá)到預(yù)定長度或所述第一數(shù)據(jù)已全部映射完成時通知所述發(fā)送控制單元;
[0115]所述發(fā)送控制單元用于將所述當(dāng)前TCP段加入發(fā)送隊列的末尾,然后通知所述映射控制單兀;
[0116]所述映射控制單元還用于當(dāng)收到所述發(fā)送控制單元的通知后,判斷所述第一數(shù)據(jù)中是否存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則創(chuàng)建新的TCP段,將新創(chuàng)建的TCP段的地址記錄在所述當(dāng)前TCP段中;將新創(chuàng)建的TCP段作為當(dāng)前TCP段,發(fā)送給所述映射執(zhí)行單元。
[0117]本實施方式中,所述映射執(zhí)行單元具體可以包括:
[0118]分片子單元,用于在當(dāng)前TCP段中創(chuàng)建分片,所述分片包括數(shù)據(jù)首地址和數(shù)據(jù)長度;還用于創(chuàng)建分片后根據(jù)所述單鏈表的順序,查找所述第一數(shù)據(jù)中第一個未映射完的數(shù)據(jù)塊;將所查找到的數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)在發(fā)送緩沖區(qū)的起始地址寫入所創(chuàng)建的分片的數(shù)據(jù)首地址;
[0119]比較子單元,用于比較該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度與當(dāng)前TCP段的剩余長度;所述剩余長度為所述預(yù)定長度與所述當(dāng)前TCP段中已映射的數(shù)據(jù)塊的總長度之差;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度小于所述剩余長度,則通知所述分片子單元;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度等于所述剩余長度,則指示所述分片子單元將數(shù)據(jù)塊的長度或所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,通知所述發(fā)送控制模塊;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度大于所述剩余長度,則指示所述分片子單元將所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,通知所述發(fā)送控制模塊;
[0120]所述分片子單元還用于當(dāng)收到所述比較子單元的通知后將數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度;判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則結(jié)束;如果存在則創(chuàng)建分片。
[0121]本實施方式中,所述映射控制單元所創(chuàng)建的TCP段可以各包括一個用于描述本TCP段的結(jié)構(gòu)體tcp_seg ;所述tcp_seg包含本TCP段中所映射的數(shù)據(jù)塊的數(shù)據(jù)總長度,其值等于該TCP段中所有分片的數(shù)據(jù)長度的總和;所述tcp_Seg還包含本TCP段中第一個分片的地址;
[0122]所述映射控制單元將新創(chuàng)建的TCP段的地址記錄在當(dāng)前TCP段中是指將該新創(chuàng)建的TCP段的tcp_seg的地址記錄在當(dāng)前TCP段的tcp_seg中;
[0123]所述分片還包括本TCP段中前一個和下一個分片的地址。
[0124]本實施方式中,所述的裝置還可以包括:[0125]接收數(shù)據(jù)接口模塊,用于當(dāng)協(xié)議棧收到包含數(shù)據(jù)的報文且連接處于已建立狀態(tài)時,將接收到的報文控制塊加入接收鏈表的末尾,將接收到的報文控制塊中表示數(shù)據(jù)起始位置的指針設(shè)置為該報文控制塊在接收數(shù)據(jù)緩沖區(qū)中的起始地址。
[0126]本領(lǐng)域普通技術(shù)人員可以理解上述方法中的全部或部分步驟可通過程序來指令相關(guān)硬件完成,所述程序可以存儲于計算機可讀存儲介質(zhì)中,如只讀存儲器、磁盤或光盤等??蛇x地,上述實施例的全部或部分步驟也可以使用一個或多個集成電路來實現(xiàn)。相應(yīng)地,上述實施例中的各模塊/單元可以采用硬件的形式實現(xiàn),也可以采用軟件功能模塊的形式實現(xiàn)。本發(fā)明不限制于任何特定形式的硬件和軟件的結(jié)合。
[0127]當(dāng)然,本發(fā)明還可有其他多種實施例,在不背離本發(fā)明精神及其實質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明的權(quán)利要求的保護范圍。
【權(quán)利要求】
1.一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的方法,包括: S101、接收應(yīng)用程序發(fā)送給協(xié)議棧的單鏈表形式的第一數(shù)據(jù); S102、將所述第一數(shù)據(jù)中各數(shù)據(jù)塊按照單鏈表的順序依次映射到傳輸控制協(xié)議TCP段中,在一個TCP段中映射的數(shù)據(jù)塊的長度小于或等于預(yù)定長度;所述映射是指將表示所述數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的信息寫入所述TCP段;將映射得到的TCP段依次加入發(fā)送隊列。
2.如權(quán)利要求1所述的方法,其特征在于,所述步驟S102包括: S201、當(dāng)接收到所述第一數(shù)據(jù)后,創(chuàng)建TCP段作為當(dāng)前TCP段; S202、將所述第一數(shù)據(jù)中未映射完成的數(shù)據(jù)塊按照所述單鏈表的順序依次映射到所述當(dāng)前TCP段中,當(dāng)映射到所述當(dāng)前TCP段中的數(shù)據(jù)塊的數(shù)據(jù)長度達(dá)到預(yù)定長度或所述第一數(shù)據(jù)已全部映射完成時進(jìn)行步驟S203 ; S203、將所述當(dāng)前TCP段加入發(fā)送隊列的末尾; S204、判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則進(jìn)行步驟S205 ; S205、創(chuàng)建新的TCP段,將新創(chuàng)建的TCP段的地址記錄在所述當(dāng)前TCP段中;將新創(chuàng)建的TCP段作為當(dāng)前TCP段,返回步驟S202。
3.如權(quán)利要求2所述的方法,其特征在于,所述步驟S202包括: S202A、在當(dāng)前TCP段中創(chuàng)建分片,所述分片包括數(shù)據(jù)首地址和數(shù)據(jù)長度;創(chuàng)建分片后根據(jù)所述單鏈表的順序,查找所述第一數(shù)據(jù)中第一個未映射完的數(shù)據(jù)塊;將所查找到的數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)在發(fā)送緩沖區(qū)的起始地址寫入所創(chuàng)建的分片的數(shù)據(jù)首地址; S202B、比較該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度與當(dāng)前TCP段的剩余長度;所述剩余長度為所述預(yù)定長度與所述當(dāng)前TCP段中已映射的數(shù)據(jù)塊的總長度之差;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度小于所述剩余長度,則進(jìn)行步驟S202C;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度等于所述剩余長度,則將數(shù)據(jù)塊的長度或所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,進(jìn)行步驟S203 ;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度大于所述剩余長度,則將所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,進(jìn)行步驟S203 ; S202C、將數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度;判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則返回步驟S202A。
4.如權(quán)利要求3所述的方法,其特征在于: 所述TCP段各包括一個用于描述本TCP段的結(jié)構(gòu)體tcp_seg ;所述tcp_seg包含本TCP段中所映射的數(shù)據(jù)塊的數(shù)據(jù)總長度,其值等于該TCP段中所有分片的數(shù)據(jù)長度的總和;所述tcp_seg還包含本TCP段中第一個分片的地址; 所述將新創(chuàng)建的TCP段的地址記錄在當(dāng)前TCP段中的步驟包括: 將新創(chuàng)建的TCP段的tcp_seg的地址記錄在當(dāng)前TCP段的tcp_seg中; 所述分片還包括本TCP段中前一個和下一個分片的地址。
5.如權(quán)利要求1到4中任一項所述的方法,其特征在于,還包括: 當(dāng)協(xié)議棧收到包含數(shù)據(jù)的報文且連接處于已建立狀態(tài)時,將接收到的報文控制塊加入接收鏈表的末尾,將接收到的報文控制塊中表示數(shù)據(jù)起始位置的指針設(shè)置為該報文控制塊在接收數(shù)據(jù)緩沖區(qū)中的起始地址。
6.一種協(xié)議棧和應(yīng)用程序間傳輸數(shù)據(jù)的裝置,包括: 發(fā)送數(shù)據(jù)接口模塊,用于接收應(yīng)用程序發(fā)送給協(xié)議棧的單鏈表形式的第一數(shù)據(jù); 映射模塊,用于將所述第一數(shù)據(jù)中各數(shù)據(jù)塊按照單鏈表的順序依次映射到TCP段中,在一個TCP段中映射的數(shù)據(jù)塊的長度小于或等于預(yù)定長度;所述映射是指將表示所述數(shù)據(jù)塊在發(fā)送數(shù)據(jù)緩沖區(qū)中起止位置的信息寫入所述TCP段;將映射得到的TCP段依次加入發(fā)送隊列。
7.如權(quán)利要求6所述的裝置,其特征在于,所述映射模塊包括: 映射控制單元、映射執(zhí)行單元、發(fā)送控制單元; 所述映射控制單元用于當(dāng)接收到所述第一數(shù)據(jù)后,創(chuàng)建TCP段作為當(dāng)前TCP段發(fā)送給所述映射執(zhí)行單元; 所述映射執(zhí)行單元用于將所述第一數(shù)據(jù)中未映射完成的數(shù)據(jù)塊按照單鏈表的順序依次映射到所述當(dāng)前TCP段中,當(dāng)映射到所述當(dāng)前TCP段中的數(shù)據(jù)塊的數(shù)據(jù)長度達(dá)到預(yù)定長度或所述第一數(shù)據(jù)已全部映射完成時通知所述發(fā)送控制單元; 所述發(fā)送控制單元用于將所述當(dāng)前TCP段加入發(fā)送隊列的末尾,然后通知所述映射控制單兀; 所述映射控制單元還用于當(dāng)收到所述發(fā)送控制單元的通知后,判斷所述第一數(shù)據(jù)中是否存在未映射的數(shù)據(jù)塊,如果不存在則指示映射結(jié)束;如果存在則創(chuàng)建新的TCP段,將新創(chuàng)建的TCP段的地址記錄在所述當(dāng)前TCP段中;將新創(chuàng)建的TCP段作為當(dāng)前TCP段,發(fā)送給所述映射執(zhí)行單元。
8.如權(quán)利要求7所述的裝置,其特征在于,所述映射執(zhí)行單元包括: 分片子單元,用于在當(dāng)前TCP段中創(chuàng)建分片,所述分片包括數(shù)據(jù)首地址和數(shù)據(jù)長度;還用于創(chuàng)建分片后根據(jù)所述單鏈表的順序,查找所述第一數(shù)據(jù)中第一個未映射完的數(shù)據(jù)塊;將所查找到的數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)在發(fā)送緩沖區(qū)的起始地址寫入所創(chuàng)建的分片的數(shù)據(jù)首地址; 比較子單元,用于比較該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度與當(dāng)前TCP段的剩余長度;所述剩余長度為所述預(yù)定長度與所述當(dāng)前TCP段中已映射的數(shù)據(jù)塊的總長度之差;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度小于所述剩余長度,則通知所述分片子單元;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度等于所述剩余長度,則指示所述分片子單元將數(shù)據(jù)塊的長度或所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,通知所述發(fā)送控制模塊;如果該數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度大于所述剩余長度,則指示所述分片子單元將所述剩余長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度,通知所述發(fā)送控制模塊; 所述分片子單元還用于當(dāng)收到所述比較子單元的通知后將數(shù)據(jù)塊內(nèi)未映射數(shù)據(jù)的長度寫入所創(chuàng)建的分片的數(shù)據(jù)長度;判斷所述第一數(shù)據(jù)中是否還存在未映射的數(shù)據(jù)塊,如果不存在則結(jié)束;如果存在則創(chuàng)建分片。
9.如權(quán)利要求8所述的裝置,其特征在于: 所述映射控制單元所創(chuàng)建的TCP段各包括一個用于描述本TCP段的結(jié)構(gòu)體tcp_seg ;所述tcp_Seg包含本TCP段中所映射的數(shù)據(jù)塊的數(shù)據(jù)總長度,其值等于該TCP段中所有分片的數(shù)據(jù)長度的總和;所述tcp_Seg還包含本TCP段中第一個分片的地址;所述映射控制單元將新創(chuàng)建的TCP段的地址記錄在當(dāng)前TCP段中是指將該新創(chuàng)建的TCP段的tcp_seg的地址記錄在當(dāng)前TCP段的tcp_seg中; 所述分片還包括本TCP段中前一個和下一個分片的地址。
10.如權(quán)利要求6到9中任一項所述的裝置,其特征在于,還包括: 接收數(shù)據(jù)接口模塊,用于當(dāng)協(xié)議棧收到包含數(shù)據(jù)的報文且連接處于已建立狀態(tài)時,將接收到的報文控制塊加入接收鏈表的末尾,將接收到的報文控制塊中表示數(shù)據(jù)起始位置的指針設(shè)置為該報文控制 塊在接收數(shù)據(jù)緩沖區(qū)中的起始地址。
【文檔編號】H04L29/06GK103905420SQ201310657148
【公開日】2014年7月2日 申請日期:2013年12月6日 優(yōu)先權(quán)日:2013年12月6日
【發(fā)明者】馮璐 申請人:北京太一星晨信息技術(shù)有限公司