当TCP序列号到达时发生了什么,而不是预期的情况?

当TCP序列号到达时发生了什么,而不是预期的情况?,c,tcp,libpcap,packet-capture,C,Tcp,Libpcap,Packet Capture,我正在编写一个程序,它使用libpcap捕获数据包并重新组装TCP流。我的程序只是监控流量,因此我无法控制数据包的接收和传输。我的程序忽略所有非TCP/IP通信 我根据ISN计算下一个预期的序列号,然后是连续的序列号。我将其设置为每个TCP连接都由一个元组唯一标识,元组由源IP、源端口、目标IP和目标端口组成。一切都进展顺利,直到我收到一个序列号不同于我预期的数据包。我上传了屏幕截图,以帮助说明我所描述的内容 我的问题是: 1.“丢失”数据包中的数据在哪里? 2.序列号订单如何从这种情况中恢复?

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

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

我的问题是: 1.“丢失”数据包中的数据在哪里? 2.序列号订单如何从这种情况中恢复? 3.如何处理这些事件

请记住;然而,我并不是在写一个遵循TCP的程序。我正在编写一个程序,被动地监视TCP流的网络流量,并尝试将原始数据保存到磁盘,我不明白为什么会出现上述状态,以及如何编写程序来处理它


谢谢

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

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

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

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

  • 它被人扔了
  • 它在路上(走错了弯路),稍后会到达
序列号订单如何从这种情况中恢复

接收方注意到该段的顺序不正确,不会将其发送到应用程序,从而履行了其契约:为了获得可靠的字节流。现在,实际发生的事情是如何得到丢失的部分是相当复杂的,并且随着堆栈的不同而不同。简而言之,堆栈等待丢失的片段到达

  • 接收器可以扔掉顺序错误的片段,也可以将它们排在重新组装队列中
  • 接收器可以等待丢失的段到达,也可以立即发送之前已发送的ACK。重复确认将提醒对等方出现问题(查找)
  • 当发送确认时,TCP可以通知对等方某些段已成功到达-它们只是顺序错误()
如何处理这些事件


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

@TySmith您可能希望不接受它,等待可能出现更好的消息。有公认答案的问题往往会让潜在的回答者望而却步。