我写的libpcap使用捕捉到的数据包并重新组装TCP流的程序。 我的计划只是监控交通,所以我必须在接待和包传送的控制。 我的程序忽略所有非TCP / IP流量。
余计算从ISN下一个预期的序列号,然后将连续SEQ号码。 我有它设置,使每一个TCP连接是通过在源IP,源端口,目的IP,和目的端口的元组唯一标识。 一切顺利顺顺当当,直到我收到了比我期待不同的序列号的数据包。 我已经上传的屏幕截图,以帮助说明我所描述这里 。
我的问题是:1。如果是在“丢失”的数据包中的数据? 2.怎样的序列号顺序,从这种情况下恢复? 3.我能做些什么来处理这些事件。
请记住; 但是,我不写一个坚持TCP的程序。 我写一个程序,被动监视网络流量,TCP数据流,并尝试将原始数据保存到磁盘,和我很困惑,为什么上述状态的情况发生,我怎么能程序来处理它。
谢谢
哪里是那是在“迷失”包中的数据?
- 它得到了被人丢弃
- 它得到了迷路的方式(错误绕路)了,稍后会抵达
如何在序列号顺序从这种情况下恢复
接收机注意到该段是失序的,并且不将其发送到应用程序 ,从而履行其合同:有序可靠的字节流。 现在,实际上发生了什么让失落的一角是相当复杂和堆栈不同堆栈。 简而言之堆栈等待缺少的部分到达。
- 接收机可以扔掉外的序列段,或者它可以在一个重组队列排队他们
- 接收器可等待丢失的数据段到达,也可以将其立即发送之前已经发送的ACK。 重复的ACK会提醒对方什么是错的(寻找快速重传 )
- 当发送确认的TCP可以通知对一些细分顺利抵达-它们只是无序的( SACK )
我能做些什么来处理这些事件
你不能做任何事情,因为你只监控。 你也许可以更深入地了解究竟发生什么事,如果你还捕获的响应流量。
根据当前的TCP连接的窗口大小,如果新的数据包中的接收窗口(多分组缓冲器)内装配它将被输入到接收队列(和重新排序为有序传递到协议的客户端)。
如果序列号是比最大为当前窗口较大,数据包被拒绝。
参见4.4.2节(INPUT包处理)在RFC 675
文章来源: What is happening when a TCP sequence number arrives that is not what is expected?