可以请某人解释一下如何处理无序数据包。我正在使用原始套接字来捕获数据包,并在它们到来时对其进行解析,但其中一些以错误的顺序出现,例如:
- Id..........标志
- 16390 : (PSH, ACK)
- 16535 : (PSH, ACK)
- 16638 : (ACK)
- 16640 : (PSH, ACK)
- 16639 : (ACK)
- 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/