C#:如何处理无序TCP数据包?

时间:2009-04-18 02:45:42

标签: c# sockets

可以请某人解释如何处理无序数据包。我正在使用原始套接字捕获数据包,并在它们到来时解析它们,但其中一些顺序错误,例如:

  1. 标识...........标志
  2. 16390:(PSH,ACK)
  3. 16535:(PSH,ACK)
  4. 16638:(确认)
  5. 16640:(PSH,ACK)
  6. 16639:(ACK)
  7. 16695:(PSH,ACK)
  8. ID为16390,16535,16695的数据包是单独的数据包,可以自由处理 ID为16638,16640,16639的数据包是一系列数据包,在解析之前应按升序排列。

    更糟糕的是,带有Push标志的数据包有时候会先出现,所以我只是将它们传递给解析器,然后解决它的数据包,并且解析器只是将其丢弃为损坏。

    有什么办法可以解决吗?

4 个答案:

答案 0 :(得分:11)

TCP段不会出现故障,因为在您确认上一段之前不会发送下一段。

  

TCP对它发送的段进行编号   到特定目的地端口   顺序,如果他们到达   无序,TCP实体可以   重新排序。

这发生在TCP下面的传输层上,因此任何TCP连接都不会“看到”这种情况发生。在TCP方面,它们总是有序的。因此,如果您看到它们乱序,那么您不在TCP传输层上工作,那么您处于较低级别。

另外,仅供参考......

  • TCP数据是“段”
  • IP数据是“数据报”
  • 网络级别是“数据包”

编辑:您提供的链接将为您提供IP数据报流,因此您必须自己处理TCP流。我不会假装这很容易,并试着在这里解释一下。

答案 1 :(得分:5)

TCP保证订单。所以我假设你在谈论IP。

您可以尝试的一件事是将数据包放入最小堆中,然后等待,直到您想要的下一个数据包ID号可用。

对于推送数据包,应该尽快接收这些数据包而不限制订购,因此由您决定等待多长时间以查看您是否会收到更早的推送数据包。

答案 2 :(得分:4)

为什么不使用普通的tcp套接字,以便它们按顺序排列?

答案 3 :(得分:1)

序列号将显示订单。它包装在4G,所以你必须考虑到这一点。而且您将必须使用TCP使用的相同基本例程。缓冲无序数据包并丢弃重复数据。序号+有效载荷的Len是nexxt序列号。

TCP / IP Illistrated vol 2 或TCP.c?