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

2 c# sockets

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

  1. 标识标志...........
  2. 16390:(PSH,ACK)
  3. 16535:(PSH,ACK)
  4. 16638:(ACK)
  5. 16640:(PSH,ACK)
  6. 16639:(ACK)
  7. 16695:(PSH,ACK)

ID为16390,16535,16695的数据包是单独的数据包,可以自由处理ID为16638,16640,16639的数据包是一系列数据包,在解析之前应按升序排列.

更糟糕的是,带有Push标志的数据包有时会先出现,所以我只是将它们传递给解析器,然后发送它的数据包就会出现,而解析器只会将其丢弃为已损坏.

有什么办法可以解决吗?

Joe*_*ips 10

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

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

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

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

  • TCP数据是一个"段"
  • IP数据是"数据报"
  • 网络级是一个"数据包"

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


Unk*_*own 5

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

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

对于推送数据包,应该尽快接收这些数据包而不受排序限制,因此由您决定等待多长时间才能看到您是否会收到更早的推送数据包.