处理已排序的网络数据包

本文关键字:网络 数据包 排序 处理 | 更新日期: 2023-09-27 18:25:35

我有一个应用程序,它将从udp连接读取已排序的数据包。这些消息需要存储在某种形式的缓冲区中,并带有用于查找的序列号。

这个"缓冲区"由另一个线程提供服务,该线程删除并处理消息。如果缺少序列号,我必须停止服务线程,然后在另一个TCP连接上重新请求消息。一旦它到达,我想把它放回缓冲区,服务线程就可以继续了。

所以我需要:按键插入,按最低键删除。密钥将是一个数字递增数字,如1、2、3、4,因此它可以更容易地跟踪最高数字,因为密钥可以递增/递减,从而避免了对数据结构进行排序的需要

My one plan is to use a Dictionary as the buffer, which makes for a simple solution

My other solution uses a set up two queues

Suggestion by zmbg to use SortedList - I am concerned about performance, as hashing would provide faster lookup and insert not?

我的问题是:

  • 基本上,我使用字典来寻找这个解决方案在内存或性能方面的缺陷。运行它的机器没有太多内存,但吞吐量性能的优先级略高
  • 如果这个应用程序整天都在运行,那么在使用字典时是否会出现与内存相关的问题
  • 有人对这个程序或这个程序的替代实施有任何想法吗。我必须决定一个设计,但我无法测试不同的性能解决方案,因为我没有足够的时间,所以我想在开始之前,我应该尝试对想法和实现想法的优点进行理论收集

处理已排序的网络数据包

我认为字典不在这里,不是因为内存问题,而是因为它没有多大意义。我会使用一个排序列表,其中可以很容易地删除第一个元素,也可以很容易添加在中间的元素。

字典里没有"第一"的概念。

内存消耗将大致相同(数据将占据大部分内存,而不是字典或列表的开销),列表的性能将更好。

你对数据结构的操作是:在缓冲区的末尾添加一个数据包,从缓冲区的开头删除一个缓冲区,如果有丢失的数据包,停止所有操作,请求重新传输,然后添加它——可能是添加到缓冲区的开始(因为这就是你意识到数据包丢失的原因)。

.NET列表实际上是在数组上实现的,这不是最好的选择,但您可以使用LinkedList,这非常适合您的需要。

我最终决定用字典来实现我自己的Queue

Dictionary提供了我想要的插入和删除性能,过早地思考太多小的性能问题不会让我一无所获。

只跟踪最低的数字是可以的,我不会再详细介绍了。