„Fletcher’s Checksum“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K lf wieterleitungsausbau Fehlerkorrekturverfahren weiteres im SW- Review
Form
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 2: Zeile 2:


== Der Algorithmus ==
== Der Algorithmus ==
Die [[Binärcode|binär]] übertragene Nachricht wird in Blöcke der Länge <math>K</math> unterteilt, der letzte Block gegebenenfalls aufgefüllt und jeder Block als [[Integer (Datentyp)|unsigned Integer]] interpretiert. Die Anzahl der Blöcke sei <math>length</math>. Der Prüfwert besteht aus zwei verschiedenen Summen: Die erste (<math>sum_1</math>) summiert nacheinander sämtliche Blöcke auf, die zweite (<math>sum_2</math>) ist die Summe aller Zwischenergebnisse der ersten Summe.<ref name="fletcher248" /> Der erste Block geht also <math>length</math>-mal in <math>sum_2</math> ein, der letzte dagegen nur einmal. Werden durch eine Störung beim Übertragen Bits invertiert oder zwei Blöcke unterschiedlichen Wertes vertauscht, verändert sich im Normalfall auch der Prüfwert: Der Fehler fällt auf.
Die [[Binärcode|binär]] übertragene Nachricht wird in Abschnitte der Länge <math>K</math> unterteilt, jeweils <math>K</math> Bits bilden dann einen [[Datensatz#Blockung|Block]]. Der letzte Block wird gegebenenfalls aufgefüllt und jeder Block als [[Integer (Datentyp)|unsigned Integer]] interpretiert. Die Anzahl der Blöcke sei <math>length</math>. Der Prüfwert besteht aus zwei verschiedenen Summen: Die erste (<math>sum_1</math>) summiert nacheinander sämtliche Blöcke auf, die zweite (<math>sum_2</math>) ist die Summe aller Zwischenergebnisse der ersten Summe.<ref name="fletcher248" /> Der erste Block geht also <math>length</math>-mal in <math>sum_2</math> ein, der letzte dagegen nur einmal. Werden durch eine Störung beim Übertragen Bits invertiert oder zwei Blöcke unterschiedlichen Wertes vertauscht, verändert sich im Normalfall der Prüfwert: Der Fehler fällt auf.


Da der Prüfwert unabhängig von der Länge der Nachricht in einer festen Anzahl von Bits (im Allgemeinen <math>2\cdot K</math>) übertragen werden können soll, werden beide Summen zuletzt [[modulo]] <math>M</math> gerechnet und anschließend in die Nachricht integriert. Normalerweise wird <math>M = 2^K</math> oder <math>M = 2^K-1</math> gewählt.<ref name="fletcher248">John G. Fletcher: ''An Arithmetic Checksum for Serial Transmissions''. 1982, S. 248.</ref> Letzteres entspricht einer Berechnung im [[Einerkomplement]], kann aber auch auf heutigen [[Computer]]n, die das [[Zweierkomplement]] benutzen, imitiert werden. Für das Ergebnis ist unerheblich, ob die Modulo-Operation nach jeder Addition oder am Ende erfolgt.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 76f.</ref> Um [[Arithmetischer Überlauf|Überlauf]] zu vermeiden, erfolgt in einer Implementierung diese Rechnung nicht erst am Ende.
Da der Prüfwert unabhängig von der Länge der Nachricht in einer festen Anzahl von Bits (im Allgemeinen <math>2\cdot K</math>) übertragen werden können soll, werden beide Summen zuletzt [[modulo]] <math>M</math> gerechnet und anschließend in die Nachricht integriert. Normalerweise wird <math>M = 2^K</math> oder <math>M = 2^K-1</math> gewählt.<ref name="fletcher248">John G. Fletcher: ''An Arithmetic Checksum for Serial Transmissions''. 1982, S. 248.</ref> Letzteres entspricht einer Berechnung im [[Einerkomplement]], kann aber auch auf heutigen [[Computer]]n, die das [[Zweierkomplement]] benutzen, imitiert werden. Für das Ergebnis ist unerheblich, ob die Modulo-Operation nach jeder Addition oder am Ende erfolgt.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 76f.</ref> Um [[Arithmetischer Überlauf|Überlauf]] zu vermeiden, erfolgt in einer Implementierung diese Rechnung nicht erst am Ende.


Grundsätzlich kann für <math>K</math> eine beliebige [[natürliche Zahl]] gewählt werden, der Algorithmus würde entsprechend als Fletcher-<math>2\cdot K</math> bezeichnet werden. Verbreitet sind Fletcher-16 und Fletcher-32, teilweise auch Fletcher-8.<ref name="maxino69">Theresa C. Maxino, Philip J. Koopman: ''The Effectiveness of Checksums for Embedded Control Networks''. 2009, S. 69.</ref>
Grundsätzlich kann für <math>K</math> eine beliebige [[natürliche Zahl]] gewählt werden, der Algorithmus würde entsprechend als Fletcher-<math>2\cdot K</math> bezeichnet werden. Verbreitet sind Fletcher-16 und Fletcher-32, teilweise auch Fletcher-8.<ref name="maxino69">Theresa C. Maxino, Philip J. Koopman: ''The Effectiveness of Checksums for Embedded Control Networks''. 2009, S. 69.</ref>

=== Beispielrechnung ===
Wird die Nachricht „Wikipedia“ in [[American Standard Code for Information Interchange|ASCII]] binär übermittelt, findet für Fletcher-16 mit <math>M=255</math> die in der Tabelle ausgeführte Rechnung statt. Ist ein Zwischenergebnis einer Summe größergleich 255, wird modulo angewendet, hier dargestellt als <math>\equiv</math>.

{| class="wikitable" style="text-align:center"
|-
! Nachricht
| W || i || k || i || p || e || d || i || a
! Ergebnis
|-
! binäre Darstellung
| 01010111 || 01101001 || 01101011 || 01101001 || 01110000 || 01100101 || 01100100 || 01101001 || 01100001
|-
! dezimaler Wert
| 87 || 105 || 107 || 105 || 112 || 101 || 100 || 105 || 97
|-
! <math>sum_1</math>
| 87 || 192 || 299 <math>\equiv</math> 44 || 149 || 261 <math>\equiv</math> 6 || 107 || 207 || 312 <math>\equiv</math> 57 || 154 || '''154'''
|-
! <math>sum_2</math>
| 87 || 279 <math>\equiv</math> 24 || 68 || 217 || 223 || 330 <math>\equiv</math> 75 || 282 <math>\equiv</math> 27 || 84 || 238 || '''238'''
|}


=== Implementierung in C ===
=== Implementierung in C ===
Zeile 40: Zeile 62:
John Fletcher entwickelte diesen Algorithmus Ende der 1970er Jahre im [[Lawrence Livermore National Laboratory]]. Im Januar 1982 veröffentlichte die [[IEEE Communications Society]] Fletchers Artikel über die Prüfsumme und ihre Eigenschaften in ''[[IEEE Transactions on Communications]]''.<ref>John Kodis: ''Fletcher’s Checksum: Error correction at a fraction of the cost''. 1992, Kapitel Enter Fletcher.</ref> Darin begründet er seine Erfindung einer arithmetischen Prüfsumme damit, dass Computer eher für [[Arithmetik|arithmetische Operationen]] (Grundrechenarten) als für [[Polynomdivision]], wie es die Zyklische Redundanzprüfung benötigt, ausgelegt sind. Fletcher beschrieb den Prüfwert nicht als Zusammensetzung von zwei, sondern allgemein von beliebig vielen Summen, wobei die erste wie <math>sum_1</math> fungiert und jede weitere die Zwischenergebnisse der vorhergehenden aufsummiert.<ref name="fletcher248" /> Die Verwendung von mehr als zwei Summen verbessert den Algorithmus jedoch nicht genügend, um die Verlangsamung zu rechtfertigen.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 70, S. 72.</ref>
John Fletcher entwickelte diesen Algorithmus Ende der 1970er Jahre im [[Lawrence Livermore National Laboratory]]. Im Januar 1982 veröffentlichte die [[IEEE Communications Society]] Fletchers Artikel über die Prüfsumme und ihre Eigenschaften in ''[[IEEE Transactions on Communications]]''.<ref>John Kodis: ''Fletcher’s Checksum: Error correction at a fraction of the cost''. 1992, Kapitel Enter Fletcher.</ref> Darin begründet er seine Erfindung einer arithmetischen Prüfsumme damit, dass Computer eher für [[Arithmetik|arithmetische Operationen]] (Grundrechenarten) als für [[Polynomdivision]], wie es die Zyklische Redundanzprüfung benötigt, ausgelegt sind. Fletcher beschrieb den Prüfwert nicht als Zusammensetzung von zwei, sondern allgemein von beliebig vielen Summen, wobei die erste wie <math>sum_1</math> fungiert und jede weitere die Zwischenergebnisse der vorhergehenden aufsummiert.<ref name="fletcher248" /> Die Verwendung von mehr als zwei Summen verbessert den Algorithmus jedoch nicht genügend, um die Verlangsamung zu rechtfertigen.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 70, S. 72.</ref>


Angepasste Varianten von Fletchers Algorithmus werden unter anderem in der [[OSI-Modell#Schicht 4 – Transportschicht (Transport Layer)|vierten Schicht]] (Transport) des [[Internationale Organisation für Normung|ISO]]-Netzwerkprotokollstandards<ref>David M. Piscitello, A. Lyman Chapin: ''Open Systems Networking: TCP/IP and OSI''. Addison-Wesley Longman, Boston 1993, ISBN 0201563347, [http://securityskeptic.typepad.com/the-security-skeptic/osn/Chapter12.pdf Kapitel 12], S. 307.</ref> und im [[IS-IS]]-Protokoll<ref>Adrian Farrel: ''The Internet and Its Protocols: A Comparative Approach''. Morgan Kaufmann, San Francisco 2004, ISBN 155860913X, S. 181 ({{Google Buch|BuchID=LtBegQowqFsC|Seite=181}}).</ref> eingesetzt. J. Zweig und C. Partridge schlugen 1990 vor, das [[Transmission Control Protocol|TCP]] dahingehend zu erweitern, dass auch Fletcher’s Checksum verwendet werden kann.<ref>J. Zweig, C. Partridge: [https://tools.ietf.org/html/rfc1146 ''TCP Alternate Checksum Options''.] [[Request for Comments|RFC]] 1146, 1990.</ref> Diese Erweiterung besitzt seit 2011 den Status [[Request for Comments#RFC-Status|''Historic'']].<ref>L. Eggert: [https://tools.ietf.org/html/rfc1146 ''Moving the Undeployed TCP Extensions RFC 1072, RFC 1106, RFC 1110, RFC 1145, RFC 1146, RFC 1379, RFC 1644, and RFC 1693 to Historic Status''.] [[Request for Comments|RFC]] 6247, 2011.</ref>
Angepasste Varianten von Fletchers Algorithmus werden unter anderem in der [[OSI-Modell#Schicht 4 – Transportschicht (Transport Layer)|vierten Schicht]] (Transport) des [[Internationale Organisation für Normung|ISO]]-Netzwerkprotokollstandards<ref>David M. Piscitello, A. Lyman Chapin: ''Open Systems Networking: TCP/IP and OSI''. Addison-Wesley Longman, Boston 1993, ISBN 0201563347, [http://securityskeptic.typepad.com/the-security-skeptic/osn/Chapter12.pdf Kapitel 12], S. 307.</ref> und im [[IS-IS]]-Protokoll<ref>Adrian Farrel: ''The Internet and Its Protocols: A Comparative Approach''. Morgan Kaufmann, San Francisco 2004, ISBN 155860913X, S. 181 ({{Google Buch|BuchID=LtBegQowqFsC|Seite=181}}).</ref> eingesetzt. J. Zweig und C. Partridge schlugen 1990 vor, das [[Transmission Control Protocol|TCP]] dahingehend zu erweitern, dass Fletcher’s Checksum verwendet werden kann.<ref>J. Zweig, C. Partridge: [https://tools.ietf.org/html/rfc1146 ''TCP Alternate Checksum Options''.] [[Request for Comments|RFC]] 1146, 1990.</ref> Diese Erweiterung besitzt seit 2011 den Status [[Request for Comments#RFC-Status|''Historic'']].<ref>L. Eggert: [https://tools.ietf.org/html/rfc1146 ''Moving the Undeployed TCP Extensions RFC 1072, RFC 1106, RFC 1110, RFC 1145, RFC 1146, RFC 1379, RFC 1644, and RFC 1693 to Historic Status''.] [[Request for Comments|RFC]] 6247, 2011.</ref>


1995 stellte [[Mark Adler (Informatiker)|Mark Adler]] mit [[Adler-32]] eine Variation von Fletcher-32 vor, bei der modulo 65.521 (die größte [[Primzahl]] &lt;&nbsp;2<sup>16</sup>) gerechnet wird.
1995 stellte [[Mark Adler (Informatiker)|Mark Adler]] mit [[Adler-32]] eine Variation von Fletcher-32 vor, bei der modulo 65.521 (die größte [[Primzahl]] &lt;&nbsp;2<sup>16</sup>) gerechnet wird.
Zeile 49: Zeile 71:
Die Anzahl an möglichen Prüfwerten von Fletcher’s Checksum beträgt <math>M^2</math>, im Folgenden sei angenommen, dass mit steigenden <math>K</math> auch <math>M</math> entsprechend größer gewählt wird. Eine genügend lange Nachricht vorausgesetzt, verringert sich also die Anzahl an unerkannten Fehlern, je größer <math>K</math> gewählt wird.<ref name="maxino69" /> Nach dieser Logik sollte die Einerkomplement-Variante von Fletcher’s Checksum schlechter sein als die im Zweierkomplement. <math>2^K-1</math> besitzt jedoch wesentlich weniger [[Primfaktorzerlegung|Primfaktoren]] als <math>2^K</math>, weswegen die Einerkomplement-Variante trotz leicht aufwändigerer Berechnung zu bevorzugen ist.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 71f.</ref> Nachfolgende Eigenschaften beziehen sich stets auf den Algorithmus mit <math>M=2^K-1</math>.
Die Anzahl an möglichen Prüfwerten von Fletcher’s Checksum beträgt <math>M^2</math>, im Folgenden sei angenommen, dass mit steigenden <math>K</math> auch <math>M</math> entsprechend größer gewählt wird. Eine genügend lange Nachricht vorausgesetzt, verringert sich also die Anzahl an unerkannten Fehlern, je größer <math>K</math> gewählt wird.<ref name="maxino69" /> Nach dieser Logik sollte die Einerkomplement-Variante von Fletcher’s Checksum schlechter sein als die im Zweierkomplement. <math>2^K-1</math> besitzt jedoch wesentlich weniger [[Primfaktorzerlegung|Primfaktoren]] als <math>2^K</math>, weswegen die Einerkomplement-Variante trotz leicht aufwändigerer Berechnung zu bevorzugen ist.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 71f.</ref> Nachfolgende Eigenschaften beziehen sich stets auf den Algorithmus mit <math>M=2^K-1</math>.


Bis zu einer von <math>M</math> abhängigen Länge der Nachricht besitzt Fletcher’s Checksum eine [[Hamming-Distanz]] von <math>h=3</math>, für längere Nachrichten ist <math>h=2</math>. Ein-Bit-Fehler werden demnach immer entdeckt, einzelne Zwei-Bit-Fehler nicht mehr, wenn sie mehr als <math>K\cdot M=K\cdot (2^K-1)</math> Bits auseinanderliegen: Bei Fletcher-16 gilt die schlechtere Hamming-Distanz also ab einer Nachrichtenlänge von 2.056 Bit,<ref>Theresa C. Maxino, Philip J. Koopman: ''The Effectiveness of Checksums for Embedded Control Networks''. 2009, S. 65.</ref> während für eine geeignete CRC mit einem gleichlangen Prüfwert ein Abstand zwischen den beiden Fehlern von kleinergleich 65.535 Bits noch zum Erkennen reicht. Hier offenbart sich auch die Schwäche der Umsetzung mit <math>M=256</math>, für diese muss der Abstand kleinergleich 16 Bits sein.<ref>John G. Fletcher: ''An Arithmetic Checksum for Serial Transmissions''. 1982, S. 251.</ref> Das Verfahren entdeckt alle [[Bündelfehler]] bis zur Länge <math>k</math>, anfällig ist es gegen solche Burstfehler, die alle Einsen innerhalb eines Blocks zu Nullen invertieren oder vice versa, denn im Einerkomplement sind dies die beiden Darstellungen der Null. Lässt man diese spezielle Art von Fehler aus der Betrachtung heraus, werden alle Bündelfehler bis zur Länge <math>2\cdot k</math> erkannt.<ref>Theresa C. Maxino, Philip J. Koopman: ''The Effectiveness of Checksums for Embedded Control Networks''. 2009, S. 64f.</ref>
Bis zu einer von <math>M</math> abhängigen Länge der Nachricht besitzt Fletcher’s Checksum eine [[Hamming-Distanz]] von <math>h=3</math>, für längere Nachrichten ist <math>h=2</math>. Ein-Bit-Fehler werden demnach immer entdeckt, einzelne Zwei-Bit-Fehler nicht mehr, wenn sie mehr als <math>K\cdot M=K\cdot (2^K-1)</math> Bits auseinanderliegen: Bei Fletcher-16 gilt die schlechtere Hamming-Distanz also ab einer Nachrichtenlänge von 2.056 Bit,<ref>Theresa C. Maxino, Philip J. Koopman: ''The Effectiveness of Checksums for Embedded Control Networks''. 2009, S. 65.</ref> während für eine geeignete CRC mit einem gleichlangen Prüfwert ein Abstand zwischen den beiden Fehlern von kleinergleich 65.535 Bits noch zum Erkennen reicht. Hier offenbart sich die Schwäche der Umsetzung mit <math>M=256</math>, für diese muss der Abstand kleinergleich 16 Bits sein.<ref>John G. Fletcher: ''An Arithmetic Checksum for Serial Transmissions''. 1982, S. 251.</ref> Das Verfahren entdeckt alle [[Bündelfehler]] bis zur Länge <math>k</math>, anfällig ist es gegen solche Burstfehler, die alle Einsen innerhalb eines Blocks zu Nullen invertieren oder vice versa, denn im Einerkomplement sind dies die beiden Darstellungen der Null. Lässt man diese spezielle Art von Fehler aus der Betrachtung heraus, werden alle Bündelfehler bis zur Länge <math>2\cdot k</math> erkannt.<ref>Theresa C. Maxino, Philip J. Koopman: ''The Effectiveness of Checksums for Embedded Control Networks''. 2009, S. 64f.</ref>


Fletcher’s Checksum erkennt keine fälschlich an eine Nachricht angehängten Nullen, da sich dadurch die Summen nicht mehr verändern. Dies kann verhindert werden, indem der Empfänger entweder die Länge der Nachricht im Voraus kennt oder sie ihm innerhalb dieser mitgeteilt wird.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 73.</ref>
Fletcher’s Checksum erkennt keine fälschlich an eine Nachricht angehängten Nullen, da sich dadurch die Summen nicht mehr verändern. Dies kann verhindert werden, indem der Empfänger entweder die Länge der Nachricht im Voraus kennt oder sie ihm innerhalb dieser mitgeteilt wird.<ref>Anastase Nakassis: ''Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls.'' 1988, S. 73.</ref>

Version vom 25. März 2017, 20:09 Uhr

Fletcher’s Checksum (übersetzt „Fletchers Prüfsumme“, auch Fletcher Checksum oder Fletcher Algorithm) ist ein 1982 von John G. Fletcher (1934–2012)[1] vorgestelltes Fehlererkennungsverfahren in Form einer Prüfsumme. Mithilfe des Verfahrens können beispielsweise Fehler in einer digitalen Datenübertragung entdeckt werden. Es basiert darauf, dass die einzelnen Bits der Nachricht nicht nur aufsummiert, sondern zusätzlich abhängig von ihrer Position gewichtet werden. Damit stellt der Algorithmus einen Kompromiss zwischen der langsameren, aber besseren Zyklischen Redundanzprüfung und den fehleranfälligeren simplen Berechnungen wie einer einfachen Summe oder der Vertikalen Redundanzprüfung dar. Fletcher’s Checksum wird unter anderem in verschiedenen Netzwerkprotokollen verwendet.

Der Algorithmus

Die binär übertragene Nachricht wird in Abschnitte der Länge unterteilt, jeweils Bits bilden dann einen Block. Der letzte Block wird gegebenenfalls aufgefüllt und jeder Block als unsigned Integer interpretiert. Die Anzahl der Blöcke sei . Der Prüfwert besteht aus zwei verschiedenen Summen: Die erste () summiert nacheinander sämtliche Blöcke auf, die zweite () ist die Summe aller Zwischenergebnisse der ersten Summe.[2] Der erste Block geht also -mal in ein, der letzte dagegen nur einmal. Werden durch eine Störung beim Übertragen Bits invertiert oder zwei Blöcke unterschiedlichen Wertes vertauscht, verändert sich im Normalfall der Prüfwert: Der Fehler fällt auf.

Da der Prüfwert unabhängig von der Länge der Nachricht in einer festen Anzahl von Bits (im Allgemeinen ) übertragen werden können soll, werden beide Summen zuletzt modulo gerechnet und anschließend in die Nachricht integriert. Normalerweise wird oder gewählt.[2] Letzteres entspricht einer Berechnung im Einerkomplement, kann aber auch auf heutigen Computern, die das Zweierkomplement benutzen, imitiert werden. Für das Ergebnis ist unerheblich, ob die Modulo-Operation nach jeder Addition oder am Ende erfolgt.[3] Um Überlauf zu vermeiden, erfolgt in einer Implementierung diese Rechnung nicht erst am Ende.

Grundsätzlich kann für eine beliebige natürliche Zahl gewählt werden, der Algorithmus würde entsprechend als Fletcher- bezeichnet werden. Verbreitet sind Fletcher-16 und Fletcher-32, teilweise auch Fletcher-8.[4]

Beispielrechnung

Wird die Nachricht „Wikipedia“ in ASCII binär übermittelt, findet für Fletcher-16 mit die in der Tabelle ausgeführte Rechnung statt. Ist ein Zwischenergebnis einer Summe größergleich 255, wird modulo angewendet, hier dargestellt als .

Nachricht W i k i p e d i a Ergebnis
binäre Darstellung 01010111 01101001 01101011 01101001 01110000 01100101 01100100 01101001 01100001
dezimaler Wert 87 105 107 105 112 101 100 105 97
87 192 299 44 149 261 6 107 207 312 57 154 154
87 279 24 68 217 223 330 75 282 27 84 238 238

Implementierung in C

In C auf einer Zweierkomplementmaschine könnte eine Umsetzung eines Unterprogramms für Fletcher-16 mit , das als Prüfwert eine 16-Bit-unsigned-Integer zurückgibt, die beide Summen aufeinanderfolgend beinhaltet, folgendermaßen aussehen:

  uint16_t Fletcher-16 (const uint8_t* data, const size_t length) {

      uint16_t sum1 = 0, sum2 = 0;

      for (size_t i = 0; i < length; i++) {
          sum1 = (sum1 + data[i]) % 255;
          sum2 = (sum2 + sum1) % 255;
      }

      return (sum2 << 8) | sum1;
  }

Varianten

In einer Variante, die Fletchers ursprünglichem Algorithmus näher liegt,[2] werden zwei Prüfblöcke der Länge an das Ende der Nachricht angehängt, die derart gewählt werden, dass beide Summen des Prüfwerts über die neue, verlängerte Nachricht null betragen. Dazu werden die beiden Summen und zur Nachricht zuerst wie gehabt berechnet. Dem nächsten Block wird dann der Wert zugewiesen, dem übernächsten . Betty Salzberg zeigte kurz nach Fletchers Veröffentlichung, dass die Lage der beiden aufeinanderfolgenden Prüfblöcke beliebig innerhalb der Nachricht gewählt werden kann, ohne dass dabei die Prüfeigenschaften verschlechtert werden. Sollen die Blöcke an die Stelle bzw. , ist ihr Wert als und , jeweils modulo , zu wählen. Dabei entspricht der Anzahl an Blöcken der ursprünglichen Nachricht.[5] Tatsachlich können die beiden Blöcke an frei wählbaren Stellen und stehen, solange der Betrag und teilerfremd sind.[6]

Keith Sklower entwickelte eine Rekursion, die zwei Blöcke auf einmal verarbeitet und am Ende denselben Prüfwert wie Fletcher’s Checksum erzeugt.[7]

In bestimmten Fehlermodellen kann es von Vorteil sein, den Prüfwert im Trailer statt im Header, wie es in den meisten Netzwerkprotokollen umgesetzt ist, unterzubringen.[8]

Beschleunigung

Werden die Summen in mehr als Bits gespeichert, muss die Modulo-Operation nicht nach jeder Addition erfolgen, sondern erst, wenn die Variable droht überzulaufen. Man nimmt den Worst Case an, also eine Nachricht, bei der jeder Block den größtmöglichen Wert aufweist, um eine obere Grenze (upper bound) für die Anzahl an Additionen ohne Überlauf zu ermitteln. Besitzen beide Summen denselben Datentyp, erfolgt dieser zuerst auf . Bei einer Umsetzung von Fletcher-16 mit und sowie unter Gebrauch von 16-Bit-unsigned-Integers beträgt .[9]

Fletcher’s Checksum kann sowohl parallelisiert als auch vektorisiert werden.[10] Der Algorithmus kann zusätzlich durch generelle Optimierungsmethoden, insbesondere Loop unrolling, beschleunigt werden.

Geschichte

John Fletcher entwickelte diesen Algorithmus Ende der 1970er Jahre im Lawrence Livermore National Laboratory. Im Januar 1982 veröffentlichte die IEEE Communications Society Fletchers Artikel über die Prüfsumme und ihre Eigenschaften in IEEE Transactions on Communications.[11] Darin begründet er seine Erfindung einer arithmetischen Prüfsumme damit, dass Computer eher für arithmetische Operationen (Grundrechenarten) als für Polynomdivision, wie es die Zyklische Redundanzprüfung benötigt, ausgelegt sind. Fletcher beschrieb den Prüfwert nicht als Zusammensetzung von zwei, sondern allgemein von beliebig vielen Summen, wobei die erste wie fungiert und jede weitere die Zwischenergebnisse der vorhergehenden aufsummiert.[2] Die Verwendung von mehr als zwei Summen verbessert den Algorithmus jedoch nicht genügend, um die Verlangsamung zu rechtfertigen.[12]

Angepasste Varianten von Fletchers Algorithmus werden unter anderem in der vierten Schicht (Transport) des ISO-Netzwerkprotokollstandards[13] und im IS-IS-Protokoll[14] eingesetzt. J. Zweig und C. Partridge schlugen 1990 vor, das TCP dahingehend zu erweitern, dass Fletcher’s Checksum verwendet werden kann.[15] Diese Erweiterung besitzt seit 2011 den Status Historic.[16]

1995 stellte Mark Adler mit Adler-32 eine Variation von Fletcher-32 vor, bei der modulo 65.521 (die größte Primzahl < 216) gerechnet wird.

Eigenschaften und Vergleich mit anderen Verfahren

Einer gut implementierten Zyklischen Redundanzprüfung (CRC) ist Fletcher’s Checksum bei gleicher Byteanzahl des Prüfwerts in der Fehlererkennung unterlegen.[17] Dafür kann die Berechnung schon beginnen, bevor die Nachricht vollendet wurde, da es keine direkten Abhängigkeiten zu gibt.[6] Werden einzelne Blöcke verändert, nachdem die Prüfsumme bereits ausgerechnet wurde, kann diese aktualisiert werden, ohne auf die unveränderten Blöcke zuzugreifen.[18]

Die Anzahl an möglichen Prüfwerten von Fletcher’s Checksum beträgt , im Folgenden sei angenommen, dass mit steigenden auch entsprechend größer gewählt wird. Eine genügend lange Nachricht vorausgesetzt, verringert sich also die Anzahl an unerkannten Fehlern, je größer gewählt wird.[4] Nach dieser Logik sollte die Einerkomplement-Variante von Fletcher’s Checksum schlechter sein als die im Zweierkomplement. besitzt jedoch wesentlich weniger Primfaktoren als , weswegen die Einerkomplement-Variante trotz leicht aufwändigerer Berechnung zu bevorzugen ist.[19] Nachfolgende Eigenschaften beziehen sich stets auf den Algorithmus mit .

Bis zu einer von abhängigen Länge der Nachricht besitzt Fletcher’s Checksum eine Hamming-Distanz von , für längere Nachrichten ist . Ein-Bit-Fehler werden demnach immer entdeckt, einzelne Zwei-Bit-Fehler nicht mehr, wenn sie mehr als Bits auseinanderliegen: Bei Fletcher-16 gilt die schlechtere Hamming-Distanz also ab einer Nachrichtenlänge von 2.056 Bit,[20] während für eine geeignete CRC mit einem gleichlangen Prüfwert ein Abstand zwischen den beiden Fehlern von kleinergleich 65.535 Bits noch zum Erkennen reicht. Hier offenbart sich die Schwäche der Umsetzung mit , für diese muss der Abstand kleinergleich 16 Bits sein.[21] Das Verfahren entdeckt alle Bündelfehler bis zur Länge , anfällig ist es gegen solche Burstfehler, die alle Einsen innerhalb eines Blocks zu Nullen invertieren oder vice versa, denn im Einerkomplement sind dies die beiden Darstellungen der Null. Lässt man diese spezielle Art von Fehler aus der Betrachtung heraus, werden alle Bündelfehler bis zur Länge erkannt.[22]

Fletcher’s Checksum erkennt keine fälschlich an eine Nachricht angehängten Nullen, da sich dadurch die Summen nicht mehr verändern. Dies kann verhindert werden, indem der Empfänger entweder die Länge der Nachricht im Voraus kennt oder sie ihm innerhalb dieser mitgeteilt wird.[23]

Obwohl bei Adler-32 die Besetzung von durch eine Primzahl die möglichen Prüfwerte besser verteilt, gibt es doch insgesamt weniger von ihnen, sodass die aufwändigere Berechnung trotzdem fast immer schlechter prüft als Fletcher-32.[4]

Damit ist Fletcher’s Checksum bei gleicher Bitanzahl des Prüfwerts sowohl einfachen Algorithmen wie der Vertikalen Redundanzprüfung, einer simplen Summe oder der XOR-Prüfsumme als auch der Adler-Prüfsumme überlegen und sollte benutzt werden, sofern die Rechenleistung vorhanden ist. Ist eine CRC umsetzbar, sollte diese jedoch bevorzugt werden.[24]

Literatur

Einzelnachweise

  1. In Memoriam John Fletcher. Lawrence Livermore National Laboratory, abgerufen am 16. März 2017 (englisch).
  2. a b c d John G. Fletcher: An Arithmetic Checksum for Serial Transmissions. 1982, S. 248.
  3. Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, S. 76f.
  4. a b c Theresa C. Maxino, Philip J. Koopman: The Effectiveness of Checksums for Embedded Control Networks. 2009, S. 69.
  5. Betty Salzberg: A Modification of Fletcher’s Checksum. In: IEEE Transactions on Communications. Jahrgang 31, Heft 2, 1983, doi:10.1109/TCOM.1983.1095789, S. 296.
  6. a b Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, S. 65.
  7. Keith Sklower: Improving the Efficiency of the OSI Checksum Calculation. In: Computer Communication Review. Jahrgang 19, Heft 5, 1989, doi:10.1145/74681.74684, S. 32–43 (PDF; 524 kB).
  8. Jonathan Stone, Michael Greenwald, Craig Partridge, James Hughes: Performance of Checksums and CRC’s over Real Data. In: IEEE/ACM Transactions on Networking. Jahrgang 6, Heft 5, 1998, doi:10.1109/90.731187.
  9. Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, S. 68, für die Herleitung siehe Appendix A, S. 76ff.
  10. Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, Appendix D, S. 84ff.
  11. John Kodis: Fletcher’s Checksum: Error correction at a fraction of the cost. 1992, Kapitel Enter Fletcher.
  12. Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, S. 70, S. 72.
  13. David M. Piscitello, A. Lyman Chapin: Open Systems Networking: TCP/IP and OSI. Addison-Wesley Longman, Boston 1993, ISBN 0201563347, Kapitel 12, S. 307.
  14. Adrian Farrel: The Internet and Its Protocols: A Comparative Approach. Morgan Kaufmann, San Francisco 2004, ISBN 155860913X, S. 181 (eingeschränkte Vorschau in der Google-Buchsuche).
  15. J. Zweig, C. Partridge: TCP Alternate Checksum Options. RFC 1146, 1990.
  16. L. Eggert: Moving the Undeployed TCP Extensions RFC 1072, RFC 1106, RFC 1110, RFC 1145, RFC 1146, RFC 1379, RFC 1644, and RFC 1693 to Historic Status. RFC 6247, 2011.
  17. Theresa C. Maxino, Philip J. Koopman: The Effectiveness of Checksums for Embedded Control Networks. 2009, S. 67.
  18. Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, S. 65, für Formeln und deren Herleitung siehe Appendix B, S. 80ff.
  19. Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, S. 71f.
  20. Theresa C. Maxino, Philip J. Koopman: The Effectiveness of Checksums for Embedded Control Networks. 2009, S. 65.
  21. John G. Fletcher: An Arithmetic Checksum for Serial Transmissions. 1982, S. 251.
  22. Theresa C. Maxino, Philip J. Koopman: The Effectiveness of Checksums for Embedded Control Networks. 2009, S. 64f.
  23. Anastase Nakassis: Fletcher’s Error Detection Algorithm: How to implement it efficiently and how to avoid the most common pitfalls. 1988, S. 73.
  24. Theresa C. Maxino, Philip J. Koopman: The Effectiveness of Checksums for Embedded Control Networks. 2009, S. 70.