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

3
请问有没有人能解释一下如何处理乱序数据包。我正在使用原始套接字捕获数据包,并在其到达时解析它们,但其中一些数据包的顺序不正确,例如:
Id...........Flags 16390 : (PSH, ACK) 16535 : (PSH, ACK) 16638 : (ACK) 16640 : (PSH, ACK) 16639 : (ACK) 16695 : (PSH, ACK)
ID为16390、16535和16695的数据包是独立的数据包,可以自由处理。 ID为16638、16640和16639的数据包是一个数据包序列,在解析之前应该按升序排列。
更糟糕的是,带有推送标志的数据包有时会先到达,所以我只是将它们传递给解析器,然后前面的数据包到达,解析器就将其丢弃为损坏的数据包。
有没有办法解决这个问题?

1
请明确您正在做什么,以便我们更能够回答您的问题。 - Joe Phillips
这很令人沮丧,我告诉了你如何处理原始数据包,但我只得到了3票,而被接受的答案有8票,基本上没有回答问题... - Unknown
这是因为一开始没有问对问题。 - Joe Phillips
4个回答

10

TCP段不会出现乱序,因为下一段在你确认前不会被发送。

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

这发生在TCP下面的传输层,因此任何TCP连接都不会“看到”此过程。在TCP方面,它们始终按顺序排列。因此,如果您看到它们乱序,则说明您没有使用TCP传输层工作,而是处于较低级别。

另外,有一个FYI...

  • TCP数据是“段(segment)”
  • IP数据是“数据报(datagram)”
  • 网络层是“数据包(packet)”

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


1
我只是使用原始套接字嗅探客户端和服务器之间的数据包,因此我不会发送ACK确认信息。这是最初使用的代码:http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx抱歉术语有些混乱,我对网络术语还比较陌生。 - Vitalis

6

TCP保证顺序。所以我会假设你说的是IP。

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

至于推送数据包,它们应该尽快接收,没有顺序限制,所以由您决定等多长时间来查看是否会接收到较早的推送数据包。


4

为什么不使用普通的TCP套接字,这样它们就可以按顺序到达?


1
他正在嗅探数据包,这意味着他不是服务器/客户端,而是在中间监听对话,这只有使用原始套接字才能实现。 - Muhammad Hasan Khan

1

序列号将显示顺序。它在4G处折返,因此您必须考虑到这一点。您还必须使用TCP使用的相同基本例程。缓冲区不按顺序的数据包并丢弃重复项。序列号+有效载荷长度是下一个序列号。

TCP/IP Illustrated Vol 2或TCP.c?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接