本申請涉及計算機技術領域,特別是涉及一種tcp流重組方法和一種tcp流重組裝置。
背景技術:
隨著網絡犯罪手段不斷趨于復雜化和多樣化,傳統(tǒng)方法無法檢測出某些特殊的新型入侵行為,例如利用tcp(transmissioncontrolprotocol,傳輸控制協(xié)議)協(xié)議缺陷,發(fā)送大量偽造的tcp連接請求,從而使得被攻擊方資源耗盡的synflood(拒絕服務)攻擊。若敏感信息分片到幾個不同的數(shù)據(jù)包中,數(shù)據(jù)包特征就會消失從而無法檢測出惡意行為,無法滿足網絡安全防護和打擊網絡犯罪的實際需要。為了提高惡意數(shù)據(jù)流檢測的準確性,不能只是運用數(shù)據(jù)包級的處理,必須將每條tcp流的所有數(shù)據(jù)包重組為完整的會話流,以進行應用級分析。由于tcp流在ip層被切分成多個ip(internetprotocol,網絡協(xié)議)分片來傳輸,使得整個數(shù)據(jù)傳輸過程中可能存在tcp報文段失序、重復,甚至還會有丟包的情況。
針對上述情況,在獲取tcp數(shù)據(jù)包之后,如何通過有效的tcp流重組方法實現(xiàn)對tcp連接上傳輸信息的恢復是一種核心的網絡技術。tcp流重組技術是一種將網絡包恢復成原始數(shù)據(jù)流的技術。當前最通用、最常見的tcp流重組方法是采用鏈表實現(xiàn)的隊列緩存tcp包的方式實現(xiàn)的,具體步驟如下:
1、系統(tǒng)創(chuàng)建一個按序到達包隊列和一個亂序包隊列,用于存儲按序到達和提前到達的數(shù)據(jù)包。其中,按序到達的數(shù)據(jù)包是指當前到達的數(shù)據(jù)包是與已經到達的數(shù)據(jù)包相連的后續(xù)報文,提前到達的數(shù)據(jù)包是指當前到達的數(shù)據(jù)包不是與已經到達的數(shù)據(jù)包相連的后續(xù)報文,而是提前到來的報文,此時應該將這個數(shù)據(jù)包放置到亂序包隊列存儲起來,以備后續(xù)重組使用。
2、在一個新數(shù)據(jù)包到達之后,先判斷該數(shù)據(jù)包是否為提前到達的數(shù)據(jù)包,若是提前到達的數(shù)據(jù)包則存入亂序包隊列,若不是提前到達的數(shù)據(jù)包則 存入按序到達包隊列。
3、在tcp流結束時則進行合并、組裝等一系列較為復雜的運算,完成tcp流重組。
另外,對于每個到達的數(shù)據(jù)包,都需要對數(shù)據(jù)包的邊界進行多次判斷,決定對該數(shù)據(jù)包做何種處理,例如是拆解還是丟棄。而且對于拆解后保留的部分還需要插入到按序到達隊列或者提前到達隊列指定的位置。以按序到達的數(shù)據(jù)包為例。首先需要判斷新到達的數(shù)據(jù)包與已經存入按序到達包隊列中的數(shù)據(jù)包,對應在按序到達包隊列中的存儲空間是否有重疊的部分,若沒有重疊的部分,則直接將新到達的數(shù)據(jù)包存入按序到達包隊列中,而若有重疊的部分,則進一步判斷重疊的部分是否對應整個新到達的數(shù)據(jù)包,若是則可以直接將該新到達的數(shù)據(jù)包丟棄,若不是則對新到達的數(shù)據(jù)包進行拆解,丟棄其中重疊的部分,并將保留的部分存入按序到達包隊列。
因此可見,現(xiàn)有的流重組方法操作比較復雜,導致效率較低,往往很難滿足系統(tǒng)性能方面的需求。
技術實現(xiàn)要素:
鑒于上述問題,提出了本申請實施例以便提供一種克服上述問題或者至少部分地解決上述問題的一種tcp流重組方法和相應的一種tcp流重組裝置。
為了解決上述問題,本申請公開了一種tcp流重組方法,包括:
針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組;
針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度;
當所述有效數(shù)據(jù)包屬于客戶端時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲;
當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。
可選地,所述針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組的步驟,包括:
在所述tcp連接建立成功之后,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
可選地,所述針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組的步驟,包括:
在接收所述tcp連接的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;
如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù)據(jù)包;
如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則判斷所述有效數(shù)據(jù)包是否屬于客戶端;
如果所述有效數(shù)據(jù)包屬于客戶端,創(chuàng)建屬于客戶端的第一數(shù)組;
如果所述有效數(shù)據(jù)包不屬于客戶端,創(chuàng)建屬于服務器的第二數(shù)組。
可選地,所述針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度的步驟,包括:
計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長度作為數(shù)據(jù)長度;
當所述有效數(shù)據(jù)包屬于客戶端,則根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第一糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第一糾偏值為屬于客戶端的syn包的初始序列號+1;
當所述有效數(shù)據(jù)包屬于服務器,則根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第二糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第二糾偏值為屬于服務器的syn包的初始序列號+1。
可選地,在針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之后,還包括:
當所述有效數(shù)據(jù)包屬于客戶端,則判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第一數(shù)組的數(shù)組長度;
如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第一數(shù)組的數(shù)組長 度,則創(chuàng)建一個新的第一數(shù)組,所述新的第一數(shù)組的數(shù)組長度超過原來的第一數(shù)組第一閾值;
將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第一數(shù)組中。
可選地,在針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之后,還包括:
當所述有效數(shù)據(jù)包屬于服務器,則判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第二數(shù)組的數(shù)組長度;
如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第二數(shù)組的數(shù)組長度,則創(chuàng)建一個新的第二數(shù)組,所述新的第二數(shù)組的數(shù)組長度超過原來的第一數(shù)組第二閾值;
將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第二數(shù)組中。
可選地,還包括:
在將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中之后,將原來的第一數(shù)組釋放。
可選地,還包括:
在將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中之后,將原來的第二數(shù)組釋放。
可選地,針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組的步驟之前,還包括:
當接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;
如果syn包是來自客戶端,則記錄客戶端的初始序列號isn(c);
如果syn包是來自服務器,則記錄服務器的初始序列號isn(s)。
可選地,所述針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組的步驟,包括:
針對一tcp連接,在內存中創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
可選地,所述在當前tcp連接結束后,輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)的步驟,包括:
當在所述tcp連接下接收到任一個非指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第一時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù);
和/或,當在所述tcp連接下接收到指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第二時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù)。
可選地,所述當所述有效數(shù)據(jù)包屬于客戶端時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲的步驟,包括:
根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第一數(shù)組的有效數(shù)據(jù)的重疊情況;
如果第一數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄;
如果第一數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù)據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第一偏移量和第一數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第一數(shù)組的第一偏移量位置開始存儲,直至存儲長度為所述第一數(shù)據(jù)長度;
如果第一數(shù)組中不存在與所述有效數(shù)據(jù)重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第一數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
可選地,所述當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲的步驟,包括:
根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第二數(shù)組的有效數(shù)據(jù)的重疊情況;
如果第二數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述 有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,
如果第二數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù)據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第二偏移量和第二數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第二數(shù)組的第二偏移量位置開始存儲,直至存儲長度為所述第二數(shù)據(jù)長度;
如果第二數(shù)組中不存在與所述有效數(shù)據(jù)重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第二數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
可選地,還包括:在當前tcp連接結束后,輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)。
本申請還公開了一種tcp流重組裝置,包括:
第一創(chuàng)建模塊,適于針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組;
計算模塊,適于針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度;
第一存儲模塊,適于當所述有效數(shù)據(jù)包屬于客戶端時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲;
第二存儲模塊,適于當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。
可選地,所述第一創(chuàng)建模塊,包括:
第一創(chuàng)建子模塊,適于在所述tcp連接建立成功之后,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
可選地,所述第一創(chuàng)建模塊,包括:
tcp判斷子模塊,適于在接收所述tcp連接的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則進入第一判斷子模塊;
第一判斷子模塊,適于判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù)據(jù)包;如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則進入客戶端判斷子模塊;
客戶端判斷子模塊,適于判斷所述有效數(shù)據(jù)包是否屬于客戶端;如果所述有效數(shù)據(jù)包屬于客戶端,則進入第一數(shù)組創(chuàng)建子模塊;如果所述有效數(shù)據(jù)包不屬于客戶端,則進入第二數(shù)組創(chuàng)建子模塊;
第一數(shù)組創(chuàng)建子模塊,適于創(chuàng)建屬于客戶端的第一數(shù)組;
第二數(shù)組創(chuàng)建子模塊,創(chuàng)建屬于服務器的第二數(shù)組。
可選地,所述計算模塊,包括:
數(shù)據(jù)長度計算子模塊,適于計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長度作為數(shù)據(jù)長度;
第一偏移量計算子模塊,適于當所述有效數(shù)據(jù)包屬于客戶端,則根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第一糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第一糾偏值為屬于客戶端的syn包的初始序列號+1;
第二偏移量計算子模塊,適于當所述有效數(shù)據(jù)包屬于服務器,則根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第二糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第二糾偏值為屬于服務器的syn包的初始序列號+1。
可選地,在所述計算模塊之后,還包括:
第一判斷模塊,適于當所述有效數(shù)據(jù)包屬于客戶端,則判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第一數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第一數(shù)組的數(shù)組長度,則進入第一新數(shù)組創(chuàng)建模塊;
第一新數(shù)組創(chuàng)建模塊,適于創(chuàng)建一個新的第一數(shù)組,所述新的第一數(shù)組的數(shù)組長度超過原來的第一數(shù)組第一閾值;
第一復制存儲模塊,適于將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第一數(shù)組中。
可選地,在所述計算模塊之后,還包括:
第二判斷模塊,適于當所述有效數(shù)據(jù)包屬于服務器,則判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第二數(shù)組的數(shù)組長度;如果所述有 效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第二數(shù)組的數(shù)組長度,則進入第二新數(shù)組創(chuàng)建模塊;
第二新數(shù)組創(chuàng)建模塊,適于創(chuàng)建一個新的第二數(shù)組,所述新的第二數(shù)組的數(shù)組長度超過原來的第二數(shù)組第一閾值;
第二復制存儲模塊,適于將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第二數(shù)組中。
可選地,還包括:
第一釋放模塊,適于在將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中之后,將原來的第一數(shù)組釋放。
可選地,還包括:
第二釋放模塊,適于在將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中之后,將原來的第二數(shù)組釋放。
可選地,在所述第一創(chuàng)建模塊之前,還包括:
syn包判斷模塊,適于當接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;如果syn包是來自客戶端,則進入第一記錄模塊;如果syn包是來自服務器,則進入第二記錄模塊;
第一記錄模塊,適于記錄客戶端的初始序列號isn(c);
第二記錄模塊,適于記錄服務器的初始序列號isn(s)。
可選地,所述第一創(chuàng)建模塊,包括:
第一內存創(chuàng)建子模塊,適于針對一tcp連接,在內存中創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
可選地,所述輸出模塊,包括:
第一輸出子模塊,適于當在所述tcp連接下接收到任一個非指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第一時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù);
和/或,第二輸出子模塊,適于當在所述tcp連接下接收到指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第二時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù)。
可選地,所述第一存儲模塊,包括:
第一重疊判斷子模塊,適于根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第一數(shù)組的有效數(shù)據(jù)的重疊情況;
第一丟棄子模塊,適于如果第一數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄;
第一丟棄存儲子模塊,適于如果第一數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù)據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第一偏移量和第一數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第一數(shù)組的第一偏移量位置開始存儲,直至存儲長度為所述第一數(shù)據(jù)長度;
第一存儲子模塊,適于如果第一數(shù)組中不存在與所述有效數(shù)據(jù)全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第一數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
可選地,所述第二存儲模塊,包括:
第二重疊判斷子模塊,適于根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第二數(shù)組的有效數(shù)據(jù)的重疊情況;
第二丟棄子模塊,適于如果第二數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,
第二丟棄存儲子模塊,適于如果第二數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù)據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第二偏移量和第二數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第二數(shù)組的第二偏移量位置開始存儲,直至存儲長度為所述第二數(shù)據(jù)長度;
第二丟棄存儲子模塊,適于如果第二數(shù)組中不存在與所述有效數(shù)據(jù)全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第二數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
可選地,還包括:
輸出模塊,適于在當前tcp連接結束后,輸出第一數(shù)組和/或第二數(shù)組 中的數(shù)據(jù)。
本申請實施例包括以下優(yōu)點:
本申請實施例,針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。本申請簡化了流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
附圖說明
圖1是本申請的一種tcp流重組方法實施例的步驟流程圖;
圖1a是本申請的一種tcp連接從開始建立過程到連接關閉的狀態(tài)變化示意圖;
圖1b是本申請的一種延遲分配內存的方法示意圖;
圖1c是本申請的一種將多個有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至第一數(shù)組的相應位置的過程示意圖;
圖2是本申請的一種tcp流重組方法實施例的步驟流程圖;
圖2a是本申請的一種tcp數(shù)據(jù)包結構示意圖;
圖3是本申請的一種tcp流重組方法實施例的步驟流程圖;
圖4是本申請的一種tcp流重組方法實施例的步驟流程圖;
圖5是本申請的一種tcp流重組裝置實施例的結構框圖;
圖6是本申請的一種tcp流重組裝置實施例的結構框圖;
圖7是本申請的一種tcp流重組裝置實施例的結構框圖;
圖8是本申請的一種tcp流重組裝置實施例的結構框圖。
具體實施方式
為使本申請的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結合附圖 和具體實施方式對本申請作進一步詳細的說明。
本申請實施例的核心構思之一在于,針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲,在當前tcp連接結束后,輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)。本申請簡化了流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
實施例一
參照圖1,示出了本申請的一種tcp流重組方法實施例的步驟流程圖,具體可以包括如下步驟:
步驟110,針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
tcp(transmissioncontrolprotocol,傳輸控制協(xié)議)是一種面向連接的,基于字節(jié)流的運輸層通信協(xié)議。tcp保證了傳送數(shù)據(jù)包的順序。順序是用一個序列號來保證的。響應包內也包括一個序列號,表示接收方準備好這個序列號的包。在tcp傳送一個數(shù)據(jù)包時,它會把這個數(shù)據(jù)包放入重發(fā)隊列中,同時啟動計時器,如果收到了關于這個包的確認信息,便將此數(shù)據(jù)包從隊列中刪除,如果在計時器超時的時候仍然沒有收到確認信息,則需要重新發(fā)送該數(shù)據(jù)包。另外,tcp通過數(shù)據(jù)分段中的序列號來保證所有傳輸?shù)臄?shù)據(jù)可以按照正常的順序進行重組,從而保障數(shù)據(jù)傳輸?shù)耐暾cp連接具有請求和返回兩個對應的方向,每個tcp包具有tcp序列號(sequencenumber)、tcp確認號(acknowledgmentnumber)及數(shù)據(jù)包長度(len)等參數(shù)。tcp是一種可靠的面向連接的協(xié)議。
其中,tcp序列號為32位,表示數(shù)據(jù)流中的字節(jié)數(shù)。是tcp協(xié)議中首字節(jié)在整個數(shù)據(jù)流中的位置。
tcp確認號為32位,tcp協(xié)議中用于表示序號為確認號減去1的數(shù)據(jù)包及其以前的所有數(shù)據(jù)包已經正確接收,對應于期望收到的下一個序列號。
如圖1a為tcp連接從開始建立過程到連接關閉的狀態(tài)變化示意圖。在實際應用中,tcp建立連接,首先需要經過“三次握手”的過程。這里以客戶端向服務器發(fā)起連接來說明,具體步驟如下:
第一次握手:客戶端向服務器發(fā)送一個同步數(shù)據(jù)包(syn,synchronous)請求建立連接,該數(shù)據(jù)包中,初始序列號(initialsequencenumber,isn)是客戶端隨機產生的一個值,確認號是0;其中,初始序列號為32位,是tcp建立連接階段的初始序列號。
第二次握手:服務器收到這個同步請求數(shù)據(jù)包后,會對客戶端進行一個同步確認。這個同步確認數(shù)據(jù)包中,序列號(sequencenumber,sn)是服務器隨機產生的一個值,確認號是客戶端的初始序列號+1;
第三次握手:客戶端收到這個同步確認數(shù)據(jù)包后,再對服務器進行一個確認。該數(shù)據(jù)包中,序列號是上一個同步請求數(shù)據(jù)包中的確認號值,確認號是服務器的初始序列號+1。
完成三次握手后,客戶端與服務器可以開始傳送數(shù)據(jù)。
在tcp建立連接后,就可以開始傳輸數(shù)據(jù)了。tcp工作在全雙工模式,它可以同時進行雙向數(shù)據(jù)傳輸。這里為了簡化,我們只談服務器向客戶端發(fā)送數(shù)據(jù)的情況,而客戶端向服務器發(fā)送數(shù)據(jù)的原理和它是類似的,這里便不重復說明。
服務器向客戶端發(fā)送一個數(shù)據(jù)包后,客戶端收到這個數(shù)據(jù)包后,會向服務器發(fā)送一個確認數(shù)據(jù)包。
傳輸數(shù)據(jù)的簡要過程如下:
1)發(fā)送數(shù)據(jù):服務器向客戶端發(fā)送一個帶有數(shù)據(jù)的數(shù)據(jù)包,該數(shù)據(jù)包中的序列號和確認號與建立連接第三步的數(shù)據(jù)包中的序列號和確認號相同;
2)確認收到:客戶端收到該數(shù)據(jù)包,向服務器發(fā)送一個確認數(shù)據(jù)包,該數(shù)據(jù)包中,序列號是為上一個數(shù)據(jù)包中的確認號值,而確認號為服務器發(fā)送的上一個數(shù)據(jù)包中的序列號+所該數(shù)據(jù)包中所帶數(shù)據(jù)的大小。
數(shù)據(jù)分段中的序列號可以保證所有傳輸?shù)臄?shù)據(jù)按照正常的次序進行重組,而且通過確認保證數(shù)據(jù)傳輸?shù)耐暾浴?/p>
前面我們提到,建立一個連接需要3個步驟,但是關閉一個連接需要經過4個步驟。因為tcp連接是全雙工的工作模式,所以每個方向上需要單獨關閉。在tcp關閉連接時,首先關閉的一方(即發(fā)送第一個終止數(shù)據(jù)包的)將執(zhí)行主動關閉,而另一方(收到這個終止數(shù)據(jù)包的)再執(zhí)行被動關閉。關閉連接的4個步驟如下:
1、服務器完成它的數(shù)據(jù)發(fā)送任務后,會主動向客戶端發(fā)送一個終止(fin)數(shù)據(jù)包,以關閉在這個方向上的tcp連接。該數(shù)據(jù)包中,序列號為客戶端發(fā)送的上一個數(shù)據(jù)包中的確認號值,而確認號為服務器發(fā)送的上一個數(shù)據(jù)包中的序列號+該數(shù)據(jù)包所帶的數(shù)據(jù)的大小;
2、客戶端收到服務器發(fā)送的終止數(shù)據(jù)包后,將對服務器發(fā)送確認信息,以關閉該方向上的tcp連接。這時的數(shù)據(jù)包中,序列號為第1步中的確認號值,而確認號為第1步的數(shù)據(jù)包中的序列號+1;
3、同理,客戶端完成它的數(shù)據(jù)發(fā)送任務后,就也會向服務器發(fā)送一個終止數(shù)據(jù)包,以關閉在這個方向上的tcp連接,該數(shù)據(jù)包中,序列號為服務器發(fā)送的上一個數(shù)據(jù)包中的確認號值,而確認號為客戶端發(fā)送的上一個數(shù)據(jù)包中的序列號+該數(shù)據(jù)包所帶數(shù)據(jù)的大?。?/p>
4、服務器收到客戶端發(fā)送的終止數(shù)據(jù)包后,將對客戶端發(fā)送確認信息,以關閉該方向上的tcp連接。這時在數(shù)據(jù)包中,序列號為第3步中的確認號值,而確認號為第3步數(shù)據(jù)包中的序列號+1;
在本申請實施例中,服務器側會針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,用以重組在連接中傳輸?shù)臄?shù)據(jù)包中的數(shù)據(jù)。其中,第一數(shù)組的大小可以根據(jù)需求靈活設定,對此本申請不加以限定;可以在任何可以創(chuàng)建數(shù)組的存儲空間中創(chuàng)建第一數(shù)組和/或第二數(shù)組,例如內存、云存儲空間等。
在實際應用中,針對一tcp連接,客戶端與服務器之間是可以互相通信的,因此客戶端可以發(fā)送數(shù)據(jù)包,服務器也可以向客戶端響應的數(shù)據(jù)包, 此時,若要針對該tcp連接進行數(shù)據(jù)流重組,可以分別將來自客戶端的數(shù)據(jù)流重組和/或來自服務器的數(shù)據(jù)流重組。如果要同時針對一tcp連接下客戶端發(fā)送的數(shù)據(jù)包重組,以及服務器為客戶端響應的數(shù)據(jù)包重組,則分別創(chuàng)建屬于客戶端的第一數(shù)組,和屬于服務器的第二數(shù)組,其中第一數(shù)組用以重組來自客戶端的數(shù)據(jù)流,第二數(shù)組用以重組來自服務器的數(shù)據(jù)流。比如,如果只需要針對一tcp連接下客戶端發(fā)送的數(shù)據(jù)包進行重組,則此時只需在內容中創(chuàng)建屬于客戶端的第一數(shù)組;如果只需要針對一tcp連接下服務器為客戶端響應的數(shù)據(jù)包重組,則此時只需在內容中創(chuàng)建屬于服務器的第二數(shù)組。具體地,可以根據(jù)實際需求,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,對此本申請實施例不加以限定。
在本申請實施例中,針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組的過程中,可以在新建連接的過程中創(chuàng)建第一數(shù)組,和/或第二數(shù)組,也可以在連接創(chuàng)建之后,再創(chuàng)建第一數(shù)組和/或第二數(shù)組。本申請可以根據(jù)實際設置選擇創(chuàng)建時機。
在本申請的另一個優(yōu)選地實施例中,所述步驟110,包括:
子步驟a111,在所述tcp連接建立成功之后,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
如圖1b為延遲分配內存的方法示意圖。此時,是在tcp連接建立成功之后,再創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,相對于在tcp連接還未成功建立之前,在創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,延遲了創(chuàng)建用以進行數(shù)據(jù)流重組的第一數(shù)組和/或第二數(shù)組。
在實際應用中,若是在tcp連接建立過程中,例如在服務器接收到客戶端發(fā)送的syn包時,就創(chuàng)建第一數(shù)組和/或第二數(shù)組,那么,如果此時受到synflood(拒絕服務)攻擊,即黑客發(fā)送大量的syn包,則相應地,會創(chuàng)建大量的第一數(shù)組和/或第二數(shù)組,從而耗費大量的系統(tǒng)內存,影響系統(tǒng)的正常運行。
所以,在本申請中,可以延遲創(chuàng)建第一數(shù)組和/或第二數(shù)組,即在tcp 連接建立成功之后,再創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。從而可以有效地避免上述的問題。
另外,在本申請實施例中,第一數(shù)組可以為普通數(shù)組,在創(chuàng)建時即確定數(shù)組的大小,也可以為動態(tài)數(shù)組,所謂動態(tài)數(shù)組,是指在創(chuàng)建時沒有確定數(shù)組大小的數(shù)組,當使用該動態(tài)數(shù)組時,可隨時用函數(shù)重新定義該動態(tài)數(shù)組的大小。
在本申請的另一個優(yōu)選地實施例中,所述步驟110,包括:
子步驟b111,針對一tcp連接,在內存中創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
在本申請實施例中,為了方便將客戶端和/或服務器的有效數(shù)據(jù)包快速地發(fā)送至第一數(shù)組和/或第二數(shù)組,可以直接在服務器的內存中創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
步驟120,針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度。
其中,tcp載荷是指tcp數(shù)據(jù)包中除去tcp報頭信息以外的部分。載荷數(shù)據(jù)是變長字段,它包含下一個頭字段描述的數(shù)據(jù)。有效載荷數(shù)據(jù)字段是強制性的,它的長度是字節(jié)的整數(shù)倍。該有效數(shù)據(jù)包還是tcp包。
在發(fā)明實施例中,若數(shù)據(jù)包含有tcp載荷,則說明該數(shù)據(jù)包為有效數(shù)據(jù)包。
在本申請實施例中,有效數(shù)據(jù)包的偏移量(offset)為該有效數(shù)據(jù)包的序列號與前述的syn數(shù)據(jù)包的初始序列號加1的差值,即該有效數(shù)據(jù)包與syn數(shù)據(jù)包之間的距離。因為一個初始序列號將占用一個序號,所以要加1。數(shù)據(jù)長度(length,len)是指有效數(shù)據(jù)包中的數(shù)據(jù)所占內存的空間,一般以字節(jié)(byte)為單位。
另外,在本申請實施例中,可以采用現(xiàn)有的任何一種可用技術計算有效數(shù)據(jù)包的數(shù)據(jù)長度,對此,本申請實施例不加以限定。
步驟130,當所述有效數(shù)據(jù)包屬于客戶端時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組 存儲。
在本申請實施例中,有效數(shù)據(jù)包屬于客戶端是指該有效數(shù)據(jù)包是由客戶端發(fā)送的有效數(shù)據(jù)包。當所述有效數(shù)據(jù)包屬于客戶端時,可以根據(jù)有效數(shù)據(jù)包的偏移量以及和數(shù)據(jù)長度,在第一數(shù)組中查找用以存儲該有效數(shù)據(jù)包中的有效數(shù)據(jù)的存儲空間,然后按照一定順序將有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至第一數(shù)組的相應偏移量和數(shù)據(jù)長度的位置。其中,可以按照各有效數(shù)據(jù)在對應有效數(shù)據(jù)包中的存儲順序,也可以按照相反的順序或者其他設定的順序,將效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至第一數(shù)組的相應偏移量和數(shù)據(jù)長度的位置,對此,本申請實施例不加以限定。
例如,假設第一數(shù)組的長度為20,存儲空間位置為1-20,當前接收到的一個有效數(shù)據(jù)包的偏移量為5,數(shù)據(jù)長度為10。則會將該有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲于第一數(shù)組中的選擇6-15的存儲空間位置,也即從存儲空間位置6開始存儲該有效數(shù)據(jù),一直存儲到存儲空間位置15,則該數(shù)據(jù)包的有效數(shù)據(jù)存儲完畢。
在實際應用中,根據(jù)各有效數(shù)據(jù)包的偏移量以及數(shù)據(jù)長度,可以將各有效數(shù)據(jù)包分為三類:按序到達的有效數(shù)據(jù)包,提前到達的有效數(shù)據(jù)包、重疊的有效數(shù)據(jù)包,其中重疊的有效數(shù)據(jù)包同時可能為按序到達的有效數(shù)據(jù)包或提前到達的有效數(shù)據(jù)包。其中,假設當前已到達的有序數(shù)據(jù)包已經存儲到數(shù)組的第n個元素,按序到達的有效數(shù)據(jù)包是指偏移量等于n+1的有效數(shù)據(jù)包;提前到達的有效數(shù)據(jù)包是指指偏移量大于n+1的有效數(shù)據(jù)包;重疊的有效數(shù)據(jù)包是指其數(shù)據(jù)在第一數(shù)組中的位置與已經存儲于第一數(shù)組的數(shù)據(jù)有重合的部分的有效數(shù)據(jù)包。
在本申請實施例中,無論按序到達,提前到達,重疊,都可以首先計算到達包的偏移位置(offset)和長度(len),然后將有效數(shù)據(jù)包的數(shù)據(jù)存儲到第一數(shù)組對應的位置。
如圖1c為針對6個不同有效數(shù)據(jù)包(case1、case2、case3、case4、case5、case6),將各有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至第一數(shù)組的相應位置的過程。其中case1、case2是按序到達第一數(shù)組的有效數(shù)據(jù)包,case5是提前到達第一 數(shù)組的有效數(shù)據(jù)包,case3、case4、case6是重疊的有效數(shù)據(jù)包。
在第一個帶載荷數(shù)據(jù)包到達之前,即第一個有效數(shù)據(jù)包到達之前,第一數(shù)組的數(shù)組空間未開辟。
在case1的情況下:第一個帶載荷包到達,即第一個有效數(shù)據(jù)包到達,則此時開辟第一數(shù)組的數(shù)組空間,該第一個有效數(shù)據(jù)包的有效數(shù)據(jù)的偏移值offset=0,長度len=100,則從第一數(shù)組的數(shù)組空間的0偏移位置開始按序存儲該有效數(shù)據(jù),存儲到偏移99的位置,則該第一數(shù)組的有效數(shù)據(jù)包重組完畢。
在case2的情況下,第二個有效數(shù)據(jù)包按序到達,此時的第一數(shù)組中存儲了case1中的第一個有效數(shù)據(jù)包的有效數(shù)據(jù)。第二個有效數(shù)據(jù)包的偏移offset=100,長度len=100,那么則查找第一數(shù)組的偏移100的位置,找到之后,則在第一數(shù)組的偏移100位置開始將第二個有效數(shù)據(jù)包的有效數(shù)據(jù)按序存儲,一直存儲到偏移199的位置,則第二個有效數(shù)據(jù)包的有效數(shù)據(jù)重組完畢。
在case3的情況下,接收到了第三個有效數(shù)據(jù)包,但是該數(shù)據(jù)包的偏移offset=50,長度len=100,由于case1第一個有效數(shù)據(jù)包的偏移offset=0,長度len=100,第二個有效數(shù)據(jù)包的偏移offset=100,長度len=100,那么該第三個數(shù)據(jù)包的有效數(shù)據(jù)在前兩個有效數(shù)據(jù)包的有效數(shù)據(jù)之內。那么找到第一個數(shù)據(jù)包的偏移50的位置開始,將第一個有效數(shù)據(jù)包的有效數(shù)據(jù)按序進行覆蓋,直到偏移149的位置,則該有效數(shù)據(jù)包的有效數(shù)據(jù)重組完畢。
在case4的情況下,第四個有效數(shù)據(jù)包按序到達,但是該有效數(shù)據(jù)包的偏移offset=150,長度len=100,由于第二個有效數(shù)據(jù)包的偏移offset=100,長度len=100,那么該第四個有效數(shù)據(jù)包與第二個有效數(shù)據(jù)包由重疊的部分,此時從第二個數(shù)據(jù)包的偏移150的位置開始,利用第四個有效數(shù)據(jù)包將第二個有效數(shù)據(jù)包的有效數(shù)據(jù)按序進行覆蓋,直到偏移199的位置,然后繼續(xù)從偏移200的位置開始,將第四個有效數(shù)據(jù)包剩下的部分按序存儲,直到偏移249的位置,則該有效數(shù)據(jù)包的有效數(shù)據(jù)重組完畢。
在case5的情況下,第五個有效數(shù)據(jù)包到達,該有效數(shù)據(jù)包的偏移 offset=300,長度len=100,可見其偏移量大于之前接收到的任一個有效數(shù)據(jù)包的偏移量與長度之和,即其不與接收到有效數(shù)據(jù)包相連,是提前到達的數(shù)據(jù)包,此時直接從偏移300的位置開始,按序存儲第五有效數(shù)據(jù)包,直到偏移399的位置為止,則該有效數(shù)據(jù)包的有效數(shù)據(jù)重組完畢。
在case6的情況下,第七個有效數(shù)據(jù)包到達,該有效數(shù)據(jù)包的偏移offset=450,長度len=100,在其之前已經接收到偏移offset=500,長度len=100的第六個有效數(shù)據(jù)包,可見第七個有效數(shù)據(jù)包的偏移小于第六個有效數(shù)據(jù)包的偏移,但是兩者之間的差值小于第七個有效數(shù)據(jù)包的長度,所以第七個有效數(shù)據(jù)包和第六個有效數(shù)據(jù)包存在重疊的部分,此時從偏移450的位置開始將第七個有效數(shù)據(jù)包不與第六個有效數(shù)據(jù)包不重疊的部分按序存儲,直到偏移499的位置結束,然后從偏移500的位置開始,利用第七個數(shù)據(jù)包還未存儲的部分將第六個有效數(shù)據(jù)包按序進行覆蓋,直至偏移549的位置結束,則該有效數(shù)據(jù)包的有效數(shù)據(jù)重組完畢。
可以看出,即使兩個有效數(shù)據(jù)包對應的在第一數(shù)組中的位置有重疊的部分,仍然會按照兩個有效數(shù)據(jù)包到達的順序分別將兩個有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至第一數(shù)組對應的位置,對于其中重疊的部分,后存儲的有效數(shù)據(jù)可以覆蓋之前存儲的有效數(shù)據(jù)。從而保證對于重復接收到的數(shù)據(jù),在第一數(shù)組中不會重復存儲。
可以理解,對于不同類型的case的情況下,對有效數(shù)據(jù)包都可以無需判斷是否有重復的部分,可以直接按照偏移量和長度將各有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至第一數(shù)組,從而更節(jié)省計算量,提高流重組的效率。
但是,對于重疊到達的有效數(shù)據(jù)包,也可以將重疊到達的有效數(shù)據(jù)包中重疊的有效數(shù)據(jù)直接丟棄,然后按照其中未重疊的有效數(shù)據(jù)的偏移量和長度,將重疊到達的有效數(shù)據(jù)包中未重疊的有效數(shù)據(jù)存儲至第一數(shù)組,本申請實施例不加以限定。相對于直接將重疊到達的有效數(shù)據(jù)包的全部有效數(shù)據(jù)存儲至第一數(shù)組,若需要判斷重疊到達的有效數(shù)據(jù)包具體的重疊情況,然后相應地丟棄或存儲,計算量會稍大一點。
優(yōu)選地,在本申請另一個優(yōu)選的實施例中,步驟130包括:
子步驟131,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第一數(shù)組的有效數(shù)據(jù)的重疊情況。
如前述,在實際應用中,還未存儲至第一數(shù)組的有效數(shù)據(jù)包可能會與第一數(shù)組中的有效數(shù)組有重疊,而且對于有重疊的有效數(shù)據(jù)包,根據(jù)具體的重疊部分,又可以分為全部重疊和部分重疊。其中,全部重疊是指有效數(shù)據(jù)包中的有效數(shù)據(jù)對應在第一數(shù)組中的存儲空間已經全部存儲過有效數(shù)據(jù),例如圖1c中的有效數(shù)據(jù)包case3;部分重疊是指有效數(shù)據(jù)包中的有效數(shù)據(jù)對應在第一數(shù)組中的部分存儲空間已經存儲過有效數(shù)據(jù),例如圖1c中的有效數(shù)據(jù)包case6。對于不重疊的有效數(shù)據(jù)包、全部重疊的有效數(shù)據(jù)包以及部分重疊的有效數(shù)據(jù)包,本申請實施例只需要將其中未存儲至第一數(shù)組的有效數(shù)據(jù)存儲至第一數(shù)組。因此,首先需要根據(jù)有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第一數(shù)組的有效數(shù)據(jù)的重疊情況。
子步驟132,如果第一數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄。
如果第一數(shù)組中存在與有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),說明第一數(shù)組中對應該有效數(shù)據(jù)包的存儲空間已經存有該有效數(shù)據(jù)包中的有效數(shù)據(jù),則不需要將有效數(shù)據(jù)包中的有效數(shù)據(jù)再次存儲至對應存儲空間,因此可以直接將有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,也即可以直接將該有效數(shù)據(jù)包丟棄。例如,對于圖1c中的有效數(shù)據(jù)包case3,則可以將其直接丟棄。
子步驟133,如果第一數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù)據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第一偏移量和第一數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第一數(shù)組的第一偏移量位置開始存儲,直至存儲長度為所述第一數(shù)據(jù)長度。
如果第一數(shù)組中存在與有效數(shù)據(jù)包部分重疊的有效數(shù)據(jù),說明第一數(shù)組中對應該有效數(shù)據(jù)包的存儲空間中的部分存儲空間已經存有該有效數(shù)據(jù)包中的對應的部分有效數(shù)據(jù),那么對于重疊部分的有效數(shù)據(jù),則不需要將重疊部分的有效數(shù)據(jù)再次存儲至對應存儲空間,可以直接將有效數(shù)據(jù)包中的重疊部分的有效數(shù)據(jù)丟棄;而對于不重疊的有效數(shù)據(jù),仍需要按照不重疊的有效 數(shù)據(jù)的偏移量和數(shù)據(jù)長度,將其存儲至第一數(shù)組對應存儲空間。
例如,對于圖1c中的有效數(shù)據(jù)包case6,偏移量offset=450,數(shù)據(jù)長度len=100。此時,第一數(shù)組中偏移0到偏移249、偏移300到偏移399、偏移500到偏移599的存儲空間位置已經存儲數(shù)據(jù),可以看出,對于case6而言,其對應偏移500至偏移549存儲空間位置的有效數(shù)據(jù)已經存在于之前的有效數(shù)據(jù)包中,被存儲至第一數(shù)值,對于此部分重疊的有效數(shù)據(jù),可以直接丟棄;而對于另外的對應偏移450至499的存儲空間位置的有效數(shù)據(jù),則可以按照此不重疊部分的有效數(shù)據(jù)的偏移量和數(shù)據(jù)長度,按序依次將其存儲至第一數(shù)組對應存儲空間。
子步驟134,如果第一數(shù)組中不存在與所述有效數(shù)據(jù)重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第一數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
而如果第一數(shù)組中不存在與所述有效數(shù)據(jù)重疊的有效數(shù)據(jù),例如圖1c中的有效數(shù)據(jù)包case1、case2、case5,則可以直接將有效數(shù)據(jù)包的有效數(shù)據(jù)在第一數(shù)組的對應有效數(shù)據(jù)包的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
步驟140,當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。
本步驟是針對將服務器側有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲,與前述的步驟130類似,在此不再贅述。其中,有效數(shù)據(jù)包屬于服務器,是指該有效數(shù)據(jù)包是由服務器響應的有效數(shù)據(jù)包。
在本申請的另一個優(yōu)選地實施例中,步驟140,包括:
子步驟141,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第二數(shù)組的有效數(shù)據(jù)的重疊情況。
子步驟142,如果第二數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄。
子步驟143,如果第二數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù) 據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第二偏移量和第二數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第二數(shù)組的第二偏移量位置開始存儲,直至存儲長度為所述第二數(shù)據(jù)長度。
子步驟144,如果第二數(shù)組中不存在與所述有效數(shù)據(jù)重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第二數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
子步驟141至子步驟14是針對將服務器側有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲,與前述的子步驟131至子步驟134類似,在此不再贅述。
在本申請另一個優(yōu)選地實施例中,在步驟130、步驟140之后,還包括:
步驟150,在當前tcp連接結束后,輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)。
在本申請實施例中,經過前述步驟110-140之后,第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)已經是完成流重組的流數(shù)據(jù),因此在輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)的過程中,只需要將第一數(shù)組和/或第二數(shù)組的首地址和數(shù)據(jù)長度傳遞出來,即可以依次獲取第一數(shù)組和/或第二數(shù)組中的流數(shù)據(jù)。
其中tcp連接結束判斷的主要依據(jù)是tcp流正常結束(如步驟110中所述的tcp關閉連接)、被rst(tcp首部中的6個標志比特之一,表示重置連接、復位連接)中斷或者鏈接超時釋放三種情況。
在本申請實施例中,對于上述三種方式導致的tcp連接結束的情況,都可以輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)。當然,也可以根據(jù)需求設定只在上述的三種方式中的任意一種或多種方式導致的tcp連接結束的情況下,輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù),對此,本申請實施例不加以限定。
在本申請實施例中,首先針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。簡化了流重組過程中的判斷邏輯以及運算過程,從 而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
另外,在本申請又一個優(yōu)選地實施例中,在tcp連接建立成功之后,再創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,從而可以有效地避免因為受到synflood(拒絕服務)攻擊,而耗費大量的系統(tǒng)內存,影響系統(tǒng)的正常運行的問題。
實施例二
本申請實施例對客戶端發(fā)送的數(shù)據(jù)包的重組過程進行介紹。
參照圖2,示出了本申請的一種tcp流重組方法實施例的步驟流程圖,具體可以包括如下步驟:
步驟208,當接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;如果syn包是來自客戶端,則進入步驟210;
步驟210記錄客戶端的初始序列號isn(c)。
當然,記錄了客戶端的isn(c)后,可以計算第一糾偏值isn(c)+1。如果syn包是來自服務器,可以不處理。
在實際應用中,tcp是面向連接的傳輸協(xié)議,即在利用tcp進行數(shù)據(jù)傳輸之前,必須首先建立連接關系。如實施例一步驟110中所述的客戶端與服務器之間,tcp連接的第一次握手過程,是客戶端先發(fā)送syn包至服務器。然后服務器返回一個syn包和ack包。
當然,實際應用中對于第一糾偏值,可以在如圖1b的過程中,在收到客戶端的ack包時,直接從ack包中提取isn(c)+1作為糾偏值。也可以在收到第一個客戶端的有效數(shù)據(jù)包時,從該有效數(shù)據(jù)包中提取tcp序列號isn(c)+1作為第一糾偏值。
步驟212,在接收所述tcp連接的屬于客戶端的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則進入步驟214。
在實際應用中,對于tcp連接下,接收到的數(shù)據(jù)包,其中包括含有tcp載荷的數(shù)據(jù)包,不含有tcp載荷數(shù)據(jù)包。其中,含有tcp載荷的數(shù)據(jù)包, 稱為有效數(shù)據(jù)包,而對于本申請而言,針對的是含有tcp載荷的有效數(shù)據(jù)包的流重組,所以,在本申請實施例中,在接收tcp連接的數(shù)據(jù)包時,會判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則繼續(xù)執(zhí)行后續(xù)的步驟,而若接收到的數(shù)據(jù)包不是含有tcp載荷的有效數(shù)據(jù)包,則可以忽略本數(shù)據(jù)。
步驟214,判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù)據(jù)包;如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則進入步驟216。
在本申請實施例中,在一次tcp建立連接到結束連接的過程中,接收到客戶端側的數(shù)據(jù)包,可以分為以下四種情況:1)建立連接的syn包;2)第一個含有tcp載荷的數(shù)據(jù)包;3)其他含有tcp載荷的數(shù)據(jù)包;4)終止連接的fin/rst包。
其中,若接收到的有效數(shù)據(jù)包是第一個含有tcp載荷的數(shù)據(jù)包,即第一個有效數(shù)據(jù)包,則此時需要創(chuàng)建第一數(shù)組,存儲該有效數(shù)據(jù)包中的有效數(shù)據(jù),從而在本次tcp連接,對于以后接收到的其他含有tcp載荷的數(shù)據(jù)包,將其中的有效數(shù)據(jù)都存儲于該以創(chuàng)建的第一數(shù)組中。而對于建立連接的syn包,其作用只是為了建立tcp連接,其中的數(shù)據(jù)并不是必須要存儲于第一數(shù)組中,所以若接收的數(shù)據(jù)包是建立連接的tcp包,此時并不需要創(chuàng)建第一數(shù)組,同樣對于終止連接的fin/rst包,也不需要創(chuàng)建第一數(shù)組。
步驟218,創(chuàng)建屬于客戶端的第一數(shù)組。
本申請實施例是針對客戶端側的數(shù)據(jù)包,進行數(shù)據(jù)流重組。所以,此時可以只需創(chuàng)建屬于客戶端的第一分組,用以存儲來自客戶端的有效數(shù)據(jù)包中的有效數(shù)據(jù)。
在本申請實施例中,若接收的客戶端的數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則創(chuàng)建第一數(shù)組,此時是創(chuàng)建第一數(shù)組的最佳時機。但是需要說明的是,第一數(shù)組并不是必須在接收到第一個有效數(shù)據(jù)包之后才可以創(chuàng)建的,其也可以在本步驟之前的任一步驟之前預先創(chuàng)建,對此本申請實施例不加以限定。
步驟220,計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長度作為數(shù)據(jù)長度。
如圖3所示tcp數(shù)據(jù)包的結構示意圖。其中紅色框中部分加上可選選 項、填充可以認為是tcp報頭信息,用戶數(shù)據(jù)則可認為是tcp載荷,而用戶數(shù)據(jù)中的數(shù)據(jù)部分可認為是本申請所述的有效數(shù)據(jù)。
在本申請實施例中,有效數(shù)據(jù)包中有效數(shù)據(jù)的長度為數(shù)據(jù)長度。在實際應用中,有效數(shù)據(jù)包中的有效數(shù)據(jù)可能為多種數(shù)據(jù)結構,此時需要針對性地利用不同的方法計算有效數(shù)據(jù)的長度。在本申請實施例中,可以利用任何一種現(xiàn)有的可利用技術計算有效數(shù)據(jù)包中有效數(shù)據(jù)的長度,對此本申請實施例不加以限定。
步驟222,根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第一糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第一糾偏值為屬于客戶端的syn包的初始序列號+1。
在本申請實施例中,可以設定有效數(shù)據(jù)的偏移量為有效數(shù)據(jù)包的tcp序列號和第一糾偏值之差。其中tcp序列號是已知的,存儲于tcp數(shù)據(jù)包中,即為圖2a中的數(shù)據(jù)序號。第一糾偏值為syn包的初始序列號加1,因為一個初始序列號將占用一個序號,所以要加1。其中初始序列號(isn(c))隨時間而變化的,而且不同的操作系統(tǒng)也會有不同的實現(xiàn)方式,所以每個連接的初始序列號是不同的。如實施例一所述的tcp連接過程可知,第一糾偏值在tcp連接過程中即可獲得并預先記錄。
由tcp建立連接的過程可知,客戶端發(fā)送syn包給服務器時,會在syn包中寫入一個初始序列號,其中在本申請中,客戶端發(fā)送的syn包可以稱為屬于客戶端的syn包,然后服務器返回syn/ack包,服務器的syn/ack包實際上是一個syn包,此時服務器會將客戶端的syn的isn(c)+1作為確定序列號返回客戶端,同時服務器的響應的syn包中也會有一個服務器的初始序列號isn(s)。客戶端在發(fā)送ack時會攜帶客戶端的syn的isn(c)+1的序列號以及isn(s)+1返回服務器,然后建立連接。建立連接成功后,則客戶端會開始進行數(shù)據(jù)傳輸,有效數(shù)據(jù)包則中則會在tcp序列號中以isn(c)+1為開始字節(jié),記錄客戶端發(fā)送的字節(jié)數(shù),每發(fā)送一個有效數(shù)據(jù)包,則在tcp序列號中記錄該次發(fā)送的有效數(shù)據(jù)的開頭字節(jié)。服務器開始響應有效數(shù)據(jù)包時,則會在有效數(shù)據(jù)包中以isn(s)+1為開始字節(jié), 記錄服務器響應的字節(jié)數(shù),每發(fā)送一個有效數(shù)據(jù)包,則在tcp序列號中記錄該次發(fā)送的有效數(shù)據(jù)的開頭字節(jié)。
因此,本申請實施例如果要對客戶端的數(shù)據(jù)包重組,則可以在接收到客戶端發(fā)送的syn數(shù)據(jù)包時,獲取syn包中的isn(c),然后計算第一糾偏差值isn(c)+1并記錄?;蛘咴诮邮盏娇蛻舳税l(fā)送的ack數(shù)據(jù)包時,獲取該ack包中的確認序列號isn(c)+1,并記錄其為第一糾偏差值?;蛘咴诮⑦B接后,接收到的第一個有效數(shù)據(jù)包時,獲取其tcp序列號,因為其是從第0字節(jié)開始發(fā)送數(shù)據(jù),其應該也為isn(c)+1,可以記錄為針對客戶端的第一糾偏差值。
需要說明的是,在本申請實施例中步驟222也可以在步驟220之前執(zhí)行,或者是與步驟220同時執(zhí)行,對此本申請實施例不加以限定。
步驟224,判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第一數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第一數(shù)組的數(shù)組長度,則進入步驟226。
在本申請實施例中,因為有效數(shù)據(jù)包具有偏移量,所以在將接收到的有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至第一數(shù)組之前,還需要考慮的是,當前的第一數(shù)組的數(shù)組長度是否足夠存儲接收到的有效數(shù)據(jù)。
例如,假設第一數(shù)組的長度為20,按序標號為1-20,接收到的有效數(shù)據(jù)包的偏移量為11,數(shù)據(jù)長度為10。則對于該有效數(shù)據(jù)包中的有效數(shù)據(jù),會從第一數(shù)組中第12個位置開始記錄,此時第一數(shù)組的長度只可以存儲數(shù)據(jù)長度為9的有效數(shù)據(jù),無法完整存儲接收到的該偏移量為11,數(shù)據(jù)長度為10的有效數(shù)據(jù)包的有效數(shù)據(jù)。
所以,在本申請實施例中,會判斷接收到的有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第一數(shù)組的數(shù)組長度,若有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第一數(shù)組的數(shù)組長度,則需要新建一個比原來的第一數(shù)組更長的第一數(shù)組;而若有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,不大于第一數(shù)組的數(shù)組長度,則繼續(xù)使用原來的第一數(shù)組,不需要新建第一數(shù)組。
步驟230,創(chuàng)建一個新的第一數(shù)組,所述新的第一數(shù)組的數(shù)組長度超過 原來的第一數(shù)組第一閾值。
由步驟224所述,創(chuàng)建的新的第一數(shù)組的數(shù)組長度必然要超過原來的第一數(shù)組。在本申請實施例中,設定新的第一數(shù)組的數(shù)組長度超過原來的第一數(shù)組的數(shù)組長度第一閾值。其中第一閾值可以為原來的第一數(shù)組的數(shù)組長度的整數(shù)倍,例如,原來的第一數(shù)組的數(shù)組長度為20,創(chuàng)建的新的第一數(shù)組的數(shù)組長度為40,此時新的第一數(shù)組的數(shù)組長度超過原來的第一數(shù)組的數(shù)組長度20,即為此時的第一閾值,該第一閾值為原來的第一數(shù)組的數(shù)組長度的1倍。當然第一閾值也可以為其他取值,可以根據(jù)需求靈活設定,對此本申請實施例不加以限定。
另外,若原來的第一數(shù)組為前述的動態(tài)數(shù)組,則此時可以不另外創(chuàng)建一個新的第一數(shù)組,而可以利用函數(shù)(如redim函數(shù))重新指出原來的第一數(shù)組的大小,將其數(shù)組長度修改為超過其原來數(shù)組長度第一閾值。此時相對于原來數(shù)組長度的第一數(shù)組,可以稱修改過數(shù)據(jù)長度的第一數(shù)組為新的第一數(shù)組。
步驟226,將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第一數(shù)組中。
為了保證重組數(shù)據(jù)的完整性,在本申請實施例中,在創(chuàng)建了新的第一數(shù)組后,會將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,然后繼續(xù)利用該新的第一數(shù)組,存儲接收到的還未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)。
其中,將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,可以理解為,保持第一數(shù)組中存儲的數(shù)據(jù)所屬的有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度不變,將其相應地存儲于新的第一數(shù)組中。
另外,若該新的第一數(shù)組為步驟230中所述的修改了數(shù)組長度的動態(tài)數(shù)組,則此時不需要復制的過程,直接繼續(xù)將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第一數(shù)組中。
步驟228,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。
需要說明的是,若經過步驟230后創(chuàng)建一個新的第一數(shù)組,則針對接收 到的未存儲的有效數(shù)據(jù)包,此時本步驟中的第一數(shù)組是指步驟230創(chuàng)建的新的第一數(shù)組。若未創(chuàng)建一個新的第一數(shù)組,則本步驟中的第一數(shù)組仍然為步驟218創(chuàng)建的第一數(shù)組。
在本申請另一個優(yōu)選地實施例中,還包括:
步驟230,在當前tcp連接結束后,輸出第一數(shù)組中的數(shù)據(jù)。
那么在當前tcp連接后,可以將內存的第一數(shù)組中的數(shù)據(jù)輸出至指定存儲空間,比如輸出至硬盤中進行存儲。
在本申請另一個優(yōu)選的實施例中,在本申請實施例中,步驟230包括:
子步驟2301,當在所述tcp連接下接收到任一個非指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第一時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù)。
在實際應用中,在tcp連接情況下,若接收到任一個非指示關閉連接的數(shù)據(jù)包后,在一定時間內都未執(zhí)行任何操作,即tcp連接的空閑時間超過一定時間,則此時可判定結束當前的tcp連接。在本申請實施例中,設定tcp連接的空閑時間超過第一時間周期,則結束所述tcp連接。其中,第一時間周期可以根據(jù)需求靈活設定,對此本申請實施例不加以限定。
在tcp連接結束后,即將第一數(shù)組中的數(shù)據(jù)輸出。同樣,若經過步驟230后創(chuàng)建一個新的第一數(shù)組,則此時本步驟中的第一數(shù)組是指步驟230創(chuàng)建的新的第一數(shù)組。若未創(chuàng)建一個新的第一數(shù)組,則本步驟中的第一數(shù)組仍然為步驟216創(chuàng)建的第一數(shù)組。
而在tcp連接下,接收到任一個非指示關閉連接的數(shù)據(jù)包后,若判斷出所述tcp連接的空閑時間未超過第一時間周期,則不結束tcp連接,此時也不會輸出第一數(shù)組中的數(shù)據(jù)。
和/或,子步驟2302,當在所述tcp連接下接收到指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第二時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù)。
還有另外一種情況,在tcp連接情況下,若接收到指示關閉連接的數(shù)據(jù)包后,判斷出tcp連接的空閑時間超過第二時間周期,則結束tcp連接, 輸出第一數(shù)組中的數(shù)據(jù)。而若tcp連接的空閑時間未超過第二時間周期,則不結束tcp連接,也不會輸出第一數(shù)組中的數(shù)據(jù)。其中的第二時間周期也可以根據(jù)需求靈活設定,對比本申請實施例也不加以限定。而且,同樣若經過步驟230后創(chuàng)建一個新的第一數(shù)組,則此時本步驟中的第一數(shù)組是指步驟230創(chuàng)建的新的第一數(shù)組。若未創(chuàng)建一個新的第一數(shù)組,則本步驟中的第一數(shù)組仍然為步驟216創(chuàng)建的第一數(shù)組。
另外,在本申請實施例中,也可以在tcp連接下接收到指示關閉連接的數(shù)據(jù)包后,直接結束tcp連接,輸出第一數(shù)組中的數(shù)據(jù),而不需要判斷tcp連接的空閑時間是否超過第二時間周期,即相當于此時的第二時間周期為零。
在本申請一優(yōu)選的實施例中,在本申請實施例中,還包括:
步驟232,在將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中之后,將原來的第一數(shù)組釋放。
在本申請實施例中,在將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中之后,此時原來的第一數(shù)組就不再具有任何作用,此時為了避免占用內存,可以將原來的第一數(shù)組釋放,例如刪除第一數(shù)組。該步驟可以在步驟226之后執(zhí)行,或者在步驟226之后的任一步驟之后執(zhí)行,對此本申請實施例不加以限定。
另外,需要說明的是,若該新的第一數(shù)組為步驟230中所述的修改了數(shù)組長度的動態(tài)數(shù)組,則此時不需要將原來的第一數(shù)組釋放。
本申請實施例是針對一tcp連接,對由客戶端發(fā)送的有效數(shù)據(jù)包中的有效數(shù)據(jù)進行重組。具體執(zhí)行過程為,首先針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。從而簡化了對于客戶端的流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
而且,在本申請實施例中,還會在接收到的有效數(shù)據(jù)包的偏置量和數(shù)據(jù)長度之和超出第一數(shù)組長度時,利用新的第一數(shù)組替換原有的第一數(shù)組。在保證流重組的效率的同時,提高了流重組的準確性,從而使其更容易滿足系統(tǒng)性能方面的需求。
實施例三
本申請實施例對服務器響應的數(shù)據(jù)包的重組過程進行介紹。
參照圖3,示出了本申請的一種tcp流重組方法實施例的步驟流程圖,具體可以包括如下步驟:
步驟308,接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;如果syn包是來自服務器,則進入步驟310。
步驟310,記錄服務器的初始序列號isn(s);
當然,在記錄了服務器的初始序列號isn(s)后,可以計算第二糾偏值isn(s)+1。
在本申請實施例中,如果syn包是來自客戶端,可以不出來。
步驟312,在接收所述tcp連接的屬于服務器的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則進入步驟312。
步驟314,判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù)據(jù)包;如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則進入步驟314。
步驟316,創(chuàng)建屬于服務器的第二數(shù)組。
本申請實施例是針對服務器側的數(shù)據(jù)包,進行數(shù)據(jù)流重組。所以,此時可以只需創(chuàng)建屬于服務器的第一分組,用以存儲來自服務器的有效數(shù)據(jù)包中的有效數(shù)據(jù)。
步驟318,計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長度作為數(shù)據(jù)長度。
步驟320,根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第二糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第二糾偏值為屬于服務器的syn包的初始序列號+1。
本申請實施例如果要對服務器的數(shù)據(jù)包重組,則可以在獲取到服務器響 應的syn數(shù)據(jù)包時,獲取syn包中的isn(s),然后計算第二糾偏差值isn(s)+1并記錄?;蛘咴诮邮盏娇蛻舳税l(fā)送的ack數(shù)據(jù)包時,獲取該ack包中的確認序列號isn(s),并記錄其為第二糾偏差值。或者在建立連接后,接收到的第一個服務器響應的有效數(shù)據(jù)包時,獲取其tcp序列號,因為其是從第0字節(jié)開始發(fā)送數(shù)據(jù),其應該也為isn(s)+1,可以記錄為針對服務器的第二糾偏差值。
步驟322,判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第二數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第二數(shù)組的數(shù)組長度,則進入步驟324。
步驟324,創(chuàng)建一個新的第二數(shù)組,所述新的第二數(shù)組的數(shù)組長度超過原來的第一數(shù)組第二閾值。
步驟326,將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第二數(shù)組中。
步驟328,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。
在本申請另一個優(yōu)選地實施例中,還包括:
步驟330,在當前tcp連接結束后,輸出第二數(shù)組中的數(shù)據(jù)。
在本申請另一個優(yōu)選地實施例中,還包括:
步驟332,在將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中之后,將原來的第二數(shù)組釋放。
本步驟可以在步驟326之后的任意時刻執(zhí)行,對此本申請實施例不加以限定。
本申請實施例對服務器側的有效數(shù)據(jù)包的重組原理與實施例二對客戶端側的數(shù)據(jù)包的重組原理基本類似,參照實施例一類似的步驟即可,在此不再詳述。
本申請實施例是針對一tcp連接,對由服務器發(fā)送的有效數(shù)據(jù)包中的有效數(shù)據(jù)進行重組。具體執(zhí)行過程為,首先針對一tcp連接,創(chuàng)建屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包, 計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。從而簡化了對于服務器側的流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
而且,在本申請實施例中,還會在接收到的有效數(shù)據(jù)包的偏置量和數(shù)據(jù)長度之和超出第一數(shù)組長度時,利用新的第二數(shù)組替換原有的第二數(shù)組。在保證流重組的效率的同時,提高了流重組的準確性,從而使其更容易滿足系統(tǒng)性能方面的需求。
實施例四
本實施例介紹同時對客戶端的數(shù)據(jù)包和對服務器的數(shù)據(jù)包進行重組的一種優(yōu)選的過程。
參照圖4,示出了本申請的一種tcp流重組方法實施例的步驟流程圖,具體可以包括如下步驟:
步驟410,當接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;如果syn包是來自客戶端,則進入步驟412;如果syn包是來自服務器,則進入步驟414;
步驟412,記錄客戶端的初始序列號isn(c);
步驟414,記錄服務器的初始序列號isn(s)。
而且在實際應用中,客戶端和服務器的初始序列號isn都是隨機產生的,客戶端的isn和服務器的初始序列號isn相同的可能性非常小。
所以,在本申請實施例中,對于接收到的syn包,先判斷syn包是來自客戶端發(fā)送還來自服務器,進而確定是記錄客戶端的初始序列號isn(c)還是服務器的初始序列號isn(s)。
結合圖1b的描述,本申請實施例如果要對客戶端的數(shù)據(jù)包重組,則可以在接收到客戶端發(fā)送的syn數(shù)據(jù)包時,獲取syn包中的isn(c),然后計算第一糾偏差值isn(c)+1并記錄。或者在接收到客戶端發(fā)送的ack數(shù)據(jù)包時,獲取該ack包中的確認序列號isn(c)+1,并記錄其為第一糾 偏差值。或者在建立連接后,接收到的第一個客戶端的有效數(shù)據(jù)包時,獲取其tcp序列號,因為其是從第0字節(jié)開始發(fā)送數(shù)據(jù),其應該也為isn(c)+1,可以記錄為針對客戶端的第一糾偏差值。
本申請實施例如果要對服務器響應的數(shù)據(jù)包重組,則可以在獲取到服務器響應的syn數(shù)據(jù)包時,獲取服務器的syn包中的isn(s),然后計算第二糾偏差值isn(s)+1并記錄?;蛘咴诮邮盏娇蛻舳税l(fā)送的ack數(shù)據(jù)包時,獲取該ack包中的確認序列號isn(s)+1,并記錄其為第二糾偏差值?;蛘咴诮⑦B接后,接收到的服務器的第一個有效數(shù)據(jù)包時,獲取其tcp序列號,因為其是從第0字節(jié)開始發(fā)送數(shù)據(jù),其應該也為isn(s)+1,可以記錄為針對客戶端的第二糾偏差值。
步驟416,在獲取到所述tcp連接的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則進入步驟418。
如果所接收到的數(shù)據(jù)包不是含有tcp載荷的有效數(shù)據(jù)包,則不進行處理。
步驟418,判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù)據(jù)包;如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則進入步驟420。
步驟420,判斷所述有效數(shù)據(jù)包是否屬于客戶端;如果所述有效數(shù)據(jù)包屬于客戶端,則進入步驟422;如果所述有效數(shù)據(jù)包屬于服務器,則進入步驟424。
步驟422,創(chuàng)建屬于客戶端的第一數(shù)組。進入步驟426。
步驟424,創(chuàng)建屬于服務器的第二數(shù)組。進入步驟426。
在本申請實施例中,在一次tcp建立連接到結束連接的過程中,接收到的數(shù)據(jù)包,可以分為以下四種情況:1)建立連接的syn包;2)第一個含有tcp載荷的數(shù)據(jù)包;3)其他含有tcp載荷的數(shù)據(jù)包;4)終止連接的fin/rst包。
其中,若接收到的有效數(shù)據(jù)包是第一個含有tcp載荷的數(shù)據(jù)包,即第一個有效數(shù)據(jù)包,則此時需要創(chuàng)建第一數(shù)組,存儲該有效數(shù)據(jù)包中的有效數(shù) 據(jù),從而在本次tcp連接,對于以后接收到的其他含有tcp載荷的數(shù)據(jù)包,將其中的有效數(shù)據(jù)都存儲于該以創(chuàng)建的第一數(shù)組中。而對于建立連接的syn包,其作用只是為了建立tcp連接,其中的數(shù)據(jù)并不是必須要存儲于第一數(shù)組中,所以若接收的數(shù)據(jù)包是建立連接的tcp包,此時并不需要創(chuàng)建第一數(shù)組,同樣對于終止連接的fin/rst包,也不需要創(chuàng)建第一數(shù)組。
步驟426,計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長度作為數(shù)據(jù)長度。根據(jù)有效數(shù)據(jù)包所屬的客戶端進入步驟428或者步驟430。
步驟428,當所述有效數(shù)據(jù)包屬于客戶端,則根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第一糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第一糾偏值為屬于客戶端的syn包的初始序列號+1。進入步驟432。
本申請實施例如果要對客戶端的數(shù)據(jù)包重組,則可以在接收到客戶端發(fā)送的syn數(shù)據(jù)包時,獲取syn包中的isn(c),然后計算第一糾偏差值isn(c)+1并記錄?;蛘咴诮邮盏娇蛻舳税l(fā)送的ack數(shù)據(jù)包時,獲取該ack包中的確認序列號isn(c)+1,并記錄其為第一糾偏差值?;蛘咴诮⑦B接后,接收到的第一個有效數(shù)據(jù)包時,獲取其tcp序列號,因為其是從第0字節(jié)開始發(fā)送數(shù)據(jù),其應該也為isn(c)+1,可以記錄為針對客戶端的第一糾偏差值。
本申請實施例如果要對服務器的數(shù)據(jù)包重組,則可以在獲取到服務器響應的syn數(shù)據(jù)包時,獲取syn包中的isn(s),然后計算第二糾偏差值isn(s)+1并記錄?;蛘咴诮邮盏娇蛻舳税l(fā)送的ack數(shù)據(jù)包時,獲取該ack包中的確認序列號isn(s),并記錄其為第二糾偏差值?;蛘咴诮⑦B接后,接收到的第一個服務器響應的有效數(shù)據(jù)包時,獲取其tcp序列號,因為其是從第0字節(jié)開始發(fā)送數(shù)據(jù),其應該也為isn(s)+1,可以記錄為針對服務器的第二糾偏差值。
步驟430,當所述有效數(shù)據(jù)包屬于服務器,則根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第二糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第二糾偏值為屬于服務器的syn包的初始序列號+1。進入步驟438。
步驟432,當所述有效數(shù)據(jù)包屬于客戶端,則判斷所述有效數(shù)據(jù)包的偏 移量和數(shù)據(jù)長度之和,是否大于第一數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第一數(shù)組的數(shù)組長度,則進入步驟434,然后進入步驟436;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,不大于第一數(shù)組的數(shù)組長度,則進入步驟446。
步驟434,創(chuàng)建一個新的第一數(shù)組,所述新的第一數(shù)組的數(shù)組長度超過原來的第一數(shù)組第一閾值。
步驟436,將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第一數(shù)組中。
步驟438,當所述有效數(shù)據(jù)包屬于服務器,則判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第二數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第二數(shù)組的數(shù)組長度,則進入步驟440,然后進入步驟442;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,不大于第二數(shù)組的數(shù)組長度,則進入步驟448。
步驟440,創(chuàng)建一個新的第二數(shù)組,所述新的第二數(shù)組的數(shù)組長度超過原來的第一數(shù)組第二閾值。
步驟442,將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第二數(shù)組中。
步驟446,當所述有效數(shù)據(jù)包屬于客戶端時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。
步驟448,當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。
在本申請另一個優(yōu)選地實施例中,還包括:
步驟450,在當前tcp連接結束后,輸出第一數(shù)組和第二數(shù)組中的數(shù)據(jù)。
本申請實施例是針對一tcp連接,分別對由客戶端和服務器發(fā)送的有效數(shù)據(jù)包中的有效數(shù)據(jù)進行重組。具體執(zhí)行過程為,首先針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和屬于服務器的第二數(shù)組,然后針對所述tcp 連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述客戶端的有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至屬于客戶端的第二數(shù)組,將所述服務器的有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至屬于服務器的第二數(shù)組。從而實現(xiàn)了同時分別對于客戶端以及服務器側的數(shù)據(jù)流的重組,而且簡化了對于客戶端側以及服務器側的流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
而且,在本申請實施例中,在建立tcp連接時會判斷接收到的syn包是來自客戶端發(fā)送還來自服務器,進而決定記錄客戶端的初始序列號isn還是服務器的初始序列號isn;在接收tcp連接的數(shù)據(jù)包時,還會判斷接收到的數(shù)據(jù)包種類,并且針對接收到的數(shù)據(jù)包的種類不同,執(zhí)行不同的操作;同時還會分別在接收到的有效數(shù)據(jù)包的偏置量和數(shù)據(jù)長度之和超出第一數(shù)組和第二數(shù)組長度時,分別利用新的第一數(shù)組和第二數(shù)組替換原有的第一數(shù)組和第二數(shù)組。在保證流重組的效率的同時,提高了流重組的準確性,從而使其更容易滿足系統(tǒng)性能方面的需求。
并且,是在tcp連接建立成功之后,再創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,相對于在tcp連接還未成功建立之前,在創(chuàng)建屬于客戶端的第一數(shù)組,和屬于服務器的第二數(shù)組,延遲了創(chuàng)建用以進行數(shù)據(jù)流重組的第一數(shù)組和第二數(shù)組??梢杂行П苊鈙ynflood(拒絕服務)攻擊導致的資源被耗用過度的問題。
需要說明的是,對于方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領域技術人員應該知悉,本申請實施例并不受所描述的動作順序的限制,因為依據(jù)本申請實施例,某些步驟可以采用其他順序或者同時進行。其次,本領域技術人員也應該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作并不一定是本申請實施例所必須的。
實施例五
參照圖5,示出了本申請的一種tcp流重組裝置實施例的結構框圖,具 體可以包括如下模塊:
第一創(chuàng)建模塊510,適于針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
在本申請另一個優(yōu)選地實施例中,所述第一創(chuàng)建模塊510,包括:
第一創(chuàng)建子模塊,適于在所述tcp連接建立成功之后,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
在本申請另一個優(yōu)選地實施例中,所述第一創(chuàng)建模塊510,包括:
第一內存創(chuàng)建子模塊,適于針對一tcp連接,在內存中創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。
計算模塊520,適于針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度。
第一存儲模塊530,適于根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。
在本申請另一個優(yōu)選的實施例中,第一存儲模塊530,包括:
第一重疊判斷子模塊,適于根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第一數(shù)組的有效數(shù)據(jù)的重疊情況。
第一丟棄子模塊,適于如果第一數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄。
第一丟棄存儲子模塊,適于如果第一數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù)據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第一偏移量和第一數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第一數(shù)組的第一偏移量位置開始存儲,直至存儲長度為所述第一數(shù)據(jù)長度。
第一存儲子模塊,適于如果第一數(shù)組中不存在與所述有效數(shù)據(jù)全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第一數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
第二存儲模塊540,適于當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務 器的第二數(shù)組存儲。
在本申請另一個優(yōu)選的實施例中,第二存儲模塊540,包括:
第二重疊判斷子模塊,適于根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,判斷所述有效數(shù)據(jù)包的有效數(shù)據(jù)與第二數(shù)組的有效數(shù)據(jù)的重疊情況。
第二丟棄子模塊,適于如果第二數(shù)組中存在與所述有效數(shù)據(jù)包全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄。
第二丟棄存儲子模塊,適于如果第二數(shù)組中存在與所述有效數(shù)據(jù)部分重疊的有效數(shù)據(jù),將所述有效數(shù)據(jù)包中重疊部分的有效數(shù)據(jù)丟棄,并計算不重疊部分的有效數(shù)據(jù)的第二偏移量和第二數(shù)據(jù)長度,再將不重疊部分的有效數(shù)據(jù)在第二數(shù)組的第二偏移量位置開始存儲,直至存儲長度為所述第二數(shù)據(jù)長度。
第二丟棄存儲子模塊,適于如果第二數(shù)組中不存在與所述有效數(shù)據(jù)全部重疊的有效數(shù)據(jù),則將所述有效數(shù)據(jù)包的有效數(shù)據(jù)在第二數(shù)組的偏移量位置開始存儲,直至存儲長度為所述數(shù)據(jù)長度。
在本申請另一個優(yōu)選地實施例中,在第一存儲模塊530、第二存儲模塊540之后,還包括:
輸出模塊550,適于在當前tcp連接結束后,輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)。
在本申請實施例中,首先針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲,最后在當前tcp連接結束后,輸出第一數(shù)組和/或第二數(shù)組中的數(shù)據(jù)。簡化了流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
在本申請實施例中,首先針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載 荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。簡化了流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
另外,在本申請又一個優(yōu)選地實施例中,在tcp連接建立成功之后,再創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,從而可以有效地避免因為受到synflood(拒絕服務)攻擊,而耗費大量的系統(tǒng)內存,影響系統(tǒng)的正常運行的問題。
實施例六
參照圖6,示出了本申請的一種tcp流重組裝置實施例的結構框圖,具體可以包括如下模塊:
syn包判斷模塊610,適于當接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;如果syn包是來自客戶端,則進入第一記錄模塊620;如果syn包是來自服務器,則可以不處理。
第一記錄模塊620,適于記錄客戶端的初始序列號isn(c);
第一創(chuàng)建模塊630,適于針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組。具體包括:
tcp判斷子模塊631,適于在接收所述tcp連接的屬于客戶端的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則進入第一判斷子模塊632;
第一判斷子模塊632,適于判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù)據(jù)包;如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則進入第一數(shù)組創(chuàng)建子模塊633;
第一數(shù)組創(chuàng)建子模塊633,適于創(chuàng)建屬于客戶端的第一數(shù)組。
計算模塊640,適于針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度。具體包括:
數(shù)據(jù)長度計算子模塊641,適于計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長 度作為數(shù)據(jù)長度;
第一偏移量計算子模塊642,適于根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第一糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第一糾偏值為屬于客戶端的syn包的初始序列號+1。
第一判斷模塊650,適于判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第一數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第一數(shù)組的數(shù)組長度,則進入第一新數(shù)組創(chuàng)建模塊660;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,不大于第一數(shù)組的數(shù)組長度,則直接進入第一存儲模塊680。
第一新數(shù)組創(chuàng)建模塊660,適于創(chuàng)建一個新的第一數(shù)組,所述新的第一數(shù)組的數(shù)組長度超過原來的第一數(shù)組第一閾值。
第一復制存儲模塊670,適于將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第一數(shù)組中。
第一存儲模塊680,適于當所述有效數(shù)據(jù)包屬于客戶端時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。
在本申請另一個優(yōu)選地實施例中,還包括:
輸出模塊690,適于在當前tcp連接結束后,輸出第一數(shù)組中的數(shù)據(jù)。
在本申請一優(yōu)選的實施例中,在本申請實施例中,輸出模塊690,包括:
第一輸出子模塊,適于當在所述tcp連接下接收到任一個非指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第一時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù)。
和/或,第二輸出子模塊,適于當在所述tcp連接下接收到指示關閉連接的數(shù)據(jù)包后,判斷出所述tcp連接的空閑時間超過第二時間周期,則結束所述tcp連接,輸出第一數(shù)組中的數(shù)據(jù)。
在本申請一優(yōu)選的實施例中,在本申請實施例中,還包括:
第一釋放模塊,適于在將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一 數(shù)組中之后,將原來的第一數(shù)組釋放。
將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲本申請實施例是針對一tcp連接,對由客戶端發(fā)送的有效數(shù)據(jù)包中的有效數(shù)據(jù)進行重組。具體執(zhí)行過程為,首先針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。從而簡化了對于客戶端的流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
而且,在本申請實施例中,還會判斷接收到的數(shù)據(jù)包種類,并且針對接收到的數(shù)據(jù)包的種類不同,執(zhí)行不同的操作;同時還會在接收到的有效數(shù)據(jù)包的偏置量和數(shù)據(jù)長度之和超出第一數(shù)組長度時,利用新的第一數(shù)組替換原有的第一數(shù)組。在保證流重組的效率的同時,提高了流重組的準確性,從而使其更容易滿足系統(tǒng)性能方面的需求。
實施例七
參照圖7,示出了本申請的一種tcp流重組裝置實施例的結構框圖,具體可以包括如下模塊:
syn包判斷模塊710,適于當接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;如果syn包是來自服務器,則進入第二記錄模塊720;如果syn包是來自客戶端,則可以不處理;
第二記錄模塊720,適于則記錄服務器的初始序列號isn(s)。
第一創(chuàng)建模塊730,適于針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組。具體包括:
tcp判斷子模塊731,適于在接收所述tcp連接的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則進入第一判斷子模塊732。
第一判斷子模塊732,適于判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù) 據(jù)包;如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則進入第二數(shù)組創(chuàng)建子模塊733。
第二數(shù)組創(chuàng)建子模塊733,適于創(chuàng)建屬于服務器的第二數(shù)組。
計算模塊740,適于針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度。具體包括:
數(shù)據(jù)長度計算子模塊741,適于計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長度作為數(shù)據(jù)長度;
第二偏移量計算子模塊742,適于根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第二糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第二糾偏值為屬于服務器的syn包的初始序列號+1。
第二判斷模塊750,適于判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第二數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第二數(shù)組的數(shù)組長度,則進入第二新數(shù)組創(chuàng)建模塊760;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,不大于第二數(shù)組的數(shù)組長度,則直接進入第二存儲模塊780。
第二新數(shù)組創(chuàng)建模塊760,適于創(chuàng)建一個新的第二數(shù)組,所述新的第二數(shù)組的數(shù)組長度超過原來的第二數(shù)組第一閾值。
第二復制存儲模塊770,適于將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第二數(shù)組中。
第二存儲模塊780,適于當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。
在本申請另一個優(yōu)選地實施例中,還包括:
輸出模塊790,適于在當前tcp連接結束后,輸出第二數(shù)組中的數(shù)據(jù)。
在本申請另一個優(yōu)選的實施例中,還包括:
第二釋放模塊,適于在將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中之后,將原來的第二數(shù)組釋放。
其中,第二釋放模塊,可以在第二復制存儲模塊770之后,或者是在第二復制存儲模塊770之后的任一模塊之后,對此本申請不加以限制。
本申請實施例是針對一tcp連接,對由服務器發(fā)送的有效數(shù)據(jù)包中的有效數(shù)據(jù)進行重組。具體執(zhí)行過程為,首先針對一tcp連接,創(chuàng)建屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。從而簡化了對于服務器側的流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
而且,在本申請實施例中,同時還會在接收到的有效數(shù)據(jù)包的偏置量和數(shù)據(jù)長度之和超出第一數(shù)組長度時,利用新的第二數(shù)組替換原有的第二數(shù)組。在保證流重組的效率的同時,提高了流重組的準確性,從而使其更容易滿足系統(tǒng)性能方面的需求。
實施例八
參照圖8,示出了本申請的一種tcp流重組裝置實施例的結構框圖,具體可以包括如下模塊:
syn包判斷模塊800,適于當接收到syn包時,判斷所述syn包是來自客戶端還來自服務器;如果syn包是來自客戶端,則進入第一記錄模塊802;如果syn包是來自服務器,則進入第二記錄模塊804;
第一記錄模塊,適于記錄客戶端的初始序列號isn(c);
第二記錄模塊,適于記錄服務器的初始序列號isn(s)。
第一創(chuàng)建模塊810,適于針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和屬于服務器的第二數(shù)組。具體包括:
tcp判斷子模塊811,適于在接收所述tcp連接的數(shù)據(jù)包時,判斷所接收到的數(shù)據(jù)包是否為含有tcp載荷的有效數(shù)據(jù)包;如果所接收到的數(shù)據(jù)包是含有tcp載荷的有效數(shù)據(jù)包,則進入第一判斷子模塊812。
第一判斷子模塊812,適于判斷所述有效數(shù)據(jù)包是否為第一個有效數(shù) 據(jù)包;如果所述有效數(shù)據(jù)包是第一個有效數(shù)據(jù)包,則進入客戶端判斷子模塊813。
客戶端判斷子模塊813,適于判斷所述有效數(shù)據(jù)包是否屬于客戶端;如果所述有效數(shù)據(jù)包屬于客戶端,則進入第一數(shù)組創(chuàng)建子模塊814;如果所述有效數(shù)據(jù)包不屬于客戶端,則進入第二數(shù)組創(chuàng)建子模塊815。
第一數(shù)組創(chuàng)建子模塊814,適于創(chuàng)建屬于客戶端的第一數(shù)組。進入計算模塊820。
第二數(shù)組創(chuàng)建子模塊815,適于創(chuàng)建屬于服務器的第二數(shù)組。進入計算模塊820。
計算模塊820,適于針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度。具體包括:
數(shù)據(jù)長度計算子模塊821,適于計算所述有效數(shù)據(jù)包中有效數(shù)據(jù)的長度作為數(shù)據(jù)長度。
第一偏移量計算子模塊822,適于當所述有效數(shù)據(jù)包屬于客戶端,則根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第一糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第一糾偏值為屬于客戶端的syn包的初始序列號+1。進入第一判斷模塊830。
第二偏移量計算子模塊823,適于根據(jù)有效數(shù)據(jù)包的tcp序列號和預先記錄的第二糾偏值之差,確定所述有效數(shù)據(jù)包的偏移量;所述第二糾偏值為屬于服務器的syn包的初始序列號+1。進入第二判斷模塊860。
第一判斷模塊830,適于當所述有效數(shù)據(jù)包屬于客戶端,則判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第一數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第一數(shù)組的數(shù)組長度,則進入第一新數(shù)組創(chuàng)建模塊840,然后進入第一復制存儲模塊850;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,不大于第一數(shù)組的數(shù)組長度,則直接進入第一存儲模塊890。
第一新數(shù)組創(chuàng)建模塊840,適于創(chuàng)建一個新的第一數(shù)組,所述新的第一數(shù)組的數(shù)組長度超過原來的第一數(shù)組第一閾值。
第一復制存儲模塊850,適于將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第一數(shù)組中。
第二判斷模塊860,適于判斷所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,是否大于第二數(shù)組的數(shù)組長度;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,大于第二數(shù)組的數(shù)組長度,則進入第二新數(shù)組創(chuàng)建模塊870;如果所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度之和,不大于第二數(shù)組的數(shù)組長度,則直接進入第二存儲模塊8110。
第二新數(shù)組創(chuàng)建模塊870,適于創(chuàng)建一個新的第二數(shù)組,所述新的第二數(shù)組的數(shù)組長度超過原來的第二數(shù)組第一閾值。
第二復制存儲模塊880,適于將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中,并將未存儲過的有效數(shù)據(jù)包的有效數(shù)據(jù)存儲至新的第二數(shù)組中。
第一存儲模塊890,適于當所述有效數(shù)據(jù)包屬于客戶端時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于客戶端的第一數(shù)組存儲。
第二存儲模塊8110,適于當所述有效數(shù)據(jù)包屬于服務器時,根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述有效數(shù)據(jù)包中的有效數(shù)據(jù)向屬于服務器的第二數(shù)組存儲。
在本申請另一個優(yōu)選地實施例中,還包括:
輸出模塊8120,適于在當前tcp連接結束后,輸出第一數(shù)組和第二數(shù)組中的數(shù)據(jù)。
在本申請另一個優(yōu)選的實施例中,還包括:
第一釋放模塊,適于在將原來的第一數(shù)組中存儲的數(shù)據(jù)復制到新的第一數(shù)組中之后,將原來的第一數(shù)組釋放。
第二釋放模塊,適于在將原來的第二數(shù)組中存儲的數(shù)據(jù)復制到新的第二數(shù)組中之后,將原來的第二數(shù)組釋放。
其中,第一釋放模塊可以在第一復制存儲模塊之后,或者是在第一復制 存儲模塊之后的任一模塊之后;第二釋放模塊可以在第二復制存儲模塊之后,或者是在第二復制存儲模塊之后的任一模塊之后,對此本申請不加以限制。
本申請實施例是針對一tcp連接,分別對由客戶端和服務器發(fā)送的有效數(shù)據(jù)包中的有效數(shù)據(jù)進行重組。具體執(zhí)行過程為,首先針對一tcp連接,創(chuàng)建屬于客戶端的第一數(shù)組,和屬于服務器的第二數(shù)組,然后針對所述tcp連接下的含有tcp載荷的有效數(shù)據(jù)包,計算所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,進一步根據(jù)所述有效數(shù)據(jù)包的偏移量和數(shù)據(jù)長度,將所述客戶端的有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至屬于客戶端的第二數(shù)組,將所述服務器的有效數(shù)據(jù)包中的有效數(shù)據(jù)存儲至屬于服務器的第二數(shù)組。從而實現(xiàn)了同時分別對于客戶端以及服務器側的數(shù)據(jù)流的重組,而且簡化了對于客戶端側以及服務器側的流重組過程中的判斷邏輯以及運算過程,從而有效降低了現(xiàn)有tcp流重組方法的復雜度,提高了流重組的效率,更容易滿足系統(tǒng)性能方面的需求。
而且,在本申請實施例中,在建立tcp連接時會判斷接收到的syn包是來自客戶端發(fā)送還來自服務器,進而決定記錄客戶端的初始序列號isn還是服務器的初始序列號isn;在接收tcp連接的數(shù)據(jù)包時,還會判斷接收到的數(shù)據(jù)包種類,并且針對接收到的數(shù)據(jù)包的種類不同,執(zhí)行不同的操作;同時還會分別在接收到的有效數(shù)據(jù)包的偏置量和數(shù)據(jù)長度之和超出第一數(shù)組和第二數(shù)組長度時,分別利用新的第一數(shù)組和第二數(shù)組替換原有的第一數(shù)組和第二數(shù)組。在保證流重組的效率的同時,提高了流重組的準確性,從而使其更容易滿足系統(tǒng)性能方面的需求。
并且,是在tcp連接建立成功之后,再創(chuàng)建屬于客戶端的第一數(shù)組,和/或屬于服務器的第二數(shù)組,相對于在tcp連接還未成功建立之前,在創(chuàng)建屬于客戶端的第一數(shù)組,和屬于服務器的第二數(shù)組,延遲了創(chuàng)建用以進行數(shù)據(jù)流重組的第一數(shù)組和第二數(shù)組??梢杂行П苊鈙ynflood(拒絕服務)攻擊導致的資源被耗用過度的問題。
對于裝置實施例而言,由于其與方法實施例基本相似,所以描述的比較 簡單,相關之處參見方法實施例的部分說明即可。
本說明書中的各個實施例均采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。
本領域內的技術人員應明白,本申請實施例的實施例可提供為方法、裝置、或計算機程序產品。因此,本申請實施例可采用完全硬件實施例、完全軟件實施例、或結合軟件和硬件方面的實施例的形式。而且,本申請實施例可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限于磁盤存儲器、cd-rom、光學存儲器等)上實施的計算機程序產品的形式。
在一個典型的配置中,所述計算機設備包括一個或多個處理器(cpu)、輸入/輸出接口、網絡接口和內存。內存可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(ram)和/或非易失性內存等形式,如只讀存儲器(rom)或閃存(flashram)。內存是計算機可讀介質的示例。計算機可讀介質包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結構、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質的例子包括,但不限于相變內存(pram)、靜態(tài)隨機存取存儲器(sram)、動態(tài)隨機存取存儲器(dram)、其他類型的隨機存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他內存技術、只讀光盤只讀存儲器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質,可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質不包括非持續(xù)性的電腦可讀媒體(transitorymedia),如調制的數(shù)據(jù)信號和載波。
本申請實施例是參照根據(jù)本申請實施例的方法、終端設備(系統(tǒng))、和計算機程序產品的流程圖和/或方框圖來描述的。應理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框 圖中的流程和/或方框的結合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理終端設備的處理器以產生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理終端設備的處理器執(zhí)行的指令產生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導計算機或其他可編程數(shù)據(jù)處理終端設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理終端設備上,使得在計算機或其他可編程終端設備上執(zhí)行一系列操作步驟以產生計算機實現(xiàn)的處理,從而在計算機或其他可編程終端設備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
盡管已描述了本申請實施例的優(yōu)選實施例,但本領域內的技術人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例做出另外的變更和修改。所以,所附權利要求意欲解釋為包括優(yōu)選實施例以及落入本申請實施例范圍的所有變更和修改。
最后,還需要說明的是,在本文中,諸如第一和第二等之類的關系術語僅僅用來將一個實體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關系或者順序。而且,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者終端設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者終端設備中還存在另外的相同要素。
以上對本申請所提供的一種tcp流重組方法和一種tcp流重組裝置, 進行了詳細介紹,本文中應用了具體個例對本申請的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本申請的方法及其核心思想;同時,對于本領域的一般技術人員,依據(jù)本申請的思想,在具體實施方式及應用范圍上均會有改變之處,綜上所述,本說明書內容不應理解為對本申請的限制。