当收到一个不符合预期的TCP序列号时会发生什么?

5
我正在编写一个使用libpcap捕获数据包并重新组装TCP流的程序。我的程序只是监视流量,因此我无法控制数据包的接收和传输。我的程序忽略所有非TCP/IP流量。
我从ISN计算下一个期望的序列号,然后是连续的SEQ号码。我已经设置好了每个TCP连接都由源IP、源端口、目标IP和目标端口组成的元组来唯一标识。一切都很顺利,直到我收到一个序列号与我期望的不同的数据包。我已经上传了屏幕截图来帮助说明我所描述的here
我的问题是: 1. 在“丢失”的数据包中的数据在哪里? 2. SEQ号码如何从这种情况中恢复? 3. 我能做些什么来处理这些情况?
请记住;但是,我不是在编写遵守TCP协议的程序。我正在编写一个被动监视TCP流量并尝试将原始数据保存到磁盘的程序,我对上述状态发生的原因以及如何编程处理它感到困惑。
谢谢
2个回答

13

"失踪"数据包的数据在哪里?

  • 有人把它丢掉了。
  • 数据包被(走错路)迷路了,稍后才会到达。(参见这里

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

接收方注意到段落已经不是按顺序接收的,并且不将其发送给应用程序,由此实现了其合同:有序可靠字节流。现在,要获取缺少的部分实际上相当复杂,因为不同的栈之间会有所不同。简而言之,该栈等待缺少的部分到达。

  • 接收方可以放弃乱序的片段,也可以将它们排队到重组队列中。
  • 接收方可以等待缺少的片段到达,也可以立即发送已经发送的ACK。重复的ACK将提示对等端有问题(寻找快速重传)。
  • 在发送确认时,TCP可以告诉对等方一些片段已经成功到达 - 它们只是乱序的(SACK)。

我该如何处理这些情况?

由于您只进行监控,所以您无法做任何事情。如果您还捕获响应流量,您可能会更深入地了解实际发生了什么。


@TySmith 你可能想要取消接受并等待更好的答案出现。一个已被接受的问题往往会让潜在的回答者望而却步。 - cnicutar

1
根据当前TCP连接的窗口大小,如果新数据包适合接收窗口(多数据包缓冲区),它将被输入到接收队列中(并重新排序以有序地传递给协议客户端)。
如果序列号大于当前窗口的最大值,则该数据包将被拒绝。
另请参见RFC 675第4.4.2节(输入数据包处理程序)。

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