• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            【轉(zhuǎn)】IP checksum definition

            IP checksum definition

            The IP checksum is the 16 bit one's complement of the one's complement sum of all 16 bit words in the header.

            One question many people may ask is "What is the 1's complement sum ?". This is because all computers utilize the 2's complement representation and the 1's complement is not used. The following gives a short introduction.

            2's complement fixed point integers (8-bit)

            BinaryDecimalHex
            0000 0000000
            0000 0001101
            0000 0010202
            0000 0011303
            1111 1111-1FF
            1111 1110-2FE
            1111 1101-3FD

            Let's add two intergers: 
            -3 + 5 = 2 
            FD + 05 = 01 02
            Discarding the carry (01) gives the correct result.

            1's complement fixed point integers (8-bit)

            BinaryDecimalHex
            0000 0000000
            0000 0001101
            0000 0010202
            0000 0011303
            1111 1111-0FF
            1111 1110-1FE
            1111 1101-2FD
            1111 1100-3FC

            Add the same numbers: 
            -3 + 5 = 2
            FC + 05 = 01 01
            Adding the carry (01) to the LSB (01) gives the correct result:
            01 + 01 = 02

            So, the 1's complement sum is done by summing the numbers and adding the carry (or carries) to the result..

            Simple Internet checksum example

            Suppose we have an 8-bit, 2's complement, machine and send the packet

            FE 05 00

            where 00 is the checksum field.

            Let's calculate and verify the Internet checksum.

             FE + 05  =  01 03

            This is the result of the normal (2's complement) addition. The 1's complement sum requires the addition of the carry to the 8-bit word (even though we will not get the same result)

             03 + 01 = 04  

            so the 1's complement sum of FE + 05 is 04.

            The 1's complement of the 1's complement sum (Internet checksum) will be 

            ~04  = FB

            and the packet will be sent as

            FE 05 FB 

            Now, at the receiving end we add all the received bytes, including the checksum (again using the 2's complement representation)

            FE + 05 + FB  = 01 FE  

            The 1's complement sum is  

             FE + 01 = FF = -0  

            which checks that the transmission was OK (see below).

            A more complex example (32-bit machine)

            As shown in RFC 1071, the checksum calculation is done in the following way:

            (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.

            Packet

            01 00 F2 03 F4 F5 F6 F7 00 00

            (00 00 is the checksum field)

            Form the 16-bit words

            0100 F203 F4F5 F6F7

            Calculate 2's complement sum

            0100 + F203 + F4F5 + F6F7 = 0002 DEEF (store the sum in a 32-bit word)

            Add the carries (0002) to get the 16-bit 1's complement sum

            DEEF + 002 = DEF1

            Calculate 1's complement of the 1's complement sum

            ~DEF1 = 210E

            We send the packet including the checksum 21 0E

            01 00 F2 03 F4 F5 F6 F7 21 0E

            At the receiving

            0100 + F203 + F4F5 + F6F7 + 210E = 0002 FFFD
            FFFD + 0002 = FFFF

            which checks OK.

            Comments
            It may look awkword to use a 1's complement addition on 2's complement machines. This method however has its own benefits.

            Probably the most important is that it is endian independent. Little Endian computers store hex numbers with the LSB last (Intel processors for example). Big Endian computers put the LSB first (IBM mainframes for example). When carry is added to the LSB to form the 1's complement sum (see the example) it doesn't matter if we add 03 + 01 or 01 + 03. The result is the same.

            Other benefits include the easiness of checking the transmission and the checksum calculation plus a variety of ways to speed up the calculation by updating only IP fields that have changed.


            The IP Header Checksum is computed on the header fields only. 
            Before starting the calculation, the checksum fields (octets 11 and 12) 
            are made equal to zero. 

            In the example code, 
            u16 buff[] is an array containing all octets in the header with octets 11 and 12 equal to zero. 
            u16 len_ip_header is the length (number of octets) of the header.


            /*
            **************************************************************************
            Function: ip_sum_calc
            Description: Calculate the 16 bit IP sum.
            ***************************************************************************
            */
            typedef unsigned short u16;
            typedef unsigned long u32;

            u16 ip_sum_calc(u16 len_ip_header, u16 buff[])
            {
                    u16 word16;
                    u32 sum=0;
                    u16 i;
                
                    // make 16 bit words out of every two adjacent 8 bit words in the packet
                    // and add them up
                    for (i=0;i<len_ip_header;i=i+2){
                            word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
                            sum = sum + (u32) word16;
                    }

                    // take only 16 bits out of the 32 bit sum and add up the carries
                    while (sum>>16)
                            sum = (sum & 0xFFFF)+(sum >> 16);

                    // one's complement the result
                    sum = ~sum;

                    return ((u16) sum);
            }

            posted on 2010-10-20 17:05 小默 閱讀(697) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Network

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久久WWW免费人成精品| 久久人人爽人人人人片av| 久久久无码精品亚洲日韩蜜臀浪潮| 久久亚洲国产精品五月天婷| 久久国产精品偷99| 国产99久久久国产精品小说| 色偷偷久久一区二区三区| 久久不射电影网| 亚洲国产成人乱码精品女人久久久不卡 | 久久国产免费观看精品| 久久国产热这里只有精品| 精品久久久无码人妻中文字幕| 精品国产VA久久久久久久冰| 精品乱码久久久久久夜夜嗨| 精品久久久噜噜噜久久久| 久久天天躁狠狠躁夜夜2020| 久久精品人人做人人妻人人玩 | 午夜精品久久久久久99热| Xx性欧美肥妇精品久久久久久| 久久人人爽人人爽人人片AV不| 久久香蕉一级毛片| 久久久久久久久无码精品亚洲日韩| 亚洲国产精品久久久久网站| 久久人爽人人爽人人片AV| 久久综合久久综合亚洲| 狠狠综合久久综合中文88| 久久av无码专区亚洲av桃花岛| 精品一久久香蕉国产线看播放| 久久精品中文字幕无码绿巨人| 亚洲伊人久久成综合人影院| 久久综合九色综合97_久久久| 午夜久久久久久禁播电影| 精品多毛少妇人妻AV免费久久| 久久久青草青青国产亚洲免观| 91精品国产色综久久| 99久久久精品| 久久国产乱子精品免费女| 国产成人综合久久综合| 好久久免费视频高清| 久久99精品国产99久久6男男| 久久成人国产精品|