네트워크 및 보안/TCPIP 프로토콜

IPv4

언제나휴일 2015. 2. 2. 17:34
반응형

IPv4



프로토콜 스택

0~7

8~15

16~23

24~31

VER(4)

HLEN(4)

Service Type(8)

Total length(16)

Identification(16)

Flags(3)+Fragmentaion offset(13)

Time To Live(8)

Protocol(8)

Header Checksum(16)

Source IP Address(32)

Destination IP Address(32)

Options and Padding(0~40 바이트)

 

VER: 버전 , IPv4의 버전은 항상 4이다.

HLEN: 헤더 길이, 4바이트 단위로 계산하며 최소 5(20바이트)에서 최대 15(60바이트)이다.

Service Type: 초기에 TOS(Type Of Service)라 불렀다.

   IEFT에서는 우선순위와 서비스 유형을 사용하는 것으로 수정하였다.

   현재는 Differentiated Serivces(차별화 서비스 ) 영역으로 부르기도 한다.  

Code Point(6bits)

Unused(2bits)

 

   Code PointXXX000이면 우선 순위를 의미한다. 0(000000)~7(111000)

   Code PointXXXXX0이면 IETF에서 서비스 의미를 부여

   Code PointXXXX01이면 임시 실험용

   Code PointXXXX11 이면 지역 기관에서 서비스 의미를 부여

Total length: 전체 길이를 바이트 단위로 나타낸다. 최소 20, 최대 65535

   Data Length = Total length - (HLEN*4)

Identification: IP 패킷을 구분하기 위해 부여하는 번호로 단편화 패킷을 조립할 때 이용

Flags: 처음 비트는 사용하지 않음, 두번째 비트는 DF, 세번째 비트는 MF

   DF1이면 단편화할 수 없음, 0이면 단편화 가능

     만약 DF1인 패킷이 MTU(Maximum Transmit Unit)보다 크면 이를 폐기

     ICMP 오류 메시지(Type 3, Code 4)를 발신지 호스트에 보낸다.

     ICMP 오류 메시지(Type 3, Code 4)를 받으면 패킷을 단편화하여 보낸다.

   DF0, MF1이면 마지막 단편이 아님

   MF0이면 단편화 패킷이 아니거나 마지막 단편임

   참고로 하나의 패킷을 단편화하면 이들의 Identification는 같다.

Fragmentaion offset: 단편화 패킷이 원래 패킷의 어느 위치의 단편인지를 나타낸다.

   단위는 8바이트이다.

   예를 들어 4000크기의 패킷을 1000씩 네개로 나누어 보내면

   단편화 offset0, 125, 250, 375인 단편을 만들어 보낸다.

   단편 패킷이 도착하면 목적지 호스트는 타이머를 가동한다.

   타이머가 만료하였는데 도착하지 않으면 목적지 호스트는 ICMP 오류(type11, code1)을 보낸다.

Time To Live: 경유할 수 있는 최대 라우터 수를 의미한다.

   라우터를 거칠 때마다 1씩 감소한다.

   TTL1인 패킷을 받은 라우터는 이를 폐기하고 ICMP 오류(type 11, code 0)를 보낸다.

Protocol: ICMP(1), IGMP(2), TCP(6), UDP(17), OSPF(89)

Header Checksum: 패킷이 유효함을 계산하기 위한 필드, 헤더 부분만 계산한다.

// reference Unix Network Programming written by Stevens

u_short cal_checksum(u_short *base,int len){

  int nleft = len;

  int sum = 0;

  u_short *w = base;

  u_short answer = 0; 

 

  while(nleft>1){

    sum += *w;

    w++;

    nleft -= 2;

  }//while

 

  if(nleft == 1){

    *(u_short *)(&answer) = *(u_char *)w;

    sum += answer;

  }//if

 

  sum = (sum>>16) + (sum & 0xFFFF);

  sum += (sum >>16);

  answer = ~sum;

  return (answer);

}

 

Source IP Address: 발신지 주소

Destination IP Address: 목적지 주소

Options: 네트워크를 시험하거나 디버그하기 위해 사용

Type(8bits)

Length(8bits)

