rsync如何识别大小不能被块大小整除的插入?

时间:2014-12-21 10:17:14

标签: algorithm rsync

我试图了解rsync算法如何仅发送文件的已更改部分。这是我无法理解的情况:

考虑这个例子,其中A是发件人的文件版本,B是收件人的。

A = 1111122233333....
B = 1111133333....

为了举例,我们选择5个字节作为块大小。

正如您所看到的,只有更改是在A的文件中插入了三个2。

我的理解是,在正确确定两个文件的第一个块相同之后,rsync看到下一个块是'22233'和'33333',显然不同,继续将该块发送到接收器,并继续这样的直到文件结束的方式 - 由于插入,所有块都会有所不同,并且需要通过网络发送整个剩余文件(可能是千兆字节)。

rsync有什么方法可以解决这种情况吗?

1 个答案:

答案 0 :(得分:0)

我仔细研究了rsync's documentation(关于发件人的部分),这是解释(我是如何理解的):

Rsync使用“滚动校验和”,因此它能够计算每个字节位置的累积校验和。

因此,在我们的示例中,当它读取第一个块(前5个字节)时,它具有校验和A 1-5 ,它位于散列中,作为接收器上存在的块 - 因此不需要发送第一个块。

然后继续计算下一个块的校验和(A 6-10 ),并且在接收器的块中没有看到它。然后它占用最后一个匹配块之后的第一个字节,将其附加到不匹配的数据,然后继续计算A 7-11 校验和。在另外两个2被附加到非匹配数据之后,它计算A 9-13 ,其匹配B 6-10 校验和。此时,它可以将222作为插入的数据发送到接收方,并跳过3的块。