많이 부족한 자료입니다. ^^ 참고정도만 하세요.
파일 첨부합니다.
IP Header cheacksum 구하기
prabbit00
<사전 준비사항>
-winpcap 라이브러리 Down
-디렉터리 설정
-포함라이브러리 설정
<사전 지식>
-패킷구조
동기신호 |
목적지 MAC주소 |
발신지 MAC주소 |
패킷유형 |
IP헤더 |
TCP헤더 |
DATA |
CRC 체크섬 |
-IP Header cheacksum 공식
IP Header cheacksum은 IP 헤더의 오류를 검증하기 위해서 사용되는 필드이다.계산방식은 다음과 같다. 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
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 값이 동일하면 패킷의 오류가 없는 것이고
동일하지 않다면 패킷에 오류가 있는 것이다.
'IT > Programming' 카테고리의 다른 글
몇 가지 프로그래밍 언어의 다른 표현 (0) | 2016.06.07 |
---|---|
[C언어] 비트연산 문제 (0) | 2015.09.23 |
[C언어] 03.데이터 표현방식 (0) | 2015.09.23 |
[C언어] scanf 함수 활용 문제 (0) | 2015.09.21 |
[C언어] 02.변수와 연산자 그리고 키워드 (0) | 2015.09.21 |