在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2170|回复: 1

[原创] 检验和 checksum

[复制链接]
发表于 2020-9-29 09:39:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
[size=1em]检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。



中文名校验和外文名checksum适用领域数据处理和数据通信领域用    途用于校验目的地一组数据项的和数    值0~255应用学科计算机原理
目录



校验和简介[url=]编辑[/url]
这些数据项可以是数字或在计算检验的过程中看作数字的其它字符串。校验和(checksum)是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。TCP和UDP传输层都提供了一个校验和与验证总数是否匹配的服务功能。 [1]
它通常是以十六进制为数制表示的形式,如:
十六进制串:
1
0102030405060708
的校验和是: 24 (十六进制)
如果校验和的数值超过十六进制的FF,也就是255,就要求其补码作为校验和。
通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。

步骤[url=]编辑[/url]
发送方生成检验和
1.将发送的进行检验和运算的数据分成若干个16位的位串,每个位串看成一个二进制数,这里并不管字符串代表什么,是整数、浮点数还是位图都无所谓。
2.将IPUDPTCP的PDU首部中的检验和字段置为0,该字段也参与检验和运算。
3.对这些16位的二进制数进行1的补码和(one's complement sum)运算,累加的结果再取反码即生成了检验码。将检验码放入检验和字段中。
其中1的补码和运算,即带循环进位(end round carry)的加法,最高位有进位应循环进到最低位。反码即二进制各位取反,如0111的反码为1000。
接收方校验检验和
1.接收方将接收的数据(包括检验和字段)按发送方的同样的方法进行1的补码和运算,累加的结果再取反码。
2.校验,如果上步的结果为0,表示传输正确;否则,说明传输有差错。
检验和算法示例
图5.7所示为一个只包含4个16位二进制数进行检验和运算的简单例子。图5.7(a)所示为发送方的运算,①、②、③是3个数据,④是检验和,先置0,也参加检验和运算。⑤是它们的一的补码和,⑥是⑤的反码。发送方将⑥放到检验和字段和数据一起发出。图5.7(b)所示为接收方的运算,如果没有传输差错,最后结果应为0。


表示[url=]编辑[/url]
如:
十六进制串: 0102030405060708
的校验和是: 24 (十六进制)
IP首部校验和计算
IP首部校验和字段是根据IP首部计算的校验和码,它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据校验和码。
为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
TCP和UDP校验和计算
校验和还包含一个96位的伪首标,理论上它位于TCP首标的前面。这个伪首标包含了源地址、目的地址、协议和TCP长度等字段,这使得TCP能够防止出现路由选择错误的数据段。这些信息由网际协议(IP)承载,通过TCP/网络接口,在IP上运行的TCP调用参数或者结果中传递。
伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。
这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。(伪报头保证UDP和TCP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。)
文件校验和
在Windows中,exe校验和是没有必要的,因为系统会负责检查,错误的exe将无法运行。但是sys文件和关键的dll文件是被要求要校验和的。

检验和程序[url=]编辑[/url]
[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em][size=1em]#include<stdio.h>
[size=1em]int main()
[size=1em]{
[size=1em] int a[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
[size=1em] int i,sum=0;
[size=1em] for (i=0;i<8;i++)
[size=1em]     sum+=a;//将每个数相加
[size=1em]     if(sum>0xff)
[size=1em]     {
[size=1em]        sum=~sum;
[size=1em]                  
[size=1em]        sum+=1;

[size=1em]                 
[size=1em]         }
[size=1em] sum=sum&0xff;
[size=1em] printf("0x%x\n",sum);
[size=1em]}



[size=1em]
[size=1em]
[size=1em]Computing the Internet ChecksumStatus 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.[size=1em]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 octetsBraden, 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 collectsBraden, 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 oldBraden, 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)[size=1em]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           ddf2Braden, 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:                       ddf2Braden, Borman, & Partridge                                     [Page 6]
RFC 1071            Computing the Internet Checksum       September 1988[size=1em]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.[size=1em]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[size=1em]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,d0Braden, Borman, & Partridge                                     [Page 8]
RFC 1071            Computing the Internet Checksum       September 1988[size=1em]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[size=1em]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 carryBraden, 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 complementBraden, 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 1978Braden, 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]
发表于 2023-6-19 10:39:09 | 显示全部楼层
大大请问有其他平台的原帖吗?这个格式看起来怪怪的~THX
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 21:05 , Processed in 0.024016 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表