Value(Length bits)

  Type: Copy(1), Class(2), Number(5)로 구분

    Copy: 0 - 단편화 패킷일 때 첫 번째 단편에만 옵션 포함

          1 - 단편화 패킷일 때 모든 단편에 옵션 포함

    Class: 00 - 제어에 사용, 10 - 디버그 및 관리 목적, 01, 11 - 정의하지 않음

    Number: 여섯 종류의 옵션 유형을 정의

        00000 : End of option, 이것에는 Length, Value가 없다. 이후에는 padding 부분이다.

        00001: No option, 옵션과 옵션 사이에 올 수 있다.

        00011: Loose source route, 느슨한 발신지 경로 옵션

           발신지에서 경로를 미리 지정하며 지정하지 않은 라우터도 경유할 수 있다.

           예를 들어 세 개의 라우터를 지정하여 보내면 다음과 같이 변한다.

           발신지 초기 : 10000011 00001111 0000100 XXXXXXXX XXXXXXXX XXXXXXXX

           1번째 라우터: 10000011 00001111 0001000 XXXXXXXX XXXXXXXX XXXXXXXX

           2번째 라우터: 10000011 00001111 0001100 XXXXXXXX XXXXXXXX XXXXXXXX

           3번째 라우터: 10000011 00001111 0010000 XXXXXXXX XXXXXXXX XXXXXXXX

 

        00100: Timestamp, 라우터가 처리 시간을 기록하기 위해 사용

           Type(01000100), Length, Pointer, Overflow, Flags와 데이터로 구성

           Overflow에는 더 이상 기록하지 못한 라우터의 수를 의미한다.

           Flags 0일 때 데이터에 시간만 기록

           Flags 1일 때 출력 인터페이스 IP 주소와 타임 스탬프 기록

           Flags 3일 때 주어진 IP 주소와 입력 인터페이스 IP를 비교

               같으면 출력 인터페이스 IP를 덮어쓰고 타임스탬프를 기록

        00111: Record route, 거쳐간 라우터를 기록한다.

           type: 00000111

           Length:15

           Pointer: 이번에 기록할 바이트 옵셋(처음은 4)

           라우터를 거칠 때마다 라우터 주소를 기록하고 Point값이 4증가한다.

           만약 패킷이 다음과 같다면 세 개의 라우터를 경유한 것이다.

           00000111 00001111 00010000 XXXXXXXX XXXXXXXX XXXXXXXX

        01001: Strict source route, 엄격한 발신지 경로 옵션이다.

           발신지에서 경로를 미리 지정하며 지정하지 않은 라우터를 경유할 수 없다.

           리스트에 없는 라우터를 방문하면 데이터 그램은 폐기한다.

           그리고 ICMP 오류 메시지(type3, code 5)를 보낸다.

           예를 들어 세 개의 라우터를 지정하여 보내면 다음과 같이 변한다.

           발신지 초기 : 10001001 00001111 0000100 XXXXXXXX XXXXXXXX XXXXXXXX

           1번째 라우터: 10001001 00001111 0001000 XXXXXXXX XXXXXXXX XXXXXXXX

           2번째 라우터: 10001001 00001111 0001100 XXXXXXXX XXXXXXXX XXXXXXXX

           3번째 라우터: 10001001 00001111 0010000 XXXXXXXX XXXXXXXX XXXXXXXX

Padding: 헤더의 길이가 4(옥텟 단위)의 배수가 아니면 4의 배수가 되도록 맞춘다.


다른 네트워크 프로토콜

[프로그래밍 기술/TCPIP 프로토콜] - ethernet

[프로그래밍 기술/TCPIP 프로토콜] - ARP(Address Resolution Protocol)

[프로그래밍 기술/TCPIP 프로토콜] - ICMPv4

[프로그래밍 기술/TCPIP 프로토콜] - TCP(Transmission Control Protocol,RFC 675, RFC 793)

[프로그래밍 기술/TCPIP 프로토콜] - UDP(User Datagram Protocol, RFC 768)

[프로그래밍 기술/TCPIP 프로토콜] - DNS(Domain Name System, RFC 1034)

[프로그래밍 기술/TCPIP 프로토콜] - DHCP(Dynamic Host Configuration Protocol) 

반응형

'네트워크 및 보안 > TCPIP 프로토콜' 카테고리의 다른 글

DNS(Domain Name System, RFC 1034)  (0) 2015.02.03
DHCP(Dynamic Host Configuration Protocol)  (0) 2015.02.02
TCP(Transmission Control Protocol,RFC 675, RFC 793)  (0) 2015.02.02
UDP(User Datagram Protocol, RFC 768)  (0) 2015.02.02
ICMPv4  (0) 2015.02.02
ARP(Address Resolution Protocol)  (0) 2015.02.02
ethernet  (0) 2015.02.02