算法简介
Rsync 算法是 Andrew Tridgell 和 Paul Mackerras 在 1998 年提出的一种远程差异文件同步算法。
假设你有两个文件(文件 A 和文件 B),你想将文件 B 更新到与文件 A 一致。最简单最直接的方法就是将文件 A 拷贝到文件 B 。如果是在两台主机通过网络连接的主机上并且文件 A 非常大时,这种方式效率就显得是否低下(尤其在通信带宽较低的情况下)。当两个文件的相似度较大时,我们可以利用文件相似度来提供传输效率。通用的做法就是只传输文件之间的差异数据。
Rsync 算法可以快速的计算出不同主机上两个文件的差异数据。假设我们有两台主机
- 主机
β 将文件 B 划分为连续的不重叠的长度为S 字节的定长数据块,最后一个数据块长度可能小于S 。 - 针对每个数据块主机
β 为它们计算一个弱滚动校验和以及一个强校验和(MD5)。 - 主机
β 将校验和信息发送给主机α 。 - 主机
α 针对文件 A 每个偏移位置查找与文件 B 具有相同强弱校验值的数据块。通过滚动校验和算法可以在单次扫描过程中快速地完成此操作。 - 主机
α 发送构建指令给主机β 构建文件 A 的副本。每个构建指令不是文件 B 的数据块索引就是文件原始数据。文件原始数据只有在文件 A 没有匹配到文件 B 中的数据块才会发送。
Rsync同步算法的原理图如下所示:
滚动校验和
Rsync 算法采用的弱校验和算法具有一个特性,即在给定数据块
算法定义如下:
其中
这种校验和算法的重要特性是可以使用递归关系非常有效地计算连续的值。