본문 바로가기

IT/Programming

IP Header Checksum 구하기

많이 부족한 자료입니다. ^^ 참고정도만 하세요.

파일 첨부합니다.

IP Header cheacksum 구하기.hwp

 

 

IP Header cheacksum 구하기

 

prabbit00

 

<사전 준비사항>

-winpcap 라이브러리 Down

-디렉터리 설정

-포함라이브러리 설정

 

<사전 지식>

 

-패킷구조

동기신호

목적지

MAC주소

발신지

MAC주소

패킷유형

IP헤더

TCP헤더

DATA

CRC

체크섬

 

-IP Header cheacksum 공식

IP Header cheacksumIP 헤더의 오류를 검증하기 위해서 사용되는 필드이다.계산방식은 다음과 같다. 1. Version 필드 값부터 목적지IP 필드 값까지 모두 더한다.(, 체크섬 필드 값은 제외하고 합산)2. 합산 값의 첫 번째 값을 뒤의 4자리 값과 합산한다.3. 더한 값을 2진수로 표기한 후 해당 값을 보수화4. 보수화 값을 16진수로 표현 = 체크섬 값

 

 

 

 

 

 

 

 

-IP Header 구조

 

위를 보면

version : 4비트

Header length :4비트

Differentiated services field :1바이트

Total length 2바이트

Identification :2바이트

flag + offset : 2바이트

Time to live : 1바이트

Protocol : 1바이트

Header checksum :2바이트

Source IP :4바이트

Destination IP : 4바이트

 

20Byte

계산을 편리하게 하기 위해 u_short(2바이트) 변수 10개를 선언

version+IHL+TOS = data1

Total length = data2

Identification = data3

flag + offset = data4

TTL+Protocol = data5

Header checksum = data6

Source IP = data7,data8

Destination = data9,data10

 

 

1. Version 필드 값부터 목적지IP 필드 값까지 모두 더한다.(, 체크섬 필드 값은 제외하고 합산)

의 합산 값을 int sum으로 선언

int sum= ntohs(hc->data1)+ntohs(hc->data2)+ntohs(hc->data3)+ntohs(hc->data4)+ntohs(hc->data5)+ntohs(hc->data7)+ntohs(hc->data8)+ntohs(hc->data9)+ntohs(hc->data10);

 

 

ntohs는 리틀엔디안으로 강제형변환? 시킨 것이다.

 

 

2. 합산 값의 첫 번째 값을 뒤의 4자리 값과 합산한다.

첫 번째 값을 구하기 위해서

변수 sum의 값을 오른쪽으로 16칸 비트 이동 시킨다. 그리고 이 값을 새로운 변수 int num에 저장한다.

뒤의 4자리 값을 구하기 위해 u_short num2 = sum을 하면 sum(int형 변수,4바이트)num2 (2비트)로 값이 짤리게 된다. 이로써 뒤 4자리 값이 구해지게 된다.

이제 첫 번째 값과 뒤의 4자리 값을 합산하기 위해 새로운 변수 int add를 선언하고 더한다.

int add = num+num2;

 

3. 더한 값을 2진수로 표기한 후 해당 값을 보수화

 

보수를 진행하기 위해서 새로운 변수 int tmp를 선언 보수화 진행을 한다

 

int tmp = ~add;

 

tmp 값과 Header cheacksum 값이 동일하면 패킷의 오류가 없는 것이고

동일하지 않다면 패킷에 오류가 있는 것이다.