* 오늘은 IP 헤더
ethernet 헤더에서 타입이 IP일 경우 (0x0800) 해석하는 방법이다.
Version : 데이터그램이 속한 프로토콜 버전을 나타낸다. 현재 IPv4가 사용 중이며
IPv6로의 변화가 진행 중이지만
미래는 아직 불확실하다. IPv5는 실시간 스트림 프로토콜로 개발되었지만 현재는 사용 중이지 않다.
IHL : 헤더길이가 일정하지 않기 때문에 헤더의 길이를 나타낸다. 단위는
32비트 워드 단위로 최소값은 5, 최대값은 15이다.
최소값이 5인 것은 고정크기 20바이트를 가지고 있기 때문이다. 최대값이 15이므로
헤더는 60바이트로 제한된다.
따라서, 옵션은 40바이트까지 지정할 수 있다.
Type of Service
: 호스트가 서브넷에서 어떤 종류의 서비스를 원하는지를 나타낸다. 왼쪽부터 3비트는 우선권(Precedence) 필드,
다음
3비트는 플래그(D, T, R)비트는 나타낸다. 우선권 필드는 0 ~ 7까지 우선권을 지정하고 플래그 비트는 라우터가 라우팅 할 때
중요시
해야할 선택요소를 나타내는 것으로 D(Delay), T(Throughput), R(Reliability) Flag가 쓰인다. 하지만 현재
라우터는 이 필드를
무시하므로 거의 쓸모가 없다.
Total length :
데이터그램 내의 헤더와 데이터의 길이를 합한 값이 들어간다. 최대 길이는 65,535 바이트이다. 현재는 이 상한값이
적절하지만 미래의 기가비트
네트워크에서는 큰 데이터그램을 필요로 할 것이다.
Indentification :
일반적으로 데이터그램은 쪼개져(Fragmentation) 전송이 되는데 이 조각(Fragment)들이 어떤 데이터그램에
속하는지를 알려준다.
하나의 데이터그램은 모든 조각들이 동일한 Indentification 값을 가지고 있다.
DF(Don't Fragment) : 목적지 컴퓨터가 조각들을 다시 재조합할 능력이 없기 때문에 라우터에게
쪼개지(Fragment) 하지 말라고
알려주는 것이다. 하지만 현재는 대부분의 장비가 재조합이 가능하기 때문에 거의 필요없는 기능이다.
MF(More Fragment) : 조각난 데이터그램의 조각들은 마지막 조각을
제외하고는 이 비트를 설정한다. MF가 1이면 뒤에 조각이 더
있다는 것을 의미하고 MF가 0 이면 자신이 마지막 조각이라는 것을 의미한다.
모든 조각이 도착하면 수신측에서는 재조합하여 상위 계층으로 보낸다.
Fragment
offset : 데이터그램에서 도착한 조각이 어느 위치에 존재하는지를 나타낸다. 마지막을 제외한 모든 조각은 8 바이트의 배수여야
한다.
13 비트가 제공되므로 데이터그램당 최대 8192개의 조각이 있을 수 있고 최대 데이터그램 길이는 65,536 바이트가 된다.
Time to live : 이 필드는 패킷 수명을 제한하기 위해 사용하는
카운터이다. 시간은 초단위로 계수되며 최대 수명은 255초이다.
각 홉마다 감소되어야 하고 라우터에서 장시간 대기 했을 때에는 해당 시간만큼
감소된다. 하지만 시간은 구현하기 곤란한
이유로 현재는 홉수로 표현한다. 라우터를 지날 때 마다 홉수는 하나씩 감소하며 이 값이 0이 되면 해당
라우터에서 폐기하고,
경고 패킷의 경우는 원래 호스트로 돌려보낸다. 이것의 목적은 라우팅 테이블의 오류로 인해 패킷이 네트워크 상에서
영원히
떠돌아 다니는 것을 방지하게 된다.
Protocol : 네트워크 계층에서
데이터그램을 재조합할 때, 어떤 상위 프로토콜로 조합해야 하는지 알 필요가 있으므로
UDP 또는 TCP를 알려주기 위해 사용한다.
Header Checksum : 헤더의 값을 검증하기 위해 사용한다. 헤더의
오류를 검증하기 위해 사용하는데 헤더의 값 중에 Time to live의
값은 계속 변하게 되므로 매 홉마다 다시 계산하게 된다. 단, 트릭을
사용할 수도 있다.
Source address : 32비트(4바이트)로
데이터그램을 보낸 송신지 주소를 나타낸다.
Destination address :
32비트(4바이트)로 데이터그램을 받을 목적지 주소를 나타낸다.
/usr/include/netinet/ip.h 에 구조체로 선언되어 있습니다. 우리는 가따 쓰면 되염 ^_^
주의할 점은
1. 빅엔디안에 주의 할 것
2. 2byte이상의 자료형은 ntoh() 함수 계열을 이용하여 그 값을 정확하게 보정해줄것
그리고 마지막에 있는 struct in_addr은 u_int32_t 한개짜리 구조체로
그냥 4바이트 정수형인것 확인했습니다. ~_~
/usr/include/netinet/in.h 에 선언되어 있습니다.
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
햄버거 공짜 달리십시다! (0) | 2012.11.01 |
---|---|
11월 프로젝트 제안서 - 감정현 (1) | 2012.10.31 |
[Micro C/OS]2012/10/29 작업일지(리얼타임 시스템의 개념) - by.이창현 (1) | 2012.10.30 |
[Micro C/OS] 10.29 업무일지 -정철 (0) | 2012.10.29 |
[패킷 아날라이저] 10.26 업무일지 -정철 (4) | 2012.10.26 |
[linux kernel]문자 디바이스 정리 자료입니다. (1) | 2012.10.25 |
[2012내장형]포인터 변수의 오류들 첫번째... (1) | 2012.10.24 |
[WINAPI] 10월 23일 수업소스+결과(BIPMAP 영상처리(?)) - by.LDH (0) | 2012.10.23 |