🧩Delta-Transfer: nur die Unterschiede senden

Wie kann der Sender wissen, was sich geändert hat, wenn er die alte Datei gar nicht kennt? Der Trick von Andrew Tridgell und Paul Mackerras (1996): Der Empfänger beschreibt seine Datei durch Prüfsummen, der Sender sucht diese Stücke in der neuen Datei – an jeder Byte-Position, dank einer Prüfsumme, die sich in O(1) weiterschieben lässt.

🧪Delta-Labor

Beide Dateiversionen sind editierbar. Alles wird echt berechnet: schwache Rollsumme wie rsyncs get_checksum1(), MD5 als starke Prüfsumme, Hash-Tabelle, Rekonstruktion.
Blockgröße:(rsync nimmt ≈ √Dateigröße, mindestens 700 Byte – hier klein, damit man die Blöcke sieht)

① Empfänger zerlegt die alte Datei in 10 Blöcke

Jede Farbe = ein Block. Für jeden Block gehen eine schwache 32-Bit-Rollsumme und eine starke Prüfsumme (hier MD5) an den Sender.

Backup-Plan·für·den·Server↵ 1.·Datenbank·sichern↵ 2.·Dateien·mit·rsync·kopieren↵ 3.·Prüfsummen·vergleichen↵ 4.·Snapshot·rotieren↵ Verantwortlich:·Team·Betrieb↵
BlockOffsetLängeschwachstark (MD5, gekürzt)
#00162d8c04853b7325b1159e…
#116162b2004bb9ff44e8eb134…
#2321635750650bf138caf5de3…
#34816245804ce0d322d9565bb…
#46416364605e93ffd71c2a6e9…
#580161fbc0485552e8dd36200…
#696163186055fa6553f35b8d1…
#711216369a0616ac33022fe478…
#81281638a2063482fdbf62c01b…
#9144121baf041a777cf1117a16…

② Sender schiebt ein 16-Byte-Fenster über die neue Datei

Links vom Fenster ist schon entschieden: Literal oder Farbe des gefundenen Blocks. Rechts: noch offen.

Backup-Plan·für·den·Server↵ 1.·Datenbank·sichern↵ 2.·Dateien·mit·rsync·-a·kopieren↵ 3.·Prüfsummen·vergleichen↵ 4.·Snapshot·rotieren↵ Verantwortlich:·Team·Betrieb↵
Schritt 1 / 28 · Tasten ← →
Position 0, Fenster 16 Byte
frisch berechnet: s1 = Σ Bytes, s2 = Σ (Länge − i) · Bytei
s1 = 1157 · s2 = 11660 → schwach = 2d8c0485
Hash-Treffer bei Block #0 → starke Prüfsumme 3b7325b1159e… passt zu #0 ✓ → „kopiere Block 0“, Sprung um 16 Byte

③ Anweisungen an den Empfänger

  1. KOPIEBlock #0–#3(64 B aus der alten Datei)
  2. LITERAL„rsync -a kopieren↵3“(19 B)
  3. KOPIEBlock #5–#9(76 B aus der alten Datei)
✅ Empfänger hat aus alten Blöcken + Literalen exakt die neue Datei gebaut (Byte für Byte geprüft).

④ Was wurde gespart?

140 B
Matched (wiederverwendet)
19 B
Literal (gesendet)
9 / 0
Hash-Treffer / Fehlalarme
9
starke Prüfsummen berechnet
ganze Datei senden159 B
rsync: Signatur + Delta (Schätzung)259 B

Schätzung: Signatur = Blöcke × (4 + 16) Byte, Delta = Literale + 4 Byte je Anweisung. Bei winzigen Dateien lohnt sich der Aufwand nicht – echte rsync-Blöcke sind ≥ 700 Byte, die Signatur ist dann im Verhältnis winzig. Zahlen für Literal/Matched stimmen mit rsync --stats überein (in den Tests gegen rsync 3.5.0 geprüft).

