2

我有一个数据流向我发送具有不断增加的索引 (n++) 的数据。其中一些数据可能会乱序发送、丢失或需要重新传输。

例子

  1. 假设我有一个由我的应用程序监控的安全日志文件。坏人可能会抑制或阻止一些条目的传输。我想警惕这个事实。

  2. 还假设此数据可能会乱序发送到日志记录器。

似乎这种逻辑无处不在,我不想重新发明轮子并做一些效率不高的事情。

问题

我应该如何实现(或存在哪些参考实现)以允许我跟踪乱序接收的数据并可能包含序列中的缺失数据?

(也感谢您在标记此问题方面的帮助)

4

3 回答 3

1

好的,我使用链表做到了这一点。必须在某个地方为此进行先前的工作……无论哪种方式,这都针对本质上或多或少增加的输入序列进行了优化。

如果您发现任何错误或我可以进行的改进,请告诉我

    public class ContiguousDataValue
    {
        public int UpperInt { get; set; }
        public int LowerInt { get; set; }

        public override string ToString()
        {
            return "Upper" + UpperInt + " Lower" + LowerInt; 
        }
    }


public class ContiguousData 
{
    LinkedList<ContiguousDataValue> ranges = new LinkedList<ContiguousDataValue>();

    public void AddValue(int val)
    {
        for (LinkedListNode<ContiguousDataValue> range = ranges.Last; range != null; range = range.Previous)
        {
            if (val > range.Value.UpperInt)
            {
                // increment current node if applicable 
                if (val == range.Value.UpperInt + 1)
                    range.Value.UpperInt = val;
                else
                    ranges.AddAfter(range, new ContiguousDataValue() { UpperInt = val, LowerInt = val });
                return;
            }
            else if (val < range.Value.LowerInt)
            {
                if (val == range.Value.LowerInt - 1)
                {
                    range.Value.LowerInt = val;
                    return;
                }
                else
                {
                    continue;
                }
            }
        }
        // Anything that reaches this line is either a very new low value, or the first entry
        ranges.AddLast(new ContiguousDataValue() { UpperInt = val, LowerInt = val });
    }
 }
于 2012-05-13T13:24:34.493 回答
0

首先,如果你有潜在的竞争条件,你应该修复它。

TCP通过等待克服了数据乱序的问题。如果数据包 6 在数据包 4 之后到达,TCP 将一直等到数据包 5 到达。如果数据包 5 在一段时间内没有到达,TCP 将要求重新传输数据包 5,这将导致数据包 5 被重新发送。

(注意 - 我知道 TCP/IP 计算字节而不是数据包,这在这里无关紧要)

如果您可以要求您的“哑嵌入式设备”重新传输,您可以使用相同的技术。我打赌你不能这样做,所以你需要求助于另一种机制。它可以类似于 TCP 所做的。您只需要决定要等多长时间,直到您决定缺少一个条目。

于 2012-05-12T19:53:39.940 回答
0

您在 OQ 中提到了规范实现:TCP。所以通过 TCP 发送数据有一些受欢迎的结果,

  • 每当(如果)数据不按顺序到达时,您可以放心地假设您的发送或接收过程行为不端。
  • 每当序列中缺少数据时,您可以假设相同
  • 确认也是如此,因此您的发送过程始终具有完美的最后已知良好状态。

我强烈建议简单地使用 TCP 作为您的传输,并且(如果这不是直接可行的)简单地将 TCP 数据报封装到您的其他网络流中。

简而言之:使规范实现成为您的实现。

于 2012-05-12T16:39:53.967 回答