TCP의 체크섬을 구하려고 하는데...

gnoygnas의 이미지

TCP 레이어에서 체크섬을 구하려고 아래와 같은 소스 코드를 사용(검색했더니 나오더군요..^^)하려고 합니다. (정확한 것인지는 아직 확인하지 못함)

아래 소스에서 ptr로 받는 부분과 len이 순수한 TCP 헤더만을 가리키는 것인지 아니면 IP 헤더를 가리키는 것인지 궁금합니다.

혹시 이보다 더 좋은 소스나 참고할만한 것이 있으면 부탁드립니다...^^

unsigned short in_cksum(unsinged short *ptr, int nbytes); 

unsigned short in_cksum(unsinged short *ptr, int nbytes) 
{ 
    register long sum; 
    register u_short answer;
    u_short oddbyte; 

    sum = 0;

    // 읽어올값이 남아있으면 
    while(nbytes > 1) 
    { 
        // 포인터 하나씩 증가하면서 sum값에 더함
        sum += *ptr++;  
        
        // 그리고 nbytes에서는 2를 뺌
        nbytes -= 2; 
    }    
    
    // 남은 읽어 올 값이 홀수 이면
    if (nbytes == 1)
    {     
        // 홀수 바이트를 0으로 세팅하고 
        oddbyte = 0; 

        *((u_char *)&oddbyte) = *(u_char *)ptr; 
         
         // 그것도 더해줌 
        sum += oddbyte;
    } 
    
    // 상위 16바이트와 하위 16바이트의 합
    sum = (sum >> 16) + (sum & 0xffff); 

    // 올라온 값이 있으면 그것도 더해줌 
    sum += (sum >> 16); 
    
    // 전체 비트반전
    answer = ~sum; 
    
    // 만들어진 값을 리턴 
    
    return (answer);

} // TCP체크썸 계산 함수 끝
superkkt의 이미지