[태그:] <span>Fragmentaion offset</span>

프로토콜 스택

IPv4 프로토콜 스택
  • VER

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

  • HLEN

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

  • Service Type

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

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

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

Code Point(6bits)Unused(2bits)

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

Code Point가 XXXXX0이면 IETF에서 서비스 의미를 부여

Code Point가 XXXX01이면 임시 실험용

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

  • Total length

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

Data Length = Total length – (HLEN*4)

  • Identification

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

  • Flags

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

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

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

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

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

DF가 0, MF가 1이면 마지막 단편이 아님

MF가 0이면 단편화 패킷이 아니거나 마지막 단편임

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

  • Fragmentaion offset

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

단위는 8바이트이다.

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

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

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

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

  • Time To Live

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

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

TTL이 1인 패킷을 받은 라우터는 이를 폐기하고 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의 배수가 되도록 맞춘다.

TCP/IP 프로토콜