Rsync的核心算法

2023-11-05

一、什么是Rsync

1、rsync 是 unix / linux 下同步文件的一个高效算法,它能同步更新两处计算机的文件和目录,并适当的利用查找文件中的不同块以减少数据传输。
2、rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜像是只对有变更的部分进行传送
3、rsync 可拷贝 / 显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。

二、产生的起因

1 、rsync想要解决的问题是当我们要同步的文件只想传不同的部分,就需要对两边的文件做Diff算法,但是这两个问题在两台机器上,所以无法去做Diff算法。如果我们要做Diff,就要把一个文件传到另一个机器做Diff,但这样一来,我们就传了整个文件,这与我们只想传文件的不同部分的初衷有所违背。 而rsync算法就是要解决这个问题

三、Rsync算法

rsync的算法假设如下:(假设有两个同源文件fileOne,同步的目的文件是fileTwo
1、首先,我们将把fileTwo的文件平均切分成若干小块,比如每块512个字节(最后一块会小于这个数),然后对每块计算两个checksum

  • 一个叫rolling checksum,是弱checksum,32位的checksum,其使用的是Adler-32校验算法,
  • 另一个是强checksum,128位的,而之前用md4,现在所用的md5 hash算法。

2、CheckSum算法:同步目标端会吧fileTwo的一个checksum列表传给同步源,这个列表里包括了三个东西,rolling checksum(32bits),md5 checksum(128bits),文件块编号

3、checksum查找算法:同步源端拿到fileTwo的checksum数组后,会把这个数据存到一个hash table中,用rolling checksum做hash,以便获得O(1)时间复杂度的查找性能。这个hash table是16bits的,所以 hash table的尺寸是2^16 次,对rolling checksum的hash会被散列到0 - 2^16 - 1 中的某个值

4、比对算法

  • 取fileOne的第一个文件块(假设具有512个长度),也就是从fileOne的第1个字节到第512个字节,取出来后做rolling checksum计算。计算好的值到hash表中查
  • 如果查到了这个值,就说明发现在fileTwo中潜在相同的文件块,紧接着就比较md5的checksum,因为 rolling checksum太弱,可能会发生碰撞。于是还要算md5的128bits的checksum,这样一来我们就有了2^-(32+128) = 2^-160的概率发生碰撞,因为概率太小,可以进行忽略。如果rolling checksum和md5 checksum都相同,这说明在fileTow中具有相同的块,我们就只需要记下这一块在fileTwo下的文件编号。
  • 如果fileOne的rolling checksum 没有在hash table中找到,那就不用算md5 checksum了。表示这一块有不同的信息。总之只要rolling checksum 或md5 checksum其中一个在fileTow的checksum hash表中找不到匹配项,那么就会触发算法对fileTow的rolling动作。算法就会往后step 1 个字节,取fileOne中字节2-513的文件块要做checksum
  • 这样就可以找出fileOne相邻两次匹配中的那些文本字符,这些就是我们要往同步目标端传的文件内容

图示

rsync算法实行图示
这样,最终,在同步源这端,我们的rsync算法可能会得到下面这个样子的一个数据数组,图中,红色块表示在目标端已匹配上,不用传输(注:我专门在其中显示了两块chunk #5),而白色的地方就是需要传输的内容(注意:这些白色的块是不定长的),这样,同步源这端把这个数组(白色的就是实际内容,红色的就放一个标号)压缩传到目的端,在目的端的rsync会根据这个表重新生成文件,这样,同步完成。
数组
最后想说一下,对于某些压缩文件使用rsync传输可能会传得更多,因为被压缩后的文件可能会非常的不同。对此,对于gzip和bzip2这样的命令,记得开启 “rsyncalbe” 模式。​​​​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rsync的核心算法 的相关文章

  • java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式 然后另存为word xml文档 将xml翻译为FreeMarker模板 最后用java来解析FreeMarker模板并输出Docx 编辑好需要使用的word文档 1 把需要注入

随机推荐

  • 在Linux上面如何部署jar包?

    1 首先打开工具Xshell或者FinalShell 并登录 2 使用 ll 命令查看根目录文件 确定jar包将要放到哪个位置 使用cd 命令进入文件 如 cd opt yt 3 新建文件传输 可和本地关联 4 将jar包直接拖过去就行 5
  • 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构 数组 链表 队列 堆栈等 不同 树可以以不同的方式遍历 常见的有中序遍历 前序遍历和后序遍历 实现各种遍历的方法又包括 以上图为例 深度优先遍历 a 中序 左 根 右 4 2 5 1 3 b 前序 根
  • 关于async & await(TAP)异步模型的异常捕获

    在TAP之前 若要捕获线程中Task的异常 通常有两种办法 1 阻塞 线程开始后 在适当的时机 调用 wait 或waitAll方法 2 非阻塞 推荐 在建立任务的时候 写该task的continueWith方法 在该方法中捕获异常 对于T
  • get提交和post提交的区别

    Http定义了与服务器交互的不同方法 最基本的方法有4种 分别是GET POST PUT DELETE URL全称是资源描述符 我们可以这样认为 一个URL地址 它用于描述一个网络上的资源 而HTTP中的GET POST PUT DELET
  • Linux安装以及使用

    Linux虚拟机安装以及使用 1 安装VMware16 2 创建虚拟机 3 虚拟机配置网络 4 利用mobaxterm连接服务器 5 配置jdk和tomcat 6 配置docker和mysql 7 部署项目 1 安装VMware16 接下来
  • leetcode160–相交链表(最优解/双指针)

    今天做的三道题比较简单 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 题目数据 保证 整个链式结构中不存在环 注意 函数返回结果后 链表必须 保持其原
  • ISA(MIPS,ARM,RISC-V)中的算术运算溢出检测逻辑是怎样的?

    关于ISA架构 之前写过一些总结 这里单独将其中一个技术点拿出来 对比分析不同架构下实现的差异 这个技术点就是算术指令中的溢出检测 ARM体系结构中 通过CPSR的状态寄存器反映当前指令的溢出状态 而MIPS 则是通过指令触发中断的方式产生
  • Jenkins使用(代码拉取->编译构建->部署上线)

    Jenkins简介 Jenkins是一个开源项目 提供了一种易于使用的持续集成系统 使开发者从繁杂的集成中解脱出来 专注于更重要的业务逻辑实现上 同时Jenkins能实时监控集成中存在的错误 提供详细的日志文件和提醒功能 还能用图表的形式形
  • Java——(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age) (2)定义Map集合,用Student对象作为key

    分析以下需求 并用代码实现 1 定义一个学生类Student 包含属性 姓名 String name 年龄 int age 2 定义Map集合 用Student对象作为key 用字符串 此表示表示学生的住址 作为value 3 利用四种方式
  • db2异常

    一 db2 SQL0180N The syntax of the string representation of a datetime value is incorrect SQLSTATE 2200 问题描述 在用import导入时没有
  • qt入门级使用

    qt的安装 可参考 QT下载安装及配置教程 亲测好用 qt基本使用 1 创建第一个qt程序 打开后欢迎界面如下 这是关于qt的一些项目的讲解 不过视频地址在国外 需要翻qiang才能看 而且全是英文 左边还有一个 示例 那里面有各种项目的模
  • Android开发之RecyclerView的使用全解

    转自 http blog csdn net dmk877 article details 50816933 自Android 5 0之后 谷歌公司推出了RecylerView控件 RecylerView 我想看到一个新名词后大部分人会首先发
  • 微分动态规划

    from https en wikipedia org wiki Differential dynamic programming 深入理解DDP DDP是一种轨迹优化类别问题中的最优控制算法 这种算法在1966年被Mayne提出 该算法使
  • PostgreSQL 性能优化

    提出问题 PostgreSQL数据库如何进行简单的性能调优 解决问题 前言 PostgreSQL的配置参数作为性能调优的一部分 起着重要的位置 有时候一个简单的配置参数就会决定应用的性能 因此有必要简单了解下其相关的配置参数 查询Linux
  • Hadoop(三)读写流程

    Remote Procedure Call RPC 远程过程调用协议 它是一种通过网络从远程计算机程序上请求服务 而不需要了解底层网络技术的协议 RPC协议假定某些传输协议的存在 如TCP或UDP 为通信程序之间携带信息数据 在OSI网络通
  • 数据库基础命令

    SELECT 从数据库中提取数据 SELECT column name column name FROM table name SELECT DISTINCT column name column name FROM table name
  • Numpy

    文章目录 1 Numpy是什么 2 ndarray 2 1 什么是ndarray 2 2 ndarray的属性 2 3 ndarray的类型 3 Numpy基本操作 3 1 生成0或1的数组 3 2 从现有数组生成数组 拓展 浅拷贝和深拷贝
  • 在Excel中如何引用其他的工作表或者工作簿

    http www office68 com excel 426 html 公式中对单元格和单元格区域的引用不必非得针对同一个工作表中的单元格和单元格区域 如果要引用另外的工作表中的单元格 那么就在单元格引用的前面加上工作表的名称以及一个感叹
  • ssl协议及开源实现openssl

    转载地址 https blog csdn net jinbusi blog article details 76039206 locationNum 4 fps 1 ssl协议 SSL Secure Socket Layer 安全套接层 s
  • Rsync的核心算法

    一 什么是Rsync 1 rsync 是 unix linux 下同步文件的一个高效算法 它能同步更新两处计算机的文件和目录 并适当的利用查找文件中的不同块以减少数据传输 2 rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