蔣培培 吳昊 錢進



摘要:基于用戶數據協議(UDP)的數據分發服務(DDS)傳輸是一種廣泛應用在實時分布式系統的通信框架。然而,DDS發送較大數據包時可能產生UDP粘包問題。為解決這一問題,文章對比使用循環緩存和隊列緩存方式存儲DDS數據包的優缺點,給出了改進循環緩存存儲方式,并提出了一種拆包粘包的數據處理方法。結果可以得到完整正確的DDS數據包,說明了該方法的有效性。
關鍵詞:DDS;較大數據包;UDP粘包;環形緩存;拆包粘包
中圖分類號:TP319.3? 文獻標志碼:A
0 引言
數據分發服務[1](Data Distribution Service,DDS)是一種用于實時分布式系統的通信框架,它提供了高效、可靠的數據交換機制。DDS在實時應用領域得到廣泛應用,如現代化雷達、工業自動化、航空航天、醫療設備等。在DDS中,選擇適當的傳輸協議對數據傳輸的可靠性和性能具有重要影響。盡管用戶數據協議(User Datagram Protocol,UDP)[2]是一種無連接的、不可靠的傳輸協議,但它在某些情況下被廣泛用于DDS的底層傳輸,以滿足實時性和低延遲的需求。
然而,UDP在傳輸過程中存在一種常見的UDP粘包問題,UDP粘包指的是在網絡傳輸過程中,多個數據包可能會被合并為一個較大的數據包,導致數據的丟失、重復和亂序。這對DDS的可靠性和正確性產生了挑戰,特別是對于那些對數據的時序性、完整性和順序性要求較高的實時應用。
本文主要探討在雷達數據處理中基于UDP的DDS通信傳輸時遇到的粘包問題,分析粘包對DDS通信的影響,對比2種緩存方式的數據包存儲,同時,提出一種發送端拆包、接收端拆包粘包的數據處理方法,以確保傳輸的DDS數據在接收端的正確性和完整性。
1 DDS相關知識介紹
1.1 DDS通信架構
DDS是一種實時數據分發的協議和架構,用于構建分布式系統中的實時通信和數據分發應用。它是一種基于發布-訂閱模型的消息傳遞協議,旨在滿足實時、可靠、可擴展和安全的數據分發需求。它支持多對多的通信模式,允許多個發布者發布數據,并讓多個訂閱者接收這些數據。DDS提供了靈活的數據過濾和訂閱機制,使訂閱者可以選擇性地接收感興趣的數據,從而降低網絡帶寬和計算資源的消耗。
1.2 產生DDS數據包粘包的可能場景
在DDS中,UDP傳輸的數據長度限制主要是由UDP協議本身和網絡環境引起的。以下是一些情況下可能存在數據長度限制的原因。
MTU限制:最大傳輸單元(Maximum Transmission Unit,MTU)是指網絡通信中傳輸的數據包的最大值。對于以太網,常見的MTU大小為1 500字節。當使用UDP傳輸數據時,如果數據包的值超過了網絡路徑中的任何一個設備的MTU限制,那么該數據包將被分割成多個較小的數據包進行傳輸,這可能會導致數據長度限制。
網絡設備限制:網絡設備(如路由器、交換機)也可能對數據包的長度有限制。這些設備可能會設置最大接收或發送數據包的值,超過限制的數據包可能會被丟棄或分片。
網絡延遲和帶寬:使用UDP傳輸數據時,較大的數據包可能會導致較高的傳輸延遲和占用較多的網絡帶寬。在某些情況下,網絡環境對數據傳輸的實時性和可靠性要求較高,因此會限制數據包的長度。
以上諸多的情況有可能會產生DDS數據包粘包問題。
2 基于DDS數據包粘包的數據處理設計
本文針對DDS數據包粘包的問題,需要解決接收數據包的存儲,通過創建緩沖區來緩存數據以保證數據不丟失。在較大的數據包存在粘包可能性的情況下,在DDS發送端進行數據包拆包,在接收數據緩存完整的情況下,需要通過對符合條件的數據包拆包粘包進行數據包的分片和重組,來完成對數據包的正確還原。
2.1 緩存區的創建
在DDS中,接收端通常需要開辟緩存來存儲接收到的數據。這是因為DDS通常使用發布-訂閱模型,在發布者和訂閱者之間進行數據交換。發布者將數據發送到網絡,而訂閱者通過接收數據來獲取更新的信息。當接收方訂閱特定的數據主題時,需要為該主題分配一個緩存來存儲接收到的數據,這個緩存的大小可以根據應用程序的需求進行配置。接收方接收到的數據會被存儲在緩存中,直到應用程序處理或消費這些數據。緩存的作用是確保接收方能夠處理數據,即使在某些時刻無法立即處理。緩存還可以用于應對網絡延遲、傳輸錯誤或其他問題,以保證數據的可靠性和可用性。
2.2 緩存方法的選取
環形緩存[3]和隊列緩存[4]是常見的數據存儲和處理機制,用于解決數據傳輸和處理中的緩存需求。它們具有不同的特點和適用場景,下面是對環形緩存和隊列緩存的優缺點進行分析。
2.2.1 環形緩存(RingBuffer)
環形緩存如圖1所示,一般擁有讀寫指針各一個,讀指針用于讀取緩存的數據,寫指針則用于向緩存存儲數據,當數據被添加到環形緩存時,它會被放置在寫指針所指向的內存,并且寫指針會向后移動一個位置。如果寫指針已經到達緩沖區的末尾,則它將被循環回到緩沖區的起點。這就是環形緩存的關鍵之處:數據可以循環地在緩沖區中移動,而無需復制或移動實際的數據。
當從環形緩存中讀取數據時,可以通過讀指針來獲取緩沖區中最早的數據,并將讀指針向后移動一個位置。同樣,如果讀指針到達緩沖區的末尾,它也會被循環回到緩沖區的起點。
使用環形緩存的好處之一是,它可以高效地處理連續的數據流。當寫指針追趕上讀指針時,說明緩沖區已滿,此時新的數據將會覆蓋最早的數據。這種設計可以避免數據溢出的問題,并且保持了緩沖區的固定大小。由于環形緩存具有固定大小,難以在運行時動態調整大小。如果需要調整緩存大小,通常需要重新分配更大的緩存空間,并進行數據的拷貝,這也就是環形緩存的缺點所在。
2.2.2 隊列緩存(QueueBuffer)
隊列緩存如圖2所示,有一個線性的緩沖區,其中包含了多個存儲單元(或稱為槽位),它也擁有2個指針,頭指針(Head)指向隊列的頭部,即隊列中最早進入的數據。尾指針(Tail)指向隊列的尾部,即隊列中最近添加的數據。
圖2 隊列緩存
當數據被添加到隊列緩存時,它會被放置在Tail所指向的內存,并且Tail會向后移動一個位置。如果Tail已經到達緩沖區的末尾,則隊列會溢出,即不能再添加新的數據。
當從隊列緩存中讀取數據時,可以通過Head指針來獲取隊列的頭部數據,并將Head向后移動一個位置。如果Head追趕上Tail,說明隊列為空,即沒有可讀取的數據。
隊列緩存的優點是可以動態地存儲不同大小的數據,適用于存儲變長數據的場景;隊列緩存支持先進先出(FIFO)的數據訪問方式,可以按照數據到達的順序進行處理,適合需要維持數據順序的應用場景;其缺點也十分明顯,由于它需要進行動態的內存分配和釋放操作,相比于環形緩存,隊列緩存的存取效率可能較低,特別是在需要頻繁插入或刪除數據的情況下;同時,隊列緩存需要動態管理內存,可能導致內存碎片化和額外的內存管理開銷。
綜上所述,環形緩存大多數適用于固定大小、高速數據流的場景,具有高效的存儲和訪問能力,但難以動態調整大??;而隊列緩存適用于變長數據、需要維持數據順序的場景,具有動態存儲和較好的可擴展性,但存取效率相對較低。選擇合適的緩存機制應根據具體應用需求和性能考慮。
2.3 拆包粘包原理
在DDS發送端,針對較大的DDS數據包,發送時需要拆包,此時數據包拆包有一個必要的過程,即填寫必要的數據包包頭,這個包頭包含包序號、包的長度、包的總數目、包的總長度等元素。
在DDS數據包接收端,使用緩存接收數據后,讀取包頭數據判別是否需要拆包,需要拆包的情況下,先進行拆包,然后以包序號0為基準進行粘包,符合條件就繼續粘包,依次將不同序號的數據包拷貝到有效的數據中,同時判斷包長度、包數目等,最終完成數據包的粘包還原,具體流程如圖3所示。
圖3 數據包粘包還原流程
3 基于DDS數據包拆包粘包的數據處理實現
本文的應用場景是雷達數據處理與顯示,數據率高,因此利用環形緩存的方式來進行DDS數據包的存儲。同時,針對不同類型/標識的數據包,動態創建不同的環形緩存對象。為應對同一類型/標識的DDS數據包粘包產生數據長度不一樣的情形,需增加環形緩存接收數據長度指針,優化環形緩存來實現數據讀寫存儲。
本文采用環形緩存優化數據存儲,確保數據能夠及時正確處理,應對網絡延遲等情況。利用DDS發送端拆包、接收端拆包粘包的方法將數據進行分片和重組,對DDS的數據包進行優化設計,能夠有效應對較大數據包粘包問題。
4 實驗結果分析
在2臺部署了麒麟V10操作系統的飛騰D2000/8的CPU,16 G內存的計算機上,通過千兆以太網連接進行DDS傳輸測試,測試發送的DDS數據包有1 600字節、16 000字節、60 000字節,測試100個不同數據編號數據包,針對不同時間間隔(1 ms、5 ms)數據包發送后,本文DDS將超過1 450字節的數據包統一按1 450字節將數據包拆包,為了模擬粘包現象,將不是第一包的數據隨機組合幾包發送(拆包最后一包為不足1 450字節長度),發送間隔為1 ms,同時,接收到報文后將回復16字節帶數據編號的報文,通過Wireshark抓包工具分析發送和反饋報文,傳統DDS和本文DDS進行實驗結果分析對比如表1—3所示。網絡時延指的是發送方接收反饋報文時間和接收方收到正確報文時間的時間差的平均值,若粘包的話需要去除拆包后發送的時間間隔;成功傳輸指的是接收端接收到正確報文的同時,發送端接收到反饋。
與傳統的DDS相比,本文DDS能保證數據成功傳輸和成功粘包,除此之外,在接收數據時使用了緩存優化,針對發送不同數據量上看,網絡的延遲也在可接受范圍內,極大地減少了由于網絡延遲等因素導致網絡擁堵的概率。
綜上所述,本文提出的循環緩存優化數據存儲方法和DDS發送端拆包、接收端拆包粘包的數據處理方法為較大DDS數據包粘包問題提供了一種有效的解決方案。通過對數據包粘包問題的深入理解和對數據處理策略的優化,能夠提高DDS系統的可靠性,從而更好地滿足了實時分布式系統的通信需求。
5 結語
本文提出的較大DDS數據包粘包的數據處理方法的可行性通過實驗結果得到了驗證,同時能夠應對很多的大數據包以及較快速率的網絡發送。通過深入研究和優化UDP粘包問題,可以改進DDS在使用UDP傳輸時的性能和可靠性,讓DDS在廣泛的實時應用領域中能夠發揮更大的潛力,并為實時數據交換提供更可靠、高效的解決方案。
但是,基于Rapidio的DDS傳輸數據量更大的數據包,實現數據包粘包更為穩定的方式還需要做進一步的研究。
參考文獻
[1]何旭,張國超,代中華.基于DDS中間件的數據分發平臺的設計與實現[J].電子技術與軟件工程,2021(11):45-47.
[2]李會民,顏明會,任紅彬,等.基于UDP協議實現數據安全,高效傳輸的方法研究[J].北華航天工業學院學報,2022(6):8-10.
[3]姚章俊,陳蜀宇,盧堯.一種高性能環形緩沖區的研究與實現[J].計算機工程,2012(8):228-231.
[4]張天魁,單思洋,許曉耕,等.信息中心網絡緩存技術研究綜述[J].北京郵電大學學報,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