TCP序列号到达时发生的情况与预期不符?

时间:2012-07-31 18:53:52

标签: c tcp libpcap packet-capture

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

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

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

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

谢谢

2 个答案:

答案 0 :(得分:13)

  

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

  • 被某人抛弃
  • 途中遇到lost(绕道而行),迟到了
  

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

接收方注意到该段不按顺序且不将其发送到应用程序,从而履行其合同:有序可靠字节流。现在,实际上发现缺少的部分是非常错综复杂的,并且从堆栈到堆栈各不相同。简而言之,堆栈等待丢失的部分到达。

  • 接收方可以丢弃无序段,也可以将它们排入重组队列
  • 接收方可以等待丢失的段到达,或者可以立即发送之前已发送的ACK。重复的ACK会提醒对等方有问题(查找Fast Retransmit
  • 发送确认时,TCP可以通知对等某些段已成功到达 - 它们刚好不按顺序排列(SACK
  

我该怎么做才能处理这些事件

由于您只是在监控,因此无法执行任何操作。如果您还捕获了响应流量,您可能会更深入地了解实际发生的情况。

答案 1 :(得分:0)

根据当前TCP连接的窗口大小,如果新数据包适合接收窗口(多数据包缓冲区),它将被输入接收队列(并重新排序以便按顺序传送到协议客户端)。 / p>

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

另见RFC 675

中的第4.4.2节(输入数据包处理程序)