RFC 1624 INFORMATIONAL CHECKSUM · IP · ALGORITHMS

Computation of the Internet Checksum via Incremental Update

A corrected method for updating an Internet checksum when a 16-bit field changes.

On rfc-editor.org ↗
PUBLISHED
May 1994
AUTHORS
A. Rijsinghani
STREAM
Legacy
BUILDS ON
RFC 1141 — Incremental Checksum
UPDATED FIELD SIZE
16 bits
CORRECTED EQUATIONS RECOMMENDED
Equation 3 or Equation 4
RFC UPDATED
RFC 1141
DOI
10.17487/RFC1624
ERRATA
Reported errata

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Network Working Group                             A. Rijsinghani, Editor
Request for Comments: 1624                 Digital Equipment Corporation
Updates: 1141                                                   May 1994
Category: Informational


                  Computation of the Internet Checksum
                         via Incremental Update

Status of this Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

Abstract

   This memo describes an updated technique for incremental computation
   of the standard Internet checksum.  It updates the method described
   in RFC 1141.

Table of Contents

   1. Introduction ..........................................  1
   2. Notation and Equations ................................  2
   3. Discussion ............................................  2
   4. Examples ..............................................  3
   5. Checksum verification by end systems ..................  4
   6. Historical Note .......................................  4
   7. Acknowledgments .......................................  5
   8. Security Considerations ...............................  5
   9. Conclusions ...........................................  5
   10. Author's Address .....................................  5
   11. References ...........................................  6

1.  Introduction

   Incremental checksum update is useful in speeding up several
   types of operations routinely performed on IP packets, such as
   TTL update, IP fragmentation, and source route update.

   RFC 1071, on pages 4 and 5, describes a procedure to
   incrementally update the standard Internet checksum.  The
   relevant discussion, though comprehensive, was not complete.
   Therefore, RFC 1141 was published to replace this description
   on Incremental Update.  In particular, RFC 1141 provides a
   more detailed exposure to the procedure described in RFC 1071.
   However, it computes a result for certain cases that differs
   from the one obtained from scratch (one's complement of one's
   complement sum of the original fields).

   For the sake of completeness, this memo briefly highlights key
   points from RFCs 1071 and 1141.  Based on these discussions,
   an updated procedure to incrementally compute the standard
   Internet checksum is developed and presented.

2.  Notation and Equations

   Given the following notation:

          HC  - old checksum in header
          C   - one's complement sum of old header
          HC' - new checksum in header
          C'  - one's complement sum of new header
          m   - old value of a 16-bit field
          m'  - new value of a 16-bit field

          RFC 1071 states that C' is:

          C' = C + (-m) + m'    --    [Eqn. 1]
             = C + (m' - m)

   As RFC 1141 points out, the equation above is not useful for direct
   use in incremental updates since C and C' do not refer to the actual
   checksum stored in the header.  In addition, it is pointed out that
   RFC 1071 did not specify that all arithmetic must be performed using
   one's complement arithmetic.

   Finally, complementing the above equation to get the actual checksum,
   RFC 1141 presents the following:

          HC' = ~(C + (-m) + m')
              = HC + (m - m')
              = HC + m + ~m'    --    [Eqn. 2]

3.  Discussion

   Although this equation appears to work, there are boundary conditions
   under which it produces a result which differs from the one obtained
   by checksum computation from scratch.  This is due to the way zero is
   handled in one's complement arithmetic.

   In one's complement, there are two representations of zero: the all
   zero and the all one bit values, often referred to as +0 and -0.
   One's complement addition of non-zero inputs can produce -0 as a
   result, but never +0.  Since there is guaranteed to be at least one
   non-zero field in the IP header, and the checksum field in the
   protocol header is the complement of the sum, the checksum field can
   never contain ~(+0), which is -0 (0xFFFF).  It can, however, contain
   ~(-0), which is +0 (0x0000).

   RFC 1141 yields an updated header checksum of -0 when it should be
   +0.  This is because it assumed that one's complement has a
   distributive property, which does not hold when the result is 0 (see
   derivation of [Eqn. 2]).

   The problem is avoided by not assuming this property.  The correct
   equation is given below:

          HC' = ~(C + (-m) + m')    --    [Eqn. 3]
              = ~(~HC + ~m + m')

4.  Examples

   Consider an IP packet header in which a 16-bit field m = 0x5555
   changes to m' = 0x3285.  Also, the one's complement sum of all other
   header octets is 0xCD7A.

   Then the header checksum would be:

          HC = ~(0xCD7A + 0x5555)
             = ~0x22D0
             =  0xDD2F

   The new checksum via recomputation is:

          HC' = ~(0xCD7A + 0x3285)
              = ~0xFFFF
              =  0x0000

   Using [Eqn. 2], as specified in RFC 1141, the new checksum is
   computed as:

          HC' = HC + m + ~m'
              =  0xDD2F + 0x5555 + ~0x3285
              =  0xFFFF

   which does not match that computed from scratch, and moreover can
   never obtain for an IP header.

   Applying [Eqn. 3] to the example above, we get the correct result:

          HC' = ~(C + (-m) + m')
              = ~(0x22D0 + ~0x5555 + 0x3285)
              = ~0xFFFF
              =  0x0000

