实现TCP数据包的重新排序

时间:2014-06-29 15:41:12

标签: c tcp-ip

想象一下PCAP文件file,客户端client和服务器server之间只有一个连接。没有重复的数据包,没有数据包丢失,数据包正确排序。

如果file中的数据包以的任何顺序播放而不使用数据包,那么我如何以编程方式订购数据包'时间戳? (例如,从最后一个数据包开始)。

目前我有两个包含队列的队列,传输队列(从client发送的数据包)和接收队列(从server发送的数据包)。我知道在找到包含标记client且没有标记SYN的数据包之前,我不知道谁是ACK

为了在同一队列中对数据包进行排序:

  1. 较大的SEQ数字表示数据包随后到达(忽略SEQ包装)。
  2. 如果两个数据包具有相同的SEQ个数字,我会比较ACK个数字。
    • 更大的ACK数字意味着数据包随后到达。
    • 如果数据包具有相同的ACK数字,我会(我不知道这是否正确)
      • 如果一个数据包有FIN标志,则会在之后到达。
      • 如果一个数据包有PSH标志,则会在之后到达。
  3. 一旦数据包(希望)在各自的队列中正确排序,我就会开始迭代这两个队列(q1q2):

    /* 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
    

    将一个队列中的SEQ号与另一个队列中的ACK号进行比较,反之则是基本的。

    我不知道在(SEQ in q1 == ACK in q2) and (ACK in q1 == SEQ in q2)时该怎么做。我所实现的是基于两个PCAP文件的观察。

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

0 个答案:

没有答案