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