Computing the Internet Checksum (RFC1071)

시작하기전에

[https]RFC1071[] 에서 제시하는 checksum 알고리즘은 IP, UDP, TCP protocol 에서 packet의 오류정정 확인을 위한 용도로 사용됩니다.

만약 이 글을 읽고 계시는 분이 IP RAW packet을 다루게 된다면 [https]RFC1071[] 에서 제시하는 비교적 단순한 checksum 을 구현하거나 이해해야 할겁니다.

구현에 있어서 Byte order에 대한 이해와 고려가 필요합니다.

소스

  • RFC1071 에서 C언어로의 구현 예시
    {
               /* 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;
       }
    


  • 필자가 수정하여 제시하는 예제소스
    unsigned int hwport_rfc1071_checksum(const void *s_data, size_t s_size)
    { /* hwport_internet_checksum (RFC1071) */
        register uint32_t s_result = (uint32_t)0u;
    
        while(s_size > ((size_t)1u)) {
            s_result += (uint32_t)(*((const uint16_t *)s_data));
            s_data = ((const uint16_t *)s_data) + ((size_t)1u);
            s_size -= (size_t)2u;
        }
    
        if(s_size > ((size_t)0u)) {
            s_result += (uint32_t)(*((const uint8_t *)s_data));
        }
    
        s_result = (s_result >> 16) + (s_result & ((uint32_t)0xffffu));
        s_result += s_result >> 16;
    
        return((unsigned int)((~s_result) & ((uint32_t)0xffffu)));
    }
    





/*

[ FrontPage | PrintView | RawView | RSS ]

Copyright ⓒ MINZKN.COM
All Rights Reserved.

MINZKN

----

*/