🧮Die rollende Prüfsumme

Für ein Fenster der Länge L ab Position k mit den Bytes X berechnet rsync zwei 16-Bit-Summen:

s1 = ( X[k] + X[k+1] + … + X[k+L-1] )            mod 2^16
s2 = ( L·X[k] + (L-1)·X[k+1] + … + 1·X[k+L-1] )  mod 2^16
schwach = s1 + 2^16 · s2      (32 Bit)

Beim Weiterschieben um ein Byte fällt X[k] heraus und X[k+L] kommt hinzu – ohne alles neu zu addieren:

s1' = s1 − X[k] + X[k+L]
s2' = s2 − L·X[k] + s1'

Das ähnelt Adler-32, rechnet aber einfach modulo 216 statt modulo 65521. rsync liest die Bytes dabei als vorzeichenbehaftete char – auch das bildet das Labor nach.

Warum zwei Prüfsummen?

  • Schwach = billig und rollbar, wird an jeder Position berechnet, hat aber Kollisionen („Fehlalarme“).
  • Stark = teuer, nur bei einem Treffer in der Hash-Tabelle. Aktuelle rsync-Versionen handeln dafür xxh128 aus, ältere Protokolle nutzen MD5 oder MD4.
  • Zum Schluss prüft der Empfänger eine Prüfsumme über die ganze neue Datei – passt sie nicht, wird die Datei noch einmal übertragen.

Blockgröße

rsync wählt sie je Datei: etwa √Dateigröße, auf ein Vielfaches von 8 abgerundet, mindestens 700 und höchstens 131 072 Byte (Protokoll ≥ 30). Eine 1-MB-Datei bekommt 1000-Byte-Blöcke, eine 100-MB-Datei 10 000-Byte-Blöcke. Mit -B / --block-size lässt sie sich festlegen.

⚡Vorher: Muss die Datei überhaupt übertragen werden?

Der Delta-Algorithmus kommt nur für Dateien zum Zug, die der Generator als geändert einstuft. Standard ist der Quick-Check: Größe + Änderungszeit.

rsync -a — Größe und Änderungszeit vergleichen. Liest keine Inhalte – extrem schnell, aber blind für Änderungen, die Größe und Zeit nicht verändern.

DateiSender (Größe · Zeit)EmpfängerWas ist passiert?Entscheidung
foto.jpg2048 B · 08:00:002048 B · 08:00:00unverändertübersprungen
Größe und mtime gleich
notiz.txt13 B · 08:00:0013 B · 08:00:00Inhalt geändert, Größe + Zeit zufällig gleich⚠ übersprungen!
Größe und mtime gleich
config.ini300 B · 09:00:00300 B · 08:00:00nur „touch“ – Inhalt gleich, Zeit neuer↗ übertragen
mtime weicht 3600 s ab
log.txt5120 B · 08:01:004096 B · 08:00:00angehängt – größer↗ übertragen
Größe 5120 ≠ 4096
usb-stick.doc800 B · 08:00:01800 B · 08:00:00FAT-Ziel: Zeit um 1 s gerundet↗ übertragen
mtime weicht 1 s ab
neu.pdf999 B · 08:00:00—neu↗ übertragen
fehlt beim Empfänger
⚠️ Quick-Check hat einen blinden Fleck
Ändert ein Programm den Inhalt, ohne Größe und mtime zu verändern (oder setzt die mtime zurück), überspringt rsync die Datei. Für Backups deshalb gelegentlich mit -c prüfen – oder mit rsync -anc --itemize-changes nur anzeigen lassen.
💡 Lokal gibt es keinen Delta-Transfer
Sind Quelle und Ziel lokale Pfade, schaltet rsync automatisch --whole-file ein: Die Platte ist schneller als jede Prüfsummenrechnerei. Mit --no-whole-file lässt sich der Algorithmus trotzdem erzwingen.