实现TCP数据包的重排序

实现TCP数据包的重排序,c,tcp-ip,C,Tcp Ip,设想一个PCAP文件文件,在客户端客户端和服务器服务器之间只有一个连接。没有重复的数据包,没有数据包丢失,并且数据包的顺序正确 如果文件中的数据包以任何顺序播放,而不使用数据包的时间戳,我如何以编程方式对数据包进行排序?(例如,从最后一个数据包开始) 目前,我有两个包含数据包的队列,传输队列(从客户端发送的数据包)和接收队列(从服务器发送的数据包)。我知道我无法知道谁是客户机,直到我找到一个带有标志SYN且没有标志ACK的数据包 要对同一队列中的数据包进行排序: 较大的SEQ数字表示数据包随后到

设想一个PCAP文件
文件
,在客户端
客户端
和服务器
服务器
之间只有一个连接。没有重复的数据包,没有数据包丢失,并且数据包的顺序正确

如果
文件
中的数据包以任何顺序播放,而不使用数据包的时间戳,我如何以编程方式对数据包进行排序?(例如,从最后一个数据包开始)

目前,我有两个包含数据包的队列,传输队列(从
客户端发送的数据包)和接收队列(从
服务器发送的数据包)。我知道我无法知道谁是
客户机
,直到我找到一个带有标志
SYN
且没有标志
ACK
的数据包

要对同一队列中的数据包进行排序:

  • 较大的
    SEQ
    数字表示数据包随后到达(忽略SEQ包装)
  • 如果两个数据包具有相同的
    SEQ
    编号,则比较
    ACK
    编号。
    • 较大的
      ACK
      号表示数据包随后到达
    • 如果数据包具有相同的
      ACK
      编号,我会(我不知道这是否正确)
      • 如果一个数据包具有
        FIN
        标志,则它随后到达
      • 如果一个数据包具有
        PSH
        标志,则它随后到达
  • 一旦数据包(希望)在各自的队列中正确排序,我就开始遍历这两个队列(
    q1
    q2
    ):

    /*如果q1和q2不是空的*/
    如果队列q1中的序列号<队列q2中的确认号
    在q1中获取数据包p
    否则,如果队列q1中的SEQ number==队列q2中的ACK number
    如果队列q1中的ACK编号<队列q2中的序号
    在q1中获取数据包p
    否则,如果队列q1中的ACK编号==队列q2中的序列编号
    /*我已经根据我在文件中看到的实现了这个*/
    如果队列q1中的FIN位和队列q2中的FIN位
    /*比较两个队列中以前的序号,是否正确*/
    如果q1中当前数据包的序号与q1中前一个数据包的序号相同
    在q1中获取数据包p
    其他的
    在q2中获取数据包p
    恩迪夫
    如果队列q1中有FIN位,则为else
    在q2中获取数据包p
    如果队列q1中有FIN位,则为else
    在队列q1中获取数据包p
    其他的
    /*怎么办?这种组合可能吗*/
    恩迪夫
    其他的
    在q2中获取数据包p
    恩迪夫
    其他的
    在q2中获取数据包p
    恩迪夫
    显示数据包p
    
    将一个队列中的
    SEQ
    编号与另一个队列中的
    ACK
    编号进行比较是最基本的

    我不知道的是当
    (q1中的SEQ==q2中的ACK)和(q1中的ACK==q2中的SEQ)
    时该怎么办。我实现的是基于对两个PCAP文件的观察


    正确的方法是什么(如果可能的话)?

    这不可能发生。一旦您计算出初始序列号,对于每个参与方,SEQ是发送的字节数,ACK是到目前为止接收的字节数。只有在另一方发送N个字节后,才能接收N个字节。所以在你的场景中,两个数据包中的每一个都在另一个之后。我知道这不应该发生在现实中。我想读取一个只有一个TCP连接的PCAP文件,其中数据包的顺序是任意的,并查看我是否能够对它们进行排序,以使其与原始文件(数据包顺序正确的文件)匹配。
    /* If q1 and q2 are not empty... */
    if SEQ number in the queue q1 < ACK number in the queue q2
        take packet p in q1
    else if SEQ number in the queue q1 == ACK number in the queue q2
        if ACK number in the queue q1 < SEQ number in the queue q2
            take packet p in q1
        else if ACK number in the queue q1 == SEQ number in the queue q2
            /* I have implemented this based on what I have seen in file. */
    
            if FIN bit in the queue q1 && FIN bit in the queue q2
                /* Compare previous SEQ numbers in both queues, is this correct? */
                if the SEQ number of the current packet in q1 is the same as the SEQ number of the previous packet in q1
                    take packet p in q1
                else
                    take packet p in q2
                endif
            else if FIN bit in the queue q1
                take packet p in q2
            else if FIN bit in the queue q1
                take packet p in queue q1
            else
                /* What to do? Is this combination possible? */
            endif
        else
            take packet p in q2
        endif
    else
        take packet p in q2
    endif
    
    show packet p