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

标签 c# sockets

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

  1. Id..........标志
  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 标志的数据包有时会先出现,所以我只是将它们传递给解析器,然后它之前的数据包来了,解析器只是将其视为已损坏而丢弃。

有什么办法可以解决吗?

最佳答案

TCP 段不会乱序,因为在您确认前一个之前不会发送下一个。

TCP numbers the segments that it sends to a particular destination port sequentially, so that if they arrive out of order, the TCP entity can reorder them.

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

此外,仅供引用...

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

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

关于C#:如何处理乱序的TCP数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/762779/

相关文章:

远程主机上的 C UDP 客户端和服务器

C# VSTO 加载项 - 将纯文本电子邮件转换为 HTML

python套接字,无效参数

c# - 仍然无法对数组进行排序和搜索

c# - 简单的 LINQ to SQL 嵌套选择

java - 使用线程池的客户端/服务器连接?

c - 如何停止从套接字读取

c - 使用 LD_PRELOAD 覆盖连接调用

c# - T4MVC 未将参数传递给基本 Controller ,因此生成的代码无法构建

c# - 目标 32 位或 64 位 native DLL,具体取决于环境