1418 lines
52 KiB
Plaintext
1418 lines
52 KiB
Plaintext
|
||
|
||
|
||
|
||
Network Working Group R. Braden
|
||
Request for Comments: 1071 ISI
|
||
D. Borman
|
||
Cray Research
|
||
C. Partridge
|
||
BBN Laboratories
|
||
September 1988
|
||
|
||
|
||
Computing the Internet Checksum
|
||
|
||
|
||
Status of This Memo
|
||
|
||
This memo summarizes techniques and algorithms for efficiently
|
||
computing the Internet checksum. It is not a standard, but a set of
|
||
useful implementation techniques. Distribution of this memo is
|
||
unlimited.
|
||
|
||
1. Introduction
|
||
|
||
This memo discusses methods for efficiently computing the Internet
|
||
checksum that is used by the standard Internet protocols IP, UDP, and
|
||
TCP.
|
||
|
||
An efficient checksum implementation is critical to good performance.
|
||
As advances in implementation techniques streamline the rest of the
|
||
protocol processing, the checksum computation becomes one of the
|
||
limiting factors on TCP performance, for example. It is usually
|
||
appropriate to carefully hand-craft the checksum routine, exploiting
|
||
every machine-dependent trick possible; a fraction of a microsecond
|
||
per TCP data byte can add up to a significant CPU time savings
|
||
overall.
|
||
|
||
In outline, the Internet checksum algorithm is very simple:
|
||
|
||
(1) Adjacent octets to be checksummed are paired to form 16-bit
|
||
integers, and the 1's complement sum of these 16-bit integers is
|
||
formed.
|
||
|
||
(2) To generate a checksum, the checksum field itself is cleared,
|
||
the 16-bit 1's complement sum is computed over the octets
|
||
concerned, and the 1's complement of this sum is placed in the
|
||
checksum field.
|
||
|
||
(3) To check a checksum, the 1's complement sum is computed over the
|
||
same set of octets, including the checksum field. If the result
|
||
is all 1 bits (-0 in 1's complement arithmetic), the check
|
||
succeeds.
|
||
|
||
Suppose a checksum is to be computed over the sequence of octets
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 1]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
A, B, C, D, ... , Y, Z. Using the notation [a,b] for the 16-bit
|
||
integer a*256+b, where a and b are bytes, then the 16-bit 1's
|
||
complement sum of these bytes is given by one of the following:
|
||
|
||
[A,B] +' [C,D] +' ... +' [Y,Z] [1]
|
||
|
||
[A,B] +' [C,D] +' ... +' [Z,0] [2]
|
||
|
||
where +' indicates 1's complement addition. These cases
|
||
correspond to an even or odd count of bytes, respectively.
|
||
|
||
On a 2's complement machine, the 1's complement sum must be
|
||
computed by means of an "end around carry", i.e., any overflows
|
||
from the most significant bits are added into the least
|
||
significant bits. See the examples below.
|
||
|
||
Section 2 explores the properties of this checksum that may be
|
||
exploited to speed its calculation. Section 3 contains some
|
||
numerical examples of the most important implementation
|
||
techniques. Finally, Section 4 includes examples of specific
|
||
algorithms for a variety of common CPU types. We are grateful
|
||
to Van Jacobson and Charley Kline for their contribution of
|
||
algorithms to this section.
|
||
|
||
The properties of the Internet checksum were originally
|
||
discussed by Bill Plummer in IEN-45, entitled "Checksum Function
|
||
Design". Since IEN-45 has not been widely available, we include
|
||
it as an extended appendix to this RFC.
|
||
|
||
2. Calculating the Checksum
|
||
|
||
This simple checksum has a number of wonderful mathematical
|
||
properties that may be exploited to speed its calculation, as we
|
||
will now discuss.
|
||
|
||
|
||
(A) Commutative and Associative
|
||
|
||
As long as the even/odd assignment of bytes is respected, the
|
||
sum can be done in any order, and it can be arbitrarily split
|
||
into groups.
|
||
|
||
For example, the sum [1] could be split into:
|
||
|
||
( [A,B] +' [C,D] +' ... +' [J,0] )
|
||
|
||
+' ( [0,K] +' ... +' [Y,Z] ) [3]
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 2]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
(B) Byte Order Independence
|
||
|
||
The sum of 16-bit integers can be computed in either byte order.
|
||
Thus, if we calculate the swapped sum:
|
||
|
||
[B,A] +' [D,C] +' ... +' [Z,Y] [4]
|
||
|
||
the result is the same as [1], except the bytes are swapped in
|
||
the sum! To see why this is so, observe that in both orders the
|
||
carries are the same: from bit 15 to bit 0 and from bit 7 to bit
|
||
8. In other words, consistently swapping bytes simply rotates
|
||
the bits within the sum, but does not affect their internal
|
||
ordering.
|
||
|
||
Therefore, the sum may be calculated in exactly the same way
|
||
regardless of the byte order ("big-endian" or "little-endian")
|
||
of the underlaying hardware. For example, assume a "little-
|
||
endian" machine summing data that is stored in memory in network
|
||
("big-endian") order. Fetching each 16-bit word will swap
|
||
bytes, resulting in the sum [4]; however, storing the result
|
||
back into memory will swap the sum back into network byte order.
|
||
|
||
Byte swapping may also be used explicitly to handle boundary
|
||
alignment problems. For example, the second group in [3] can be
|
||
calculated without concern to its odd/even origin, as:
|
||
|
||
[K,L] +' ... +' [Z,0]
|
||
|
||
if this sum is byte-swapped before it is added to the first
|
||
group. See the example below.
|
||
|
||
(C) Parallel Summation
|
||
|
||
On machines that have word-sizes that are multiples of 16 bits,
|
||
it is possible to develop even more efficient implementations.
|
||
Because addition is associative, we do not have to sum the
|
||
integers in the order they appear in the message. Instead we
|
||
can add them in "parallel" by exploiting the larger word size.
|
||
|
||
To compute the checksum in parallel, simply do a 1's complement
|
||
addition of the message using the native word size of the
|
||
machine. For example, on a 32-bit machine we can add 4 bytes at
|
||
a time: [A,B,C,D]+'... When the sum has been computed, we "fold"
|
||
the long sum into 16 bits by adding the 16-bit segments. Each
|
||
16-bit addition may produce new end-around carries that must be
|
||
added.
|
||
|
||
Furthermore, again the byte order does not matter; we could
|
||
instead sum 32-bit words: [D,C,B,A]+'... or [B,A,D,C]+'... and
|
||
then swap the bytes of the final 16-bit sum as necessary. See
|
||
the examples below. Any permutation is allowed that collects
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 3]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
all the even-numbered data bytes into one sum byte and the odd-
|
||
numbered data bytes into the other sum byte.
|
||
|
||
|
||
There are further coding techniques that can be exploited to speed up
|
||
the checksum calculation.
|
||
|
||
(1) Deferred Carries
|
||
|
||
Depending upon the machine, it may be more efficient to defer
|
||
adding end-around carries until the main summation loop is
|
||
finished.
|
||
|
||
One approach is to sum 16-bit words in a 32-bit accumulator, so
|
||
the overflows build up in the high-order 16 bits. This approach
|
||
typically avoids a carry-sensing instruction but requires twice
|
||
as many additions as would adding 32-bit segments; which is
|
||
faster depends upon the detailed hardware architecture.
|
||
|
||
(2) Unwinding Loops
|
||
|
||
To reduce the loop overhead, it is often useful to "unwind" the
|
||
inner sum loop, replicating a series of addition commands within
|
||
one loop traversal. This technique often provides significant
|
||
savings, although it may complicate the logic of the program
|
||
considerably.
|
||
|
||
(3) Combine with Data Copying
|
||
|
||
Like checksumming, copying data from one memory location to
|
||
another involves per-byte overhead. In both cases, the
|
||
bottleneck is essentially the memory bus, i.e., how fast the
|
||
data can be fetched. On some machines (especially relatively
|
||
slow and simple micro-computers), overhead can be significantly
|
||
reduced by combining memory-to-memory copy and the checksumming,
|
||
fetching the data only once for both.
|
||
|
||
(4) Incremental Update
|
||
|
||
Finally, one can sometimes avoid recomputing the entire checksum
|
||
when one header field is updated. The best-known example is a
|
||
gateway changing the TTL field in the IP header, but there are
|
||
other examples (for example, when updating a source route). In
|
||
these cases it is possible to update the checksum without
|
||
scanning the message or datagram.
|
||
|
||
To update the checksum, simply add the differences of the
|
||
sixteen bit integers that have been changed. To see why this
|
||
works, observe that every 16-bit integer has an additive inverse
|
||
and that addition is associative. From this it follows that
|
||
given the original value m, the new value m', and the old
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 4]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
checksum C, the new checksum C' is:
|
||
|
||
C' = C + (-m) + m' = C + (m' - m)
|
||
|
||
|
||
3. Numerical Examples
|
||
|
||
We now present explicit examples of calculating a simple 1's
|
||
complement sum on a 2's complement machine. The examples show the
|
||
same sum calculated byte by bye, by 16-bits words in normal and
|
||
swapped order, and 32 bits at a time in 3 different orders. All
|
||
numbers are in hex.
|
||
|
||
Byte-by-byte "Normal" Swapped
|
||
Order Order
|
||
|
||
Byte 0/1: 00 01 0001 0100
|
||
Byte 2/3: f2 03 f203 03f2
|
||
Byte 4/5: f4 f5 f4f5 f5f4
|
||
Byte 6/7: f6 f7 f6f7 f7f6
|
||
--- --- ----- -----
|
||
Sum1: 2dc 1f0 2ddf0 1f2dc
|
||
|
||
dc f0 ddf0 f2dc
|
||
Carrys: 1 2 2 1
|
||
-- -- ---- ----
|
||
Sum2: dd f2 ddf2 f2dd
|
||
|
||
Final Swap: dd f2 ddf2 ddf2
|
||
|
||
|
||
Byte 0/1/2/3: 0001f203 010003f2 03f20100
|
||
Byte 4/5/6/7: f4f5f6f7 f5f4f7f6 f7f6f5f4
|
||
-------- -------- --------
|
||
Sum1: 0f4f7e8fa 0f6f4fbe8 0fbe8f6f4
|
||
|
||
Carries: 0 0 0
|
||
|
||
Top half: f4f7 f6f4 fbe8
|
||
Bottom half: e8fa fbe8 f6f4
|
||
----- ----- -----
|
||
Sum2: 1ddf1 1f2dc 1f2dc
|
||
|
||
ddf1 f2dc f2dc
|
||
Carrys: 1 1 1
|
||
---- ---- ----
|
||
Sum3: ddf2 f2dd f2dd
|
||
|
||
Final Swap: ddf2 ddf2 ddf2
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 5]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Finally, here an example of breaking the sum into two groups, with
|
||
the second group starting on a odd boundary:
|
||
|
||
|
||
Byte-by-byte Normal
|
||
Order
|
||
|
||
Byte 0/1: 00 01 0001
|
||
Byte 2/ : f2 (00) f200
|
||
--- --- -----
|
||
Sum1: f2 01 f201
|
||
|
||
Byte 4/5: 03 f4 03f4
|
||
Byte 6/7: f5 f6 f5f6
|
||
Byte 8/: f7 (00) f700
|
||
--- --- -----
|
||
Sum2: 1f0ea
|
||
|
||
Sum2: f0ea
|
||
Carry: 1
|
||
-----
|
||
Sum3: f0eb
|
||
|
||
Sum1: f201
|
||
Sum3 byte swapped: ebf0
|
||
-----
|
||
Sum4: 1ddf1
|
||
|
||
Sum4: ddf1
|
||
Carry: 1
|
||
-----
|
||
Sum5: ddf2
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 6]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
4. Implementation Examples
|
||
|
||
In this section we show examples of Internet checksum implementation
|
||
algorithms that have been found to be efficient on a variety of
|
||
CPU's. In each case, we show the core of the algorithm, without
|
||
including environmental code (e.g., subroutine linkages) or special-
|
||
case code.
|
||
|
||
4.1 "C"
|
||
|
||
The following "C" code algorithm computes the checksum with an inner
|
||
loop that sums 16-bits at a time in a 32-bit accumulator.
|
||
|
||
in 6
|
||
{
|
||
/* Compute Internet Checksum for "count" bytes
|
||
* beginning at location "addr".
|
||
*/
|
||
register long sum = 0;
|
||
|
||
while( count > 1 ) {
|
||
/* This is the inner loop */
|
||
sum += * (unsigned short) addr++;
|
||
count -= 2;
|
||
}
|
||
|
||
/* Add left-over byte, if any */
|
||
if( count > 0 )
|
||
sum += * (unsigned char *) addr;
|
||
|
||
/* Fold 32-bit sum to 16 bits */
|
||
while (sum>>16)
|
||
sum = (sum & 0xffff) + (sum >> 16);
|
||
|
||
checksum = ~sum;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 7]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
4.2 Motorola 68020
|
||
|
||
The following algorithm is given in assembler language for a Motorola
|
||
68020 chip. This algorithm performs the sum 32 bits at a time, and
|
||
unrolls the loop with 16 replications. For clarity, we have omitted
|
||
the logic to add the last fullword when the length is not a multiple
|
||
of 4. The result is left in register d0.
|
||
|
||
With a 20MHz clock, this routine was measured at 134 usec/kB summing
|
||
random data. This algorithm was developed by Van Jacobson.
|
||
|
||
|
||
movl d1,d2
|
||
lsrl #6,d1 | count/64 = # loop traversals
|
||
andl #0x3c,d2 | Then find fractions of a chunk
|
||
negl d2
|
||
andb #0xf,cc | Clear X (extended carry flag)
|
||
|
||
jmp pc@(2$-.-2:b,d2) | Jump into loop
|
||
|
||
1$: | Begin inner loop...
|
||
|
||
movl a0@+,d2 | Fetch 32-bit word
|
||
addxl d2,d0 | Add word + previous carry
|
||
movl a0@+,d2 | Fetch 32-bit word
|
||
addxl d2,d0 | Add word + previous carry
|
||
|
||
| ... 14 more replications
|
||
2$:
|
||
dbra d1,1$ | (NB- dbra doesn't affect X)
|
||
|
||
movl d0,d1 | Fold 32 bit sum to 16 bits
|
||
swap d1 | (NB- swap doesn't affect X)
|
||
addxw d1,d0
|
||
jcc 3$
|
||
addw #1,d0
|
||
3$:
|
||
andl #0xffff,d0
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 8]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
4.3 Cray
|
||
|
||
The following example, in assembler language for a Cray CPU, was
|
||
contributed by Charley Kline. It implements the checksum calculation
|
||
as a vector operation, summing up to 512 bytes at a time with a basic
|
||
summation unit of 32 bits. This example omits many details having to
|
||
do with short blocks, for clarity.
|
||
|
||
Register A1 holds the address of a 512-byte block of memory to
|
||
checksum. First two copies of the data are loaded into two vector
|
||
registers. One is vector-shifted right 32 bits, while the other is
|
||
vector-ANDed with a 32 bit mask. Then the two vectors are added
|
||
together. Since all these operations chain, it produces one result
|
||
per clock cycle. Then it collapses the result vector in a loop that
|
||
adds each element to a scalar register. Finally, the end-around
|
||
carry is performed and the result is folded to 16-bits.
|
||
|
||
EBM
|
||
A0 A1
|
||
VL 64 use full vectors
|
||
S1 <32 form 32-bit mask from the right.
|
||
A2 32
|
||
V1 ,A0,1 load packet into V1
|
||
V2 S1&V1 Form right-hand 32-bits in V2.
|
||
V3 V1>A2 Form left-hand 32-bits in V3.
|
||
V1 V2+V3 Add the two together.
|
||
A2 63 Prepare to collapse into a scalar.
|
||
S1 0
|
||
S4 <16 Form 16-bit mask from the right.
|
||
A4 16
|
||
CK$LOOP S2 V1,A2
|
||
A2 A2-1
|
||
A0 A2
|
||
S1 S1+S2
|
||
JAN CK$LOOP
|
||
S2 S1&S4 Form right-hand 16-bits in S2
|
||
S1 S1>A4 Form left-hand 16-bits in S1
|
||
S1 S1+S2
|
||
S2 S1&S4 Form right-hand 16-bits in S2
|
||
S1 S1>A4 Form left-hand 16-bits in S1
|
||
S1 S1+S2
|
||
S1 #S1 Take one's complement
|
||
CMR At this point, S1 contains the checksum.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 9]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
4.4 IBM 370
|
||
|
||
The following example, in assembler language for an IBM 370 CPU, sums
|
||
the data 4 bytes at a time. For clarity, we have omitted the logic
|
||
to add the last fullword when the length is not a multiple of 4, and
|
||
to reverse the bytes when necessary. The result is left in register
|
||
RCARRY.
|
||
|
||
This code has been timed on an IBM 3090 CPU at 27 usec/KB when
|
||
summing all one bits. This time is reduced to 24.3 usec/KB if the
|
||
trouble is taken to word-align the addends (requiring special cases
|
||
at both the beginning and the end, and byte-swapping when necessary
|
||
to compensate for starting on an odd byte).
|
||
|
||
* Registers RADDR and RCOUNT contain the address and length of
|
||
* the block to be checksummed.
|
||
*
|
||
* (RCARRY, RSUM) must be an even/odd register pair.
|
||
* (RCOUNT, RMOD) must be an even/odd register pair.
|
||
*
|
||
CHECKSUM SR RSUM,RSUM Clear working registers.
|
||
SR RCARRY,RCARRY
|
||
LA RONE,1 Set up constant 1.
|
||
*
|
||
SRDA RCOUNT,6 Count/64 to RCOUNT.
|
||
AR RCOUNT,RONE +1 = # times in loop.
|
||
SRL RMOD,26 Size of partial chunk to RMOD.
|
||
AR RADDR,R3 Adjust addr to compensate for
|
||
S RADDR,=F(64) jumping into the loop.
|
||
SRL RMOD,1 (RMOD/4)*2 is halfword index.
|
||
LH RMOD,DOPEVEC9(RMOD) Use magic dope-vector for offset,
|
||
B LOOP(RMOD) and jump into the loop...
|
||
*
|
||
* Inner loop:
|
||
*
|
||
LOOP AL RSUM,0(,RADDR) Add Logical fullword
|
||
BC 12,*+6 Branch if no carry
|
||
AR RCARRY,RONE Add 1 end-around
|
||
AL RSUM,4(,RADDR) Add Logical fullword
|
||
BC 12,*+6 Branch if no carry
|
||
AR RCARRY,RONE Add 1 end-around
|
||
*
|
||
* ... 14 more replications ...
|
||
*
|
||
A RADDR,=F'64' Increment address ptr
|
||
BCT RCOUNT,LOOP Branch on Count
|
||
*
|
||
* Add Carries into sum, and fold to 16 bits
|
||
*
|
||
ALR RCARRY,RSUM Add SUM and CARRY words
|
||
BC 12,*+6 and take care of carry
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 10]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
AR RCARRY,RONE
|
||
SRDL RCARRY,16 Fold 32-bit sum into
|
||
SRL RSUM,16 16-bits
|
||
ALR RCARRY,RSUM
|
||
C RCARRY,=X'0000FFFF' and take care of any
|
||
BNH DONE last carry
|
||
S RCARRY,=X'0000FFFF'
|
||
DONE X RCARRY,=X'0000FFFF' 1's complement
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 11]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
IEN 45
|
||
Section 2.4.4.5
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
TCP Checksum Function Design
|
||
|
||
|
||
|
||
William W. Plummer
|
||
|
||
|
||
Bolt Beranek and Newman, Inc.
|
||
50 Moulton Street
|
||
Cambridge MA 02138
|
||
|
||
|
||
5 June 1978
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 12]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
1. Introduction
|
||
|
||
Checksums are included in packets in order that errors
|
||
encountered during transmission may be detected. For Internet
|
||
protocols such as TCP [1,9] this is especially important because
|
||
packets may have to cross wireless networks such as the Packet
|
||
Radio Network [2] and Atlantic Satellite Network [3] where
|
||
packets may be corrupted. Internet protocols (e.g., those for
|
||
real time speech transmission) can tolerate a certain level of
|
||
transmission errors and forward error correction techniques or
|
||
possibly no checksum at all might be better. The focus in this
|
||
paper is on checksum functions for protocols such as TCP where
|
||
the required reliable delivery is achieved by retransmission.
|
||
|
||
Even if the checksum appears good on a message which has been
|
||
received, the message may still contain an undetected error. The
|
||
probability of this is bounded by 2**(-C) where C is the number
|
||
of checksum bits. Errors can arise from hardware (and software)
|
||
malfunctions as well as transmission errors. Hardware induced
|
||
errors are usually manifested in certain well known ways and it
|
||
is desirable to account for this in the design of the checksum
|
||
function. Ideally no error of the "common hardware failure" type
|
||
would go undetected.
|
||
|
||
An example of a failure that the current checksum function
|
||
handles successfully is picking up a bit in the network interface
|
||
(or I/O buss, memory channel, etc.). This will always render the
|
||
checksum bad. For an example of how the current function is
|
||
inadequate, assume that a control signal stops functioning in the
|
||
network interface and the interface stores zeros in place of the
|
||
real data. These "all zero" messages appear to have valid
|
||
checksums. Noise on the "There's Your Bit" line of the ARPANET
|
||
Interface [4] may go undetected because the extra bits input may
|
||
cause the checksum to be perturbed (i.e., shifted) in the same
|
||
way as the data was.
|
||
|
||
Although messages containing undetected errors will occasionally
|
||
be passed to higher levels of protocol, it is likely that they
|
||
will not make sense at that level. In the case of TCP most such
|
||
messages will be ignored, but some could cause a connection to be
|
||
aborted. Garbled data could be viewed as a problem for a layer
|
||
of protocol above TCP which itself may have a checksuming scheme.
|
||
|
||
This paper is the first step in design of a new checksum function
|
||
for TCP and some other Internet protocols. Several useful
|
||
properties of the current function are identified. If possible
|
||
|
||
- 1 -
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 13]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
these should be retained in any new function. A number of
|
||
plausible checksum schemes are investigated. Of these only the
|
||
"product code" seems to be simple enough for consideration.
|
||
|
||
2. The Current TCP Checksum Function
|
||
|
||
The current function is oriented towards sixteen-bit machines
|
||
such as the PDP-11 but can be computed easily on other machines
|
||
(e.g., PDP-10). A packet is thought of as a string of 16-bit
|
||
bytes and the checksum function is the one's complement sum (add
|
||
with end-around carry) of those bytes. It is the one's
|
||
complement of this sum which is stored in the checksum field of
|
||
the TCP header. Before computing the checksum value, the sender
|
||
places a zero in the checksum field of the packet. If the
|
||
checksum value computed by a receiver of the packet is zero, the
|
||
packet is assumed to be valid. This is a consequence of the
|
||
"negative" number in the checksum field exactly cancelling the
|
||
contribution of the rest of the packet.
|
||
|
||
Ignoring the difficulty of actually evaluating the checksum
|
||
function for a given packet, the way of using the checksum
|
||
described above is quite simple, but it assumes some properties
|
||
of the checksum operator (one's complement addition, "+" in what
|
||
follows):
|
||
|
||
(P1) + is commutative. Thus, the order in which
|
||
the 16-bit bytes are "added" together is
|
||
unimportant.
|
||
|
||
(P2) + has at least one identity element (The
|
||
current function has two: +0 and -0). This
|
||
allows the sender to compute the checksum
|
||
function by placing a zero in the packet checksum
|
||
field before computing the value.
|
||
|
||
(P3) + has an inverse. Thus, the receiver may
|
||
evaluate the checksum function and expect a zero.
|
||
|
||
(P4) + is associative, allowing the checksum field
|
||
to be anywhere in the packet and the 16-bit bytes
|
||
to be scanned sequentially.
|
||
|
||
Mathematically, these properties of the binary operation "+" over
|
||
the set of 16-bit numbers forms an Abelian group [5]. Of course,
|
||
there are many Abelian groups but not all would be satisfactory
|
||
for use as checksum operators. (Another operator readily
|
||
|
||
- 2 -
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 14]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
available in the PDP-11 instruction set that has all of these
|
||
properties is exclusive-OR, but XOR is unsatisfactory for other
|
||
reasons.)
|
||
|
||
Albeit imprecise, another property which must be preserved in any
|
||
future checksum scheme is:
|
||
|
||
(P5) + is fast to compute on a variety of machines
|
||
with limited storage requirements.
|
||
|
||
The current function is quite good in this respect. On the
|
||
PDP-11 the inner loop looks like:
|
||
|
||
LOOP: ADD (R1)+,R0 ; Add the next 16-bit byte
|
||
ADC R0 ; Make carry be end-around
|
||
SOB R2,LOOP ; Loop over entire packet.
|
||
|
||
( 4 memory cycles per 16-bit byte )
|
||
|
||
On the PDP-10 properties P1-4 are exploited further and two
|
||
16-bit bytes per loop are processed:
|
||
|
||
LOOP: ILDB THIS,PTR ; Get 2 16-bit bytes
|
||
ADD SUM,THIS ; Add into current sum
|
||
JUMPGE SUM,CHKSU2 ; Jump if fewer than 8 carries
|
||
LDB THIS,[POINT 20,SUM,19] ; Get left 16 and carries
|
||
ANDI SUM,177777 ; Save just low 16 here
|
||
ADD SUM,THIS ; Fold in carries
|
||
CHKSU2: SOJG COUNT,LOOP ; Loop over entire packet
|
||
|
||
( 3.1 memory cycles per 16-bit byte )
|
||
|
||
The "extra" instruction in the loops above are required to
|
||
convert the two's complement ADD instruction(s) into a one's
|
||
complement add by making the carries be end-around. One's
|
||
complement arithmetic is better than two's complement because it
|
||
is equally sensitive to errors in all bit positions. If two's
|
||
complement addition were used, an even number of 1's could be
|
||
dropped (or picked up) in the most significant bit channel
|
||
without affecting the value of the checksum. It is just this
|
||
property that makes some sort of addition preferable to a simple
|
||
exclusive-OR which is frequently used but permits an even number
|
||
of drops (pick ups) in any bit channel. RIM10B paper tape format
|
||
used on PDP-10s [10] uses two's complement add because space for
|
||
the loader program is extremely limited.
|
||
|
||
- 3 -
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 15]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
Another property of the current checksum scheme is:
|
||
|
||
(P6) Adding the checksum to a packet does not change
|
||
the information bytes. Peterson [6] calls this a
|
||
"systematic" code.
|
||
|
||
This property allows intermediate computers such as gateway
|
||
machines to act on fields (i.e., the Internet Destination
|
||
Address) without having to first decode the packet. Cyclical
|
||
Redundancy Checks used for error correction are not systematic
|
||
either. However, most applications of CRCs tend to emphasize
|
||
error detection rather than correction and consequently can send
|
||
the message unchanged, with the CRC check bits being appended to
|
||
the end. The 24-bit CRC used by ARPANET IMPs and Very Distant
|
||
Host Interfaces [4] and the ANSI standards for 800 and 6250 bits
|
||
per inch magnetic tapes (described in [11]) use this mode.
|
||
|
||
Note that the operation of higher level protocols are not (by
|
||
design) affected by anything that may be done by a gateway acting
|
||
on possibly invalid packets. It is permissible for gateways to
|
||
validate the checksum on incoming packets, but in general
|
||
gateways will not know how to do this if the checksum is a
|
||
protocol-specific feature.
|
||
|
||
A final property of the current checksum scheme which is actually
|
||
a consequence of P1 and P4 is:
|
||
|
||
(P7) The checksum may be incrementally modified.
|
||
|
||
This property permits an intermediate gateway to add information
|
||
to a packet, for instance a timestamp, and "add" an appropriate
|
||
change to the checksum field of the packet. Note that the
|
||
checksum will still be end-to-end since it was not fully
|
||
recomputed.
|
||
|
||
3. Product Codes
|
||
|
||
Certain "product codes" are potentially useful for checksuming
|
||
purposes. The following is a brief description of product codes
|
||
in the context of TCP. More general treatment can be found in
|
||
Avizienis [7] and probably other more recent works.
|
||
|
||
The basic concept of this coding is that the message (packet) to
|
||
be sent is formed by transforming the original source message and
|
||
adding some "check" bits. By reading this and applying a
|
||
(possibly different) transformation, a receiver can reconstruct
|
||
|
||
- 4 -
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 16]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
the original message and determine if it has been corrupted
|
||
during transmission.
|
||
|
||
Mo Ms Mr
|
||
|
||
----- ----- -----
|
||
| A | code | 7 | decode | A |
|
||
| B | ==> | 1 | ==> | B |
|
||
| C | | 4 | | C |
|
||
----- |...| -----
|
||
| 2 | check plus "valid" flag
|
||
----- info
|
||
|
||
Original Sent Reconstructed
|
||
|
||
With product codes the transformation is Ms = K * Mo . That is,
|
||
the message sent is simply the product of the original message
|
||
Mo and some well known constant K . To decode, the received
|
||
Ms is divided by K which will yield Mr as the quotient and
|
||
0 as the remainder if Mr is to be considered the same as Mo .
|
||
|
||
The first problem is selecting a "good" value for K, the "check
|
||
factor". K must be relatively prime to the base chosen to
|
||
express the message. (Example: Binary messages with K
|
||
incorrectly chosen to be 8. This means that Ms looks exactly
|
||
like Mo except that three zeros have been appended. The only
|
||
way the message could look bad to a receiver dividing by 8 is if
|
||
the error occurred in one of those three bits.)
|
||
|
||
For TCP the base R will be chosen to be 2**16. That is, every
|
||
16-bit byte (word on the PDP-11) will be considered as a digit of
|
||
a big number and that number is the message. Thus,
|
||
|
||
Mo = SIGMA [ Bi * (R**i)] , Bi is i-th byte
|
||
i=0 to N
|
||
|
||
Ms = K * Mo
|
||
|
||
Corrupting a single digit of Ms will yield Ms' = Ms +or-
|
||
C*(R**j) for some radix position j . The receiver will compute
|
||
Ms'/K = Mo +or- C(R**j)/K. Since R and K are relatively prime,
|
||
C*(R**j) cannot be any exact multiple of K. Therefore, the
|
||
division will result in a non-zero remainder which indicates that
|
||
Ms' is a corrupted version of Ms. As will be seen, a good
|
||
choice for K is (R**b - 1), for some b which is the "check
|
||
length" which controls the degree of detection to be had for
|
||
|
||
- 5 -
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 17]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
burst errors which affect a string of digits (i.e., 16-bit bytes)
|
||
in the message. In fact b will be chosen to be 1, so K will
|
||
be 2**16 - 1 so that arithmetic operations will be simple. This
|
||
means that all bursts of 15 or fewer bits will be detected.
|
||
According to [7] this choice for b results in the following
|
||
expression for the fraction of undetected weight 2 errors:
|
||
|
||
f = 16(k-1)/[32(16k-3) + (6/k)] where k is the message length.
|
||
|
||
For large messages f approaches 3.125 per cent as k goes to
|
||
infinity.
|
||
|
||
Multiple precision multiplication and division are normally quite
|
||
complex operations, especially on small machines which typically
|
||
lack even single precision multiply and divide operations. The
|
||
exception to this is exactly the case being dealt with here --
|
||
the factor is 2**16 - 1 on machines with a word length of 16
|
||
bits. The reason for this is due to the following identity:
|
||
|
||
Q*(R**j) = Q, mod (R-1) 0 <= Q < R
|
||
|
||
That is, any digit Q in the selected radix (0, 1, ... R-1)
|
||
multiplied by any power of the radix will have a remainder of Q
|
||
when divided by the radix minus 1.
|
||
|
||
Example: In decimal R = 10. Pick Q = 6.
|
||
|
||
6 = 0 * 9 + 6 = 6, mod 9
|
||
60 = 6 * 9 + 6 = 6, mod 9
|
||
600 = 66 * 9 + 6 = 6, mod 9 etc.
|
||
|
||
More to the point, rem(31415/9) = rem((30000+1000+400+10+5)/9)
|
||
= (3 mod 9) + (1 mod 9) + (4 mod 9) + (1 mod 9) + (5 mod 9)
|
||
= (3+1+4+1+5) mod 9
|
||
= 14 mod 9
|
||
= 5
|
||
|
||
So, the remainder of a number divided by the radix minus one can
|
||
be found by simply summing the digits of the number. Since the
|
||
radix in the TCP case has been chosen to be 2**16 and the check
|
||
factor is 2**16 - 1, a message can quickly be checked by summing
|
||
all of the 16-bit words (on a PDP-11), with carries being
|
||
end-around. If zero is the result, the message can be considered
|
||
valid. Thus, checking a product coded message is exactly the
|
||
same complexity as with the current TCP checksum!
|
||
|
||
- 6 -
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 18]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
In order to form Ms, the sender must multiply the multiple
|
||
precision "number" Mo by 2**16 - 1. Or, Ms = (2**16)Mo - Mo.
|
||
This is performed by shifting Mo one whole word's worth of
|
||
precision and subtracting Mo. Since carries must propagate
|
||
between digits, but it is only the current digit which is of
|
||
interest, one's complement arithmetic is used.
|
||
|
||
(2**16)Mo = Mo0 + Mo1 + Mo2 + ... + MoX + 0
|
||
- Mo = - ( Mo0 + Mo1 + ......... + MoX)
|
||
--------- ----------------------------------
|
||
Ms = Ms0 + Ms1 + ... - MoX
|
||
|
||
A loop which implements this function on a PDP-11 might look
|
||
like:
|
||
LOOP: MOV -2(R2),R0 ; Next byte of (2**16)Mo
|
||
SBC R0 ; Propagate carries from last SUB
|
||
SUB (R2)+,R0 ; Subtract byte of Mo
|
||
MOV R0,(R3)+ ; Store in Ms
|
||
SOB R1,LOOP ; Loop over entire message
|
||
; 8 memory cycles per 16-bit byte
|
||
|
||
Note that the coding procedure is not done in-place since it is
|
||
not systematic. In general the original copy, Mo, will have to
|
||
be retained by the sender for retransmission purposes and
|
||
therefore must remain readable. Thus the MOV R0,(R3)+ is
|
||
required which accounts for 2 of the 8 memory cycles per loop.
|
||
|
||
The coding procedure will add exactly one 16-bit word to the
|
||
message since Ms < (2**16)Mo . This additional 16 bits will be
|
||
at the tail of the message, but may be moved into the defined
|
||
location in the TCP header immediately before transmission. The
|
||
receiver will have to undo this to put Ms back into standard
|
||
format before decoding the message.
|
||
|
||
The code in the receiver for fully decoding the message may be
|
||
inferred by observing that any word in Ms contains the
|
||
difference between two successive words of Mo minus the carries
|
||
from the previous word, and the low order word contains minus the
|
||
low word of Mo. So the low order (i.e., rightmost) word of Mr is
|
||
just the negative of the low order byte of Ms. The next word of
|
||
Mr is the next word of Ms plus the just computed word of Mr
|
||
plus the carry from that previous computation.
|
||
|
||
A slight refinement of the procedure is required in order to
|
||
protect against an all-zero message passing to the destination.
|
||
This will appear to have a valid checksum because Ms'/K = 0/K
|
||
|
||
- 7 -
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 19]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
= 0 with 0 remainder. The refinement is to make the coding be
|
||
Ms = K*Mo + C where C is some arbitrary, well-known constant.
|
||
Adding this constant requires a second pass over the message, but
|
||
this will typically be very short since it can stop as soon as
|
||
carries stop propagating. Chosing C = 1 is sufficient in most
|
||
cases.
|
||
|
||
The product code checksum must be evaluated in terms of the
|
||
desired properties P1 - P7. It has been shown that a factor of
|
||
two more machine cycles are consumed in computing or verifying a
|
||
product code checksum (P5 satisfied?).
|
||
|
||
Although the code is not systematic, the checksum can be verified
|
||
quickly without decoding the message. If the Internet
|
||
Destination Address is located at the least significant end of
|
||
the packet (where the product code computation begins) then it is
|
||
possible for a gateway to decode only enough of the message to
|
||
see this field without having to decode the entire message.
|
||
Thus, P6 is at least partially satisfied. The algebraic
|
||
properties P1 through P4 are not satisfied, but only a small
|
||
amount of computation is needed to account for this -- the
|
||
message needs to be reformatted as previously mentioned.
|
||
|
||
P7 is satisfied since the product code checksum can be
|
||
incrementally updated to account for an added word, although the
|
||
procedure is somewhat involved. Imagine that the original
|
||
message has two halves, H1 and H2. Thus, Mo = H1*(R**j) + H2.
|
||
The timestamp word is to be inserted between these halves to form
|
||
a modified Mo' = H1*(R**(j+1)) + T*(R**j) + H2. Since K has
|
||
been chosen to be R-1, the transmitted message Ms' = Mo'(R-1).
|
||
Then,
|
||
|
||
Ms' = Ms*R + T(R-1)(R**j) + P2((R-1)**2)
|
||
|
||
= Ms*R + T*(R**(j+1)) + T*(R**j) + P2*(R**2) - 2*P2*R - P2
|
||
|
||
Recalling that R is 2**16, the word size on the PDP-11,
|
||
multiplying by R means copying down one word in memory. So,
|
||
the first term of Ms' is simply the unmodified message copied
|
||
down one word. The next term is the new data T added into the
|
||
Ms' being formed beginning at the (j+1)th word. The addition is
|
||
fairly easy here since after adding in T all that is left is
|
||
propagating the carry, and that can stop as soon as no carry is
|
||
produced. The other terms can be handle similarly.
|
||
|
||
- 8 -
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 20]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
4. More Complicated Codes
|
||
|
||
There exists a wealth of theory on error detecting and correcting
|
||
codes. Peterson [6] is an excellent reference. Most of these
|
||
"CRC" schemes are designed to be implemented using a shift
|
||
register with a feedback network composed of exclusive-ORs.
|
||
Simulating such a logic circuit with a program would be too slow
|
||
to be useful unless some programming trick is discovered.
|
||
|
||
One such trick has been proposed by Kirstein [8]. Basically, a
|
||
few bits (four or eight) of the current shift register state are
|
||
combined with bits from the input stream (from Mo) and the result
|
||
is used as an index to a table which yields the new shift
|
||
register state and, if the code is not systematic, bits for the
|
||
output stream (Ms). A trial coding of an especially "good" CRC
|
||
function using four-bit bytes showed showed this technique to be
|
||
about four times as slow as the current checksum function. This
|
||
was true for both the PDP-10 and PDP-11 machines. Of the
|
||
desirable properties listed above, CRC schemes satisfy only P3
|
||
(It has an inverse.), and P6 (It is systematic.). Placement of
|
||
the checksum field in the packet is critical and the CRC cannot
|
||
be incrementally modified.
|
||
|
||
Although the bulk of coding theory deals with binary codes, most
|
||
of the theory works if the alphabet contains q symbols, where
|
||
q is a power of a prime number. For instance q taken as 2**16
|
||
should make a great deal of the theory useful on a word-by-word
|
||
basis.
|
||
|
||
5. Outboard Processing
|
||
|
||
When a function such as computing an involved checksum requires
|
||
extensive processing, one solution is to put that processing into
|
||
an outboard processor. In this way "encode message" and "decode
|
||
message" become single instructions which do not tax the main
|
||
host processor. The Digital Equipment Corporation VAX/780
|
||
computer is equipped with special hardware for generating and
|
||
checking CRCs [13]. In general this is not a very good solution
|
||
since such a processor must be constructed for every different
|
||
host machine which uses TCP messages.
|
||
|
||
It is conceivable that the gateway functions for a large host may
|
||
be performed entirely in an "Internet Frontend Machine". This
|
||
machine would be responsible for forwarding packets received
|
||
|
||
- 9 -
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 21]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
either from the network(s) or from the Internet protocol modules
|
||
in the connected host, and for reassembling Internet fragments
|
||
into segments and passing these to the host. Another capability
|
||
of this machine would be to check the checksum so that the
|
||
segments given to the host are known to be valid at the time they
|
||
leave the frontend. Since computer cycles are assumed to be both
|
||
inexpensive and available in the frontend, this seems reasonable.
|
||
|
||
The problem with attempting to validate checksums in the frontend
|
||
is that it destroys the end-to-end character of the checksum. If
|
||
anything, this is the most powerful feature of the TCP checksum!
|
||
There is a way to make the host-to-frontend link be covered by
|
||
the end-to-end checksum. A separate, small protocol must be
|
||
developed to cover this link. After having validated an incoming
|
||
packet from the network, the frontend would pass it to the host
|
||
saying "here is an Internet segment for you. Call it #123". The
|
||
host would save this segment, and send a copy back to the
|
||
frontend saying, "Here is what you gave me as #123. Is it OK?".
|
||
The frontend would then do a word-by-word comparison with the
|
||
first transmission, and tell the host either "Here is #123
|
||
again", or "You did indeed receive #123 properly. Release it to
|
||
the appropriate module for further processing."
|
||
|
||
The headers on the messages crossing the host-frontend link would
|
||
most likely be covered by a fairly strong checksum so that
|
||
information like which function is being performed and the
|
||
message reference numbers are reliable. These headers would be
|
||
quite short, maybe only sixteen bits, so the checksum could be
|
||
quite strong. The bulk of the message would not be checksumed of
|
||
course.
|
||
The reason this scheme reduces the computing burden on the host
|
||
is that all that is required in order to validate the message
|
||
using the end-to-end checksum is to send it back to the frontend
|
||
machine. In the case of the PDP-10, this requires only 0.5
|
||
memory cycles per 16-bit byte of Internet message, and only a few
|
||
processor cycles to setup the required transfers.
|
||
|
||
6. Conclusions
|
||
|
||
There is an ordering of checksum functions: first and simplest is
|
||
none at all which provides no error detection or correction.
|
||
Second, is sending a constant which is checked by the receiver.
|
||
This also is extremely weak. Third, the exclusive-OR of the data
|
||
may be sent. XOR takes the minimal amount of computer time to
|
||
generate and check, but is not a good checksum. A two's
|
||
complement sum of the data is somewhat better and takes no more
|
||
|
||
- 10 -
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 22]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
computer time to compute. Fifth, is the one's complement sum
|
||
which is what is currently used by TCP. It is slightly more
|
||
expensive in terms of computer time. The next step is a product
|
||
code. The product code is strongly related to one's complement
|
||
sum, takes still more computer time to use, provides a bit more
|
||
protection against common hardware failures, but has some
|
||
objectionable properties. Next is a genuine CRC polynomial code,
|
||
used for checking purposes only. This is very expensive for a
|
||
program to implement. Finally, a full CRC error correcting and
|
||
detecting scheme may be used.
|
||
|
||
For TCP and Internet applications the product code scheme is
|
||
viable. It suffers mainly in that messages must be (at least
|
||
partially) decoded by intermediate gateways in order that they
|
||
can be forwarded. Should product codes not be chosen as an
|
||
improved checksum, some slight modification to the existing
|
||
scheme might be possible. For instance the "add and rotate"
|
||
function used for paper tape by the PDP-6/10 group at the
|
||
Artificial Intelligence Laboratory at M.I.T. Project MAC [12]
|
||
could be useful if it can be proved that it is better than the
|
||
current scheme and that it can be computed efficiently on a
|
||
variety of machines.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
- 11 -
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 23]
|
||
|
||
RFC 1071 Computing the Internet Checksum September 1988
|
||
|
||
|
||
Internet Experiment Note 45 5 June 1978
|
||
TCP Checksum Function Design William W. Plummer
|
||
|
||
References
|
||
|
||
[1] Cerf, V.G. and Kahn, Robert E., "A Protocol for Packet Network
|
||
Communications," IEEE Transactions on Communications, vol.
|
||
COM-22, No. 5, May 1974.
|
||
|
||
[2] Kahn, Robert E., "The Organization of Computer Resources into
|
||
a Packet Radio Network", IEEE Transactions on Communications,
|
||
vol. COM-25, no. 1, pp. 169-178, January 1977.
|
||
|
||
[3] Jacobs, Irwin, et al., "CPODA - A Demand Assignment Protocol
|
||
for SatNet", Fifth Data Communications Symposium, September
|
||
27-9, 1977, Snowbird, Utah
|
||
|
||
[4] Bolt Beranek and Newman, Inc. "Specifications for the
|
||
Interconnection of a Host and an IMP", Report 1822, January
|
||
1976 edition.
|
||
|
||
[5] Dean, Richard A., "Elements of Abstract Algebra", John Wyley
|
||
and Sons, Inc., 1966
|
||
|
||
[6] Peterson, W. Wesley, "Error Correcting Codes", M.I.T. Press
|
||
Cambridge MA, 4th edition, 1968.
|
||
|
||
[7] Avizienis, Algirdas, "A Study of the Effectiveness of Fault-
|
||
Detecting Codes for Binary Arithmetic", Jet Propulsion
|
||
Laboratory Technical Report No. 32-711, September 1, 1965.
|
||
|
||
[8] Kirstein, Peter, private communication
|
||
|
||
[9] Cerf, V. G. and Postel, Jonathan B., "Specification of
|
||
Internetwork Transmission Control Program Version 3",
|
||
University of Southern California Information Sciences
|
||
Institute, January 1978.
|
||
|
||
[10] Digital Equipment Corporation, "PDP-10 Reference Handbook",
|
||
1970, pp. 114-5.
|
||
|
||
[11] Swanson, Robert, "Understanding Cyclic Redundancy Codes",
|
||
Computer Design, November, 1975, pp. 93-99.
|
||
|
||
[12] Clements, Robert C., private communication.
|
||
|
||
[13] Conklin, Peter F., and Rodgers, David P., "Advanced
|
||
Minicomputer Designed by Team Evaluation of Hardware/Software
|
||
Tradeoffs", Computer Design, April 1978, pp. 136-7.
|
||
|
||
- 12 -
|
||
|
||
|
||
|
||
Braden, Borman, & Partridge [Page 24]
|
||
|