5.  Checksum verification by end systems

   If an end system verifies the checksum by including the checksum
   field itself in the one's complement sum and then comparing the
   result against -0, as recommended by RFC 1071, it does not matter if
   an intermediate system generated a -0 instead of +0 due to the RFC
   1141 property described here.  In the example above:

          0xCD7A + 0x3285 + 0xFFFF = 0xFFFF
          0xCD7A + 0x3285 + 0x0000 = 0xFFFF

   However, implementations exist which verify the checksum by computing
   it and comparing against the header checksum field.

   It is recommended that intermediate systems compute incremental
   checksum using the method described in this document, and end systems
   verify checksum as per the method described in RFC 1071.

   The method in [Eqn. 3] is slightly more expensive than the one in RFC
   1141.  If this is a concern, the two additional instructions can be
   eliminated by subtracting complements with borrow [see Sec. 7].  This
   would result in the following equation:

          HC' = HC - ~m - m'    --    [Eqn. 4]

          In the example shown above,

          HC' = HC - ~m - m'
              =  0xDD2F - ~0x5555 - 0x3285
              =  0x0000

6.  Historical Note

   A historical aside: the fact that standard one's complement
   arithmetic produces negative zero results is one of its main
   drawbacks; it makes for difficulty in interpretation.  In the CDC
   6000 series computers [4], this problem was avoided by using
   subtraction as the primitive in one's complement arithmetic (i.e.,
   addition is subtraction of the complement).

7.  Acknowledgments

   The contribution of the following individuals to the work that led to
   this document is acknowledged:

          Manu Kaycee - Ascom Timeplex, Incorporated
          Paul Koning - Digital Equipment Corporation
          Tracy Mallory - 3Com Corporation
          Krishna Narayanaswamy - Digital Equipment Corporation
          Atul Pandya - Digital Equipment Corporation

   The failure condition was uncovered as a result of IP testing on a
   product which implemented the RFC 1141 algorithm.  It was analyzed,
   and the updated algorithm devised.  This algorithm was also verified
   using simulation.  It was also shown that the failure condition
   disappears if the checksum verification is done as per RFC 1071.

8.  Security Considerations

   Security issues are not discussed in this memo.

9.  Conclusions

   It is recommended that either [Eqn. 3] or [Eqn. 4] be the
   implementation technique used for incremental update of the standard
   Internet checksum.

10.  Author's Address

   Anil Rijsinghani
   Digital Equipment Corporation
   550 King St
   Littleton, MA 01460

   Phone: (508) 486-6786
   EMail: anil@levers.enet.dec.com

