5

我正在编写一个使用 libpcap 捕获数据包并重新组装 TCP 流的程序。我的程序只是监视流量,因此我无法控制数据包的接收和传输。我的程序忽略所有非 TCP/IP 流量。

我从 ISN 计算下一个预期的序列号,然后是连续的 SEQ 编号。我进行了设置,以便每个 TCP 连接都由一个由源 IP、源端口、目标 IP 和目标端口组成的元组唯一标识。一切都很顺利,直到我收到一个序列号与我预期不同的数据包。我已经上传了屏幕截图来帮助说明我在这里描述的内容。

我的问题是: 1.“丢失”数据包中的数据在哪里?2. SEQ 编号顺序如何从这种情况中恢复?3. 我能做些什么来处理这些事件。

请记住; 但是,我不是在编写遵循 TCP 的程序。我正在编写一个程序,它被动地监视 TCP 流的网络流量并尝试将原始数据保存到磁盘,我对为什么会发生上述状态情况以及如何编程来处理它感到困惑。

谢谢

4

2 回答 2

13

“丢失”数据包中的数据在哪里?

  • 它被某人丢弃了
  • 它在途中迷路了(错误的绕行),稍后会到达

SEQ 编号顺序如何从这种情况中恢复

接收方注意到该段乱序并且没有将其发送到应用程序,从而履行其合同:有序可靠字节流。现在,获得缺失部分的实际情况非常复杂,并且因堆栈而异。简而言之,堆栈等待丢失的部分到达。

  • 接收器可以丢弃无序的段,也可以将它们排入重组队列
  • 接收方可以等待丢失的段到达,也可以立即发送之前已经发送的 ACK。重复的 ACK 将提醒对等方有问题(查找Fast Retransmit
  • 发送确认时,TCP 可以通知对等方一些分段成功到达 - 它们只是乱序(SACK

我能做些什么来处理这些事件

你不能做任何事情,因为你只是在监视。如果您还捕获了响应流量,您可能会更深入地了解实际发生的情况。

于 2012-07-31T19:02:59.577 回答
1

根据当前 TCP 连接的窗口大小,如果新数据包适合接收窗口(多数据包缓冲区),它将进入接收队列(并重新排序以按顺序交付给协议客户端)。

如果序列号大于当前窗口的最大值,则数据包被拒绝。

另请参阅RFC 675中的第 4.4.2 节(输入数据包处理程序)

于 2012-07-31T19:02:23.130 回答