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.1. Ip Header Checksum Formula
(1.) IP Header를 2 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 |
’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 |
.
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; // 결과 값에 보수를 취해준 뒤 리턴
}
Rev |
Issue Date |
Section |
History |
1.00 |
2016-03-17 |
All |
- First release version |