蔣培培 吳昊 錢進(jìn)
摘要:基于用戶數(shù)據(jù)協(xié)議(UDP)的數(shù)據(jù)分發(fā)服務(wù)(DDS)傳輸是一種廣泛應(yīng)用在實(shí)時分布式系統(tǒng)的通信框架。然而,DDS發(fā)送較大數(shù)據(jù)包時可能產(chǎn)生UDP粘包問題。為解決這一問題,文章對比使用循環(huán)緩存和隊列緩存方式存儲DDS數(shù)據(jù)包的優(yōu)缺點(diǎn),給出了改進(jìn)循環(huán)緩存存儲方式,并提出了一種拆包粘包的數(shù)據(jù)處理方法。結(jié)果可以得到完整正確的DDS數(shù)據(jù)包,說明了該方法的有效性。
關(guān)鍵詞:DDS;較大數(shù)據(jù)包;UDP粘包;環(huán)形緩存;拆包粘包
中圖分類號:TP319.3? 文獻(xiàn)標(biāo)志碼:A
0 引言
數(shù)據(jù)分發(fā)服務(wù)[1](Data Distribution Service,DDS)是一種用于實(shí)時分布式系統(tǒng)的通信框架,它提供了高效、可靠的數(shù)據(jù)交換機(jī)制。DDS在實(shí)時應(yīng)用領(lǐng)域得到廣泛應(yīng)用,如現(xiàn)代化雷達(dá)、工業(yè)自動化、航空航天、醫(yī)療設(shè)備等。在DDS中,選擇適當(dāng)?shù)膫鬏攨f(xié)議對數(shù)據(jù)傳輸?shù)目煽啃院托阅芫哂兄匾绊?。盡管用戶數(shù)據(jù)協(xié)議(User Datagram Protocol,UDP)[2]是一種無連接的、不可靠的傳輸協(xié)議,但它在某些情況下被廣泛用于DDS的底層傳輸,以滿足實(shí)時性和低延遲的需求。
然而,UDP在傳輸過程中存在一種常見的UDP粘包問題,UDP粘包指的是在網(wǎng)絡(luò)傳輸過程中,多個數(shù)據(jù)包可能會被合并為一個較大的數(shù)據(jù)包,導(dǎo)致數(shù)據(jù)的丟失、重復(fù)和亂序。這對DDS的可靠性和正確性產(chǎn)生了挑戰(zhàn),特別是對于那些對數(shù)據(jù)的時序性、完整性和順序性要求較高的實(shí)時應(yīng)用。
本文主要探討在雷達(dá)數(shù)據(jù)處理中基于UDP的DDS通信傳輸時遇到的粘包問題,分析粘包對DDS通信的影響,對比2種緩存方式的數(shù)據(jù)包存儲,同時,提出一種發(fā)送端拆包、接收端拆包粘包的數(shù)據(jù)處理方法,以確保傳輸?shù)腄DS數(shù)據(jù)在接收端的正確性和完整性。
1 DDS相關(guān)知識介紹
1.1 DDS通信架構(gòu)
DDS是一種實(shí)時數(shù)據(jù)分發(fā)的協(xié)議和架構(gòu),用于構(gòu)建分布式系統(tǒng)中的實(shí)時通信和數(shù)據(jù)分發(fā)應(yīng)用。它是一種基于發(fā)布-訂閱模型的消息傳遞協(xié)議,旨在滿足實(shí)時、可靠、可擴(kuò)展和安全的數(shù)據(jù)分發(fā)需求。它支持多對多的通信模式,允許多個發(fā)布者發(fā)布數(shù)據(jù),并讓多個訂閱者接收這些數(shù)據(jù)。DDS提供了靈活的數(shù)據(jù)過濾和訂閱機(jī)制,使訂閱者可以選擇性地接收感興趣的數(shù)據(jù),從而降低網(wǎng)絡(luò)帶寬和計算資源的消耗。
1.2 產(chǎn)生DDS數(shù)據(jù)包粘包的可能場景
在DDS中,UDP傳輸?shù)臄?shù)據(jù)長度限制主要是由UDP協(xié)議本身和網(wǎng)絡(luò)環(huán)境引起的。以下是一些情況下可能存在數(shù)據(jù)長度限制的原因。
MTU限制:最大傳輸單元(Maximum Transmission Unit,MTU)是指網(wǎng)絡(luò)通信中傳輸?shù)臄?shù)據(jù)包的最大值。對于以太網(wǎng),常見的MTU大小為1 500字節(jié)。當(dāng)使用UDP傳輸數(shù)據(jù)時,如果數(shù)據(jù)包的值超過了網(wǎng)絡(luò)路徑中的任何一個設(shè)備的MTU限制,那么該數(shù)據(jù)包將被分割成多個較小的數(shù)據(jù)包進(jìn)行傳輸,這可能會導(dǎo)致數(shù)據(jù)長度限制。
網(wǎng)絡(luò)設(shè)備限制:網(wǎng)絡(luò)設(shè)備(如路由器、交換機(jī))也可能對數(shù)據(jù)包的長度有限制。這些設(shè)備可能會設(shè)置最大接收或發(fā)送數(shù)據(jù)包的值,超過限制的數(shù)據(jù)包可能會被丟棄或分片。
網(wǎng)絡(luò)延遲和帶寬:使用UDP傳輸數(shù)據(jù)時,較大的數(shù)據(jù)包可能會導(dǎo)致較高的傳輸延遲和占用較多的網(wǎng)絡(luò)帶寬。在某些情況下,網(wǎng)絡(luò)環(huán)境對數(shù)據(jù)傳輸?shù)膶?shí)時性和可靠性要求較高,因此會限制數(shù)據(jù)包的長度。
以上諸多的情況有可能會產(chǎn)生DDS數(shù)據(jù)包粘包問題。
2 基于DDS數(shù)據(jù)包粘包的數(shù)據(jù)處理設(shè)計
本文針對DDS數(shù)據(jù)包粘包的問題,需要解決接收數(shù)據(jù)包的存儲,通過創(chuàng)建緩沖區(qū)來緩存數(shù)據(jù)以保證數(shù)據(jù)不丟失。在較大的數(shù)據(jù)包存在粘包可能性的情況下,在DDS發(fā)送端進(jìn)行數(shù)據(jù)包拆包,在接收數(shù)據(jù)緩存完整的情況下,需要通過對符合條件的數(shù)據(jù)包拆包粘包進(jìn)行數(shù)據(jù)包的分片和重組,來完成對數(shù)據(jù)包的正確還原。
2.1 緩存區(qū)的創(chuàng)建
在DDS中,接收端通常需要開辟緩存來存儲接收到的數(shù)據(jù)。這是因為DDS通常使用發(fā)布-訂閱模型,在發(fā)布者和訂閱者之間進(jìn)行數(shù)據(jù)交換。發(fā)布者將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò),而訂閱者通過接收數(shù)據(jù)來獲取更新的信息。當(dāng)接收方訂閱特定的數(shù)據(jù)主題時,需要為該主題分配一個緩存來存儲接收到的數(shù)據(jù),這個緩存的大小可以根據(jù)應(yīng)用程序的需求進(jìn)行配置。接收方接收到的數(shù)據(jù)會被存儲在緩存中,直到應(yīng)用程序處理或消費(fèi)這些數(shù)據(jù)。緩存的作用是確保接收方能夠處理數(shù)據(jù),即使在某些時刻無法立即處理。緩存還可以用于應(yīng)對網(wǎng)絡(luò)延遲、傳輸錯誤或其他問題,以保證數(shù)據(jù)的可靠性和可用性。
2.2 緩存方法的選取
環(huán)形緩存[3]和隊列緩存[4]是常見的數(shù)據(jù)存儲和處理機(jī)制,用于解決數(shù)據(jù)傳輸和處理中的緩存需求。它們具有不同的特點(diǎn)和適用場景,下面是對環(huán)形緩存和隊列緩存的優(yōu)缺點(diǎn)進(jìn)行分析。
2.2.1 環(huán)形緩存(RingBuffer)
環(huán)形緩存如圖1所示,一般擁有讀寫指針各一個,讀指針用于讀取緩存的數(shù)據(jù),寫指針則用于向緩存存儲數(shù)據(jù),當(dāng)數(shù)據(jù)被添加到環(huán)形緩存時,它會被放置在寫指針?biāo)赶虻膬?nèi)存,并且寫指針會向后移動一個位置。如果寫指針已經(jīng)到達(dá)緩沖區(qū)的末尾,則它將被循環(huán)回到緩沖區(qū)的起點(diǎn)。這就是環(huán)形緩存的關(guān)鍵之處:數(shù)據(jù)可以循環(huán)地在緩沖區(qū)中移動,而無需復(fù)制或移動實(shí)際的數(shù)據(jù)。
當(dāng)從環(huán)形緩存中讀取數(shù)據(jù)時,可以通過讀指針來獲取緩沖區(qū)中最早的數(shù)據(jù),并將讀指針向后移動一個位置。同樣,如果讀指針到達(dá)緩沖區(qū)的末尾,它也會被循環(huán)回到緩沖區(qū)的起點(diǎn)。
使用環(huán)形緩存的好處之一是,它可以高效地處理連續(xù)的數(shù)據(jù)流。當(dāng)寫指針追趕上讀指針時,說明緩沖區(qū)已滿,此時新的數(shù)據(jù)將會覆蓋最早的數(shù)據(jù)。這種設(shè)計可以避免數(shù)據(jù)溢出的問題,并且保持了緩沖區(qū)的固定大小。由于環(huán)形緩存具有固定大小,難以在運(yùn)行時動態(tài)調(diào)整大小。如果需要調(diào)整緩存大小,通常需要重新分配更大的緩存空間,并進(jìn)行數(shù)據(jù)的拷貝,這也就是環(huán)形緩存的缺點(diǎn)所在。
2.2.2 隊列緩存(QueueBuffer)
隊列緩存如圖2所示,有一個線性的緩沖區(qū),其中包含了多個存儲單元(或稱為槽位),它也擁有2個指針,頭指針(Head)指向隊列的頭部,即隊列中最早進(jìn)入的數(shù)據(jù)。尾指針(Tail)指向隊列的尾部,即隊列中最近添加的數(shù)據(jù)。
圖2 隊列緩存
當(dāng)數(shù)據(jù)被添加到隊列緩存時,它會被放置在Tail所指向的內(nèi)存,并且Tail會向后移動一個位置。如果Tail已經(jīng)到達(dá)緩沖區(qū)的末尾,則隊列會溢出,即不能再添加新的數(shù)據(jù)。
當(dāng)從隊列緩存中讀取數(shù)據(jù)時,可以通過Head指針來獲取隊列的頭部數(shù)據(jù),并將Head向后移動一個位置。如果Head追趕上Tail,說明隊列為空,即沒有可讀取的數(shù)據(jù)。
隊列緩存的優(yōu)點(diǎn)是可以動態(tài)地存儲不同大小的數(shù)據(jù),適用于存儲變長數(shù)據(jù)的場景;隊列緩存支持先進(jìn)先出(FIFO)的數(shù)據(jù)訪問方式,可以按照數(shù)據(jù)到達(dá)的順序進(jìn)行處理,適合需要維持?jǐn)?shù)據(jù)順序的應(yīng)用場景;其缺點(diǎn)也十分明顯,由于它需要進(jìn)行動態(tài)的內(nèi)存分配和釋放操作,相比于環(huán)形緩存,隊列緩存的存取效率可能較低,特別是在需要頻繁插入或刪除數(shù)據(jù)的情況下;同時,隊列緩存需要動態(tài)管理內(nèi)存,可能導(dǎo)致內(nèi)存碎片化和額外的內(nèi)存管理開銷。
綜上所述,環(huán)形緩存大多數(shù)適用于固定大小、高速數(shù)據(jù)流的場景,具有高效的存儲和訪問能力,但難以動態(tài)調(diào)整大??;而隊列緩存適用于變長數(shù)據(jù)、需要維持?jǐn)?shù)據(jù)順序的場景,具有動態(tài)存儲和較好的可擴(kuò)展性,但存取效率相對較低。選擇合適的緩存機(jī)制應(yīng)根據(jù)具體應(yīng)用需求和性能考慮。
2.3 拆包粘包原理
在DDS發(fā)送端,針對較大的DDS數(shù)據(jù)包,發(fā)送時需要拆包,此時數(shù)據(jù)包拆包有一個必要的過程,即填寫必要的數(shù)據(jù)包包頭,這個包頭包含包序號、包的長度、包的總數(shù)目、包的總長度等元素。
在DDS數(shù)據(jù)包接收端,使用緩存接收數(shù)據(jù)后,讀取包頭數(shù)據(jù)判別是否需要拆包,需要拆包的情況下,先進(jìn)行拆包,然后以包序號0為基準(zhǔn)進(jìn)行粘包,符合條件就繼續(xù)粘包,依次將不同序號的數(shù)據(jù)包拷貝到有效的數(shù)據(jù)中,同時判斷包長度、包數(shù)目等,最終完成數(shù)據(jù)包的粘包還原,具體流程如圖3所示。
圖3 數(shù)據(jù)包粘包還原流程
3 基于DDS數(shù)據(jù)包拆包粘包的數(shù)據(jù)處理實(shí)現(xiàn)
本文的應(yīng)用場景是雷達(dá)數(shù)據(jù)處理與顯示,數(shù)據(jù)率高,因此利用環(huán)形緩存的方式來進(jìn)行DDS數(shù)據(jù)包的存儲。同時,針對不同類型/標(biāo)識的數(shù)據(jù)包,動態(tài)創(chuàng)建不同的環(huán)形緩存對象。為應(yīng)對同一類型/標(biāo)識的DDS數(shù)據(jù)包粘包產(chǎn)生數(shù)據(jù)長度不一樣的情形,需增加環(huán)形緩存接收數(shù)據(jù)長度指針,優(yōu)化環(huán)形緩存來實(shí)現(xiàn)數(shù)據(jù)讀寫存儲。
本文采用環(huán)形緩存優(yōu)化數(shù)據(jù)存儲,確保數(shù)據(jù)能夠及時正確處理,應(yīng)對網(wǎng)絡(luò)延遲等情況。利用DDS發(fā)送端拆包、接收端拆包粘包的方法將數(shù)據(jù)進(jìn)行分片和重組,對DDS的數(shù)據(jù)包進(jìn)行優(yōu)化設(shè)計,能夠有效應(yīng)對較大數(shù)據(jù)包粘包問題。
4 實(shí)驗結(jié)果分析
在2臺部署了麒麟V10操作系統(tǒng)的飛騰D2000/8的CPU,16 G內(nèi)存的計算機(jī)上,通過千兆以太網(wǎng)連接進(jìn)行DDS傳輸測試,測試發(fā)送的DDS數(shù)據(jù)包有1 600字節(jié)、16 000字節(jié)、60 000字節(jié),測試100個不同數(shù)據(jù)編號數(shù)據(jù)包,針對不同時間間隔(1 ms、5 ms)數(shù)據(jù)包發(fā)送后,本文DDS將超過1 450字節(jié)的數(shù)據(jù)包統(tǒng)一按1 450字節(jié)將數(shù)據(jù)包拆包,為了模擬粘包現(xiàn)象,將不是第一包的數(shù)據(jù)隨機(jī)組合幾包發(fā)送(拆包最后一包為不足1 450字節(jié)長度),發(fā)送間隔為1 ms,同時,接收到報文后將回復(fù)16字節(jié)帶數(shù)據(jù)編號的報文,通過Wireshark抓包工具分析發(fā)送和反饋報文,傳統(tǒng)DDS和本文DDS進(jìn)行實(shí)驗結(jié)果分析對比如表1—3所示。網(wǎng)絡(luò)時延指的是發(fā)送方接收反饋報文時間和接收方收到正確報文時間的時間差的平均值,若粘包的話需要去除拆包后發(fā)送的時間間隔;成功傳輸指的是接收端接收到正確報文的同時,發(fā)送端接收到反饋。
與傳統(tǒng)的DDS相比,本文DDS能保證數(shù)據(jù)成功傳輸和成功粘包,除此之外,在接收數(shù)據(jù)時使用了緩存優(yōu)化,針對發(fā)送不同數(shù)據(jù)量上看,網(wǎng)絡(luò)的延遲也在可接受范圍內(nèi),極大地減少了由于網(wǎng)絡(luò)延遲等因素導(dǎo)致網(wǎng)絡(luò)擁堵的概率。
綜上所述,本文提出的循環(huán)緩存優(yōu)化數(shù)據(jù)存儲方法和DDS發(fā)送端拆包、接收端拆包粘包的數(shù)據(jù)處理方法為較大DDS數(shù)據(jù)包粘包問題提供了一種有效的解決方案。通過對數(shù)據(jù)包粘包問題的深入理解和對數(shù)據(jù)處理策略的優(yōu)化,能夠提高DDS系統(tǒng)的可靠性,從而更好地滿足了實(shí)時分布式系統(tǒng)的通信需求。
5 結(jié)語
本文提出的較大DDS數(shù)據(jù)包粘包的數(shù)據(jù)處理方法的可行性通過實(shí)驗結(jié)果得到了驗證,同時能夠應(yīng)對很多的大數(shù)據(jù)包以及較快速率的網(wǎng)絡(luò)發(fā)送。通過深入研究和優(yōu)化UDP粘包問題,可以改進(jìn)DDS在使用UDP傳輸時的性能和可靠性,讓DDS在廣泛的實(shí)時應(yīng)用領(lǐng)域中能夠發(fā)揮更大的潛力,并為實(shí)時數(shù)據(jù)交換提供更可靠、高效的解決方案。
但是,基于Rapidio的DDS傳輸數(shù)據(jù)量更大的數(shù)據(jù)包,實(shí)現(xiàn)數(shù)據(jù)包粘包更為穩(wěn)定的方式還需要做進(jìn)一步的研究。
參考文獻(xiàn)
[1]何旭,張國超,代中華.基于DDS中間件的數(shù)據(jù)分發(fā)平臺的設(shè)計與實(shí)現(xiàn)[J].電子技術(shù)與軟件工程,2021(11):45-47.
[2]李會民,顏明會,任紅彬,等.基于UDP協(xié)議實(shí)現(xiàn)數(shù)據(jù)安全,高效傳輸?shù)姆椒ㄑ芯浚跩].北華航天工業(yè)學(xué)院學(xué)報,2022(6):8-10.
[3]姚章俊,陳蜀宇,盧堯.一種高性能環(huán)形緩沖區(qū)的研究與實(shí)現(xiàn)[J].計算機(jī)工程,2012(8):228-231.
[4]張?zhí)炜?,單思洋,許曉耕,等.信息中心網(wǎng)絡(luò)緩存技術(shù)研究綜述[J].北京郵電大學(xué)學(xué)報,2016(3):1-15.
(編輯 李春燕編輯)
Larger data sticky packets processing method based on DDS network transmission
Jiang? Peipei, Wu? Hao, Qian? Jin
(NO.724 Research Institute of CSSC, Nanjing 210000, China)
Abstract:? DDS transmission based on UDP is a widely used communication framework in real-time distributed systems. However, when DDS sends large packets, it may cause UDP packet sticking problems. To solve this problem, this article compares the advantages and disadvantages of using loop caching and queue caching to store DDS packets, proposes an improved loop caching storage method, and proposes a data processing method for unpacking and sticking packets. The results indicate that this method can obtain complete and correct DDS data packets, demonstrating the effectiveness of the method.
Key words: DDS; larger data; UDP sticky packets; ring buffer; sticky packets