본문 바로가기
카테고리 없음

[C] Checksum (feat. ip_header)

by ddddh 2016. 4. 20.

1.1. What is CheckSum ?

‘CheckSum’은 패킷의 무결성을 검증할 수 잇는 계산된 값이다무결성을 통해 수신 된 데이터가 오류가 있는지 없는지 체크한다


네트워크상에서 이동하는 동안 데이터 패킷이 손상되고, 그 데이터가 손상되지 않았음을 수신 측이 알 수 있어야 되기 때문에 


‘CheckSum’이 필요하다. 기본적으로 Source측에서 ‘CheckSum’이 계산되고 네트워크를 이동하며 홉을 거칠 때 마다 검증하게 된


. 검증 과정에서 ‘CheckSum’이 올바르지 않으면 해당 패킷을 버리게 된다. 이렇게 네트워크를 거칠 때 마다 ‘CheckSum’은 재 계


산되고 업데이트를 하게 된다.

 

 

1.2. IP Header

‘IP Header CheckSum’ IP Header를 통해 계산되기 때문에 구조를 알아야 된다. 다음은 IP Header의 구조다.


IP HEADER

Ver(4)

H.LEN(4)

TOS(8)

Total Length(16)

Identification(16)

Flag(3)

Fragment offset(13)

TTL(8)

Protocol(8)

Header Checksum(16)

Destination IP Address(32)

Source IP Address(32)

Options(if any)

DATA


CheckSum을 구하는 공식은 다음장을 참조하면 된다.

 

 

 

 

 

 

 

 

2.  Formula

 

2.1. Ip Header Checksum Formula

(1.) IP Header2 Byte 씩 자른다.


(2.) CheckSum을 뺀 모든 값을 더한다.


(3.) 더하는 중 CheckSum 2 Byte를 초과할 경우 그 값을 빼고 다시 더해준다. (ex. 1 8d98 -> 8d98 + 1 == 8d99)


(4.) 모두 더한 값에 1의 보수를 취해준다.

 

 

2.2. Example

4500 003c 1c46 4000 4006 b1e6 ac10 0a63 ac10 0a0c



‘IP Header CheckSum’에 대해 충분한 공부를 했으니 예시를 가지고 직접 구해본다. 다음은 실제로 수신한 ‘IP Packet Header’.


’45’ [‘4’IP Version, ‘5’는 헤더 길이이다. 헤더 길이는 4 Byte로 정의되어 있기 때문에 실제 길이는 5x4 = 20 Byte]


‘00’ [‘00’TOS 또는 Service Type을 나타내며, 현재 TOS 값은 정상적인 동작을 나타내고 있다.]


‘003c’ [‘IP header의 총 필드 길이를 뜻한다. IP Packet의 전체 길이는 60이다.]


‘1c46’ [식별 필드에 해당된다.]


‘4000’ [2 가지의 경우로 분할 될 수 있다.( 3bit – Flag /13bit – Offset ) ]


‘be16’ [CheckSum을 나타내며 송신측에서 설정된다.]


‘ac10’, ‘0a0c’ [SRC IP Address / DST IP Address 를 뜻한다.]



‘CheckSum’을 제외한 모든 값을 더한다, 2 Byte 크기를 유지한다. (2 Byte를 초과한 값을 다시 더해줌)


4500 + 003c // 453c

453c + 1c46 // 6182

6182 + 4000 // a182


a182 + 4006 // e188

e188 + ac10 // 1 8d98 -> 8d98 + 1    8d99

8d99 + 0a63 // 97fc

97fc + ac10 // 1 440c -> 440c + 1    440d

440d + 0a0c // 4e19


도중에 초과한 값을 처리해도 되고, 다 더한 후 초과값을 처리해도 무방하다.


4e19 | 0100 1110 0001 1001

b1e6 | 1011 0001 1110 0110     // CheckSum


계산이 끝난 값에 1의 보수를 취해주면 ‘CheckSum’이 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.  

3. Source

 

typedef struct ip_checksum{

u_short cs[10]; // 20Byte 필요함

}ip_cs;

 

int header_check(ip_cs* check){

       int sum = 0, coun = 0;

 

       for(c = 0; c < 10; c++){

             if(c==5) countinue; // ip_header checksum 자리를 무시

             else sum = sum + ntohs(check->cs[c]); // 나머지 모든 값을 더함

       }

 

       sum = (sum & 0xFFFF) + (sum >> 16); // 초과한 값을 처리하는 과정

 

       return ~sum; // 결과 값에 보수를 취해준  리턴

}

      

 



4.  History

 

Rev

Issue Date

Section

History

1.00

2016-03-17

All

- First release version