蒋培培 吴昊 钱进
摘要:基于用户数据协议(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