11.  References

   [1] Postel, J., "Internet Protocol - DARPA Internet Program Protocol
       Specification", STD 5, RFC 791, DARPA, September 1981.

   [2] Braden, R., Borman, D., and C. Partridge, "Computing the Internet
       Checksum", RFC 1071, ISI, Cray Research, BBN Laboratories,
       September 1988.

   [3] Mallory, T., and A. Kullberg, "Incremental Updating of the
       Internet Checksum", RFC 1141, BBN Communications, January 1990.

   [4] Thornton, J., "Design of a Computer -- the Control
       Data 6600", Scott, Foresman and Company, 1970.

ISO Plain Language

On this page
PROBLEMRFC 1141's incremental checksum equation can produce a result that differs from recomputing the checksum from the changed header.
MECHANISMRFC 1624 explains the two zero representations in one's-complement arithmetic and gives corrected equations for changing a 16-bit field.
WHY IT MATTERSThis Informational memo updates RFC 1141 and recommends either of its corrected equations for incremental checksum updates.

§1Why Update a Checksum Incrementally

Routers and other systems sometimes change fields in an IP packet, such as the Time to Live, fragmentation information or a source route. Recomputing the checksum over the full header after each change can be avoided by updating the old checksum to reflect the changed field.

RFC 1141 gave an incremental method, but RFC 1624 shows that it can produce a checksum different from a full recomputation in certain cases. This memo develops a corrected procedure and updates RFC 1141.

A system can update a packet checksum after changing one field instead of recalculating it from scratch. This memo corrects a case where the earlier shortcut gave the wrong result.

§2The Earlier Update Equation

The memo uses HC for the old checksum and HC' for the new checksum. It uses m and m' for the old and new values of a changed 16-bit field. RFC 1141's equation is HC' = HC + m + ~m'.

That equation is intended to adjust the checksum by accounting for the field's change. RFC 1624 shows that the result can differ from recomputing the checksum over the updated header, because the arithmetic used for the Internet checksum handles zero in a special way.

The earlier method adjusts the saved checksum using the old and new field values. The adjustment fails in a special case involving how this arithmetic represents zero.

§3Two Representations of Zero

One's-complement arithmetic has two bit patterns for zero: all zero bits, called positive zero, and all one bits, called negative zero. The memo explains that adding non-zero inputs can produce negative zero but not positive zero. In an IP header, the checksum can contain 0x0000 but cannot contain 0xFFFF.

RFC 1141's equation can produce negative zero in a case where recomputation produces positive zero. The corrected equation avoids assuming a distributive property that does not hold when the result is zero: HC' = ~(~HC + ~m + m').

The checksum arithmetic has two different bit patterns for zero. The corrected rule preserves the right pattern when a field change makes the checksum sum reach zero.

§4The Example That Exposes the Error

The memo gives an example where a 16-bit field changes from 0x5555 to 0x3285, and the sum of the other header octets is 0xCD7A. Recomputing the checksum gives 0x0000. Applying RFC 1141's equation instead gives 0xFFFF, which the memo says cannot occur in an IP header.

Applying the corrected equation gives 0x0000, matching the recomputed checksum. The example demonstrates the boundary case that distinguishes the procedures.

In the memo's example, the old equation gives 0xFFFF while recalculating gives 0x0000. The corrected equation matches the recalculated result.

§5Recommendations for Senders and Receivers

The memo recommends that intermediate systems use its corrected incremental method. It recommends that end systems verify a checksum by including the checksum field in the one's-complement sum and comparing the result with negative zero, as RFC 1071 describes. Some implementations compare a separately computed checksum with the header field, so they can be affected by the discrepancy.

Equation 3 is slightly more expensive than the RFC 1141 method. The memo gives Equation 4, HC' = HC - ~m - m', as a less costly form and recommends either Equation 3 or Equation 4. Its security considerations section says security issues are not discussed.

Intermediate systems should use either corrected equation. End systems should verify checksums using the method described in RFC 1071.

§6References