我正在编写一个程序,它使用libpcap来捕获数据包并重新组装TCP流。我的程序只是监控流量,所以我无法控制数据包的接收和传输。我的程序忽略所有非TCP / IP流量。
我从ISN计算下一个预期的序列号,然后计算连续的SEQ号。我进行了设置,以便每个TCP连接由一个由源IP,源端口,dest IP和dest端口组成的元组唯一标识。一切都顺利进行,直到我收到一个序列号不同于我所期望的数据包。我上传了屏幕截图,以帮助说明我所描述的内容here。
我的问题是: 1.“丢失”数据包中的数据在哪里? 2. SEQ数字顺序如何从这种情况中恢复? 3.我该怎么做才能处理这些事件。
请记住;但是,我不是在编写一个遵循TCP的程序。我正在编写一个程序,被动地监视TCP流的网络流量并尝试将原始数据保存到磁盘,我很困惑为什么上面的状态发生以及如何编程来处理它。
谢谢
答案 0 :(得分:13)
“丢失”数据包中的数据在哪里?
SEQ号顺序如何从这种情况中恢复
接收方注意到该段不按顺序且不将其发送到应用程序,从而履行其合同:有序可靠字节流。现在,实际上发现缺少的部分是非常错综复杂的,并且从堆栈到堆栈各不相同。简而言之,堆栈等待丢失的部分到达。
我该怎么做才能处理这些事件
由于您只是在监控,因此无法执行任何操作。如果您还捕获了响应流量,您可能会更深入地了解实际发生的情况。
答案 1 :(得分:0)
根据当前TCP连接的窗口大小,如果新数据包适合接收窗口(多数据包缓冲区),它将被输入接收队列(并重新排序以便按顺序传送到协议客户端)。 / p>
如果序列号大于当前窗口的最大值,则会拒绝该数据包。
另见RFC 675
中的第4.4.2节(输入数据包处理程序)