Published on

IPv4 옵셔널 헤더 : 네트워크-6

IPv4 Options

IPv4 게시글에서 보았듯이 IPv4 헤더는 기본 20 bytes 크기 안에서 기본 필드들을 가지지만,
상황에 따라 추가적인 40바이트 이하의 옵셔널 헤더를 가질 수 있다.

용도는 주로 네트워크 테스트와 디버깅인데,
이번엔 이 부분을 다룰 것이다.

IPv4 Options header format

다시 한 번 옵션헤더의 포맷을 살펴보자.

alt text
  1. type field (8 bits)

type은 말그대로 option의 타입을 명시하는데
8 bits 필드를 다시 3개의 subfield로 나누어 표시한다.

  • copy : 1 bit 필드로 만약 0일 경우 옵션 헤더를 첫 번째 fragment에만 복사해야 함을 의미하고, 1일 경우 모든 fragment에 복사해야 함을 의미한다.

  • class : 2 bits 필드로 옵션의 목적을 좀 더 넓은 의미에서 명시한다.

00일 경우 datagram control
10일 경우 debuing and menagement를 의미한다.

  • number : 마지막 5 bits로 이루어지며 구체적인 옵션의 타입을 결정한다.

최대 32개 타입을 지원할 수 있지만, 현재는 6개 타입만이 사용 중이다.

  1. length field (8 bits)

type field와 length field 그 자신을 포함해 전체 옵션 헤더의 길이를 명시한다.
전체 헤더 길이를 이미 필수 헤더 필드를 통해 알 수 있음에도 이 필드가 있는 이유는, Option header를 여러 개 포함할 수도 있기 때문이다.

옵션 타입에 따라 사용하지 않기도 한다.

  1. value
    value field는 옵션 헤더의 데이터를 저장한다.
    length와 마찬가지로 필수가 아니다.
alt text

이제 각 옵션 헤더 타입에 대해서 살펴보도록 하자.

No-Operation Option(NO-OP)

1-byte 크기로 말 그대로 아무 동작도 명시하지 않는 타입이다.
옵션 헤더 사이에서 일종의 필터 역할을 수행하는데,

주로 여러 옵션 헤더들이 16-bit or 32-bit aligned 위치에 두기 위해 사용한다.

alt text

End-of-Option Option(END-OP)

1-byte 크기로 마지막 옵션 헤더의 뒤에 패딩된다.
오직 하나의 END-OP만 허용되며, receiver는 이 옵션을 보고 header의 끝임을 인지해 data payload로 넘어가게 된다.

alt text

Record-Route Option

IP 패킷이 목적지까지 도달하며 거쳐온 라우터를 추적한다. 즉, 경유한 라우터들의 IP 주소를 기록한다.

최대 9개의 주소를 기록할 수 있는데, 이는 IP address 크기가 4 bytes이고 최대 옵셔널 헤더 크기는 40바이트(Option type, length 제외 36바이트)이기 때문이다.

위를 보면 알지만 Option type, length를 제외하면 2바이트 크기가 남는데, 그 중 1바이트는 Pointer라는 필드에 저장한다.

Pointer는 새로운 IP주소를 저장할 위치를 지정한다.

만약 새로운 라우터에 도착해 주소를 저장하고 나면 pointer += 4로 증가한다.

alt text
alt text

Strict(Loose)-Source-Route Option

패킷이 경유할 인터넷 상의 라우터들을 지정하는 용도의 옵션이다.
Strict의 경우 반드시 해당 라우터들만 거쳐서 목적지로 도달해야하지만, Loose의 경우 해당 라우터를 모두 거쳐야 하지만, 라우팅 알고리즘에 따라 다른 경유지도 방문이 가능하다는 차이점이 있다.
주로 sender가 직접 특정 라우터를 지정해 경로를 특정하여 딜레이를 최소화하거나 throughput을 최대화할 수 있도록 도와준다.
혹은 인트라넷 등 폐쇄적인 네트워크에서 내부의 라우터만을 경유하도록 지정하여 패킷의 유출을 막고 신뢰성을 확보하는 용도로도 사용가능하다.
그러나 대부분의 사용자들이 네트워크의 물리적 topology를 알고서 이용하는 것은 아니라서 잘 사용되는 기능이 아니다.

만약 strict-source-route 패킷이 리스트에 없는 라우터에 도착할 경우 패킷은 즉시 폐기되고 에러 메세지가 전송된다.
만약 목적지에 도착했을 때, 경유하지 않은 IP 주소가 있는 경우에도 패킷은 폐기된다.

alt text

strict-source-route의 예시를 봐보자.

alt text

source-route 패킷은 리스트에 명시된 라우터에 도착할 때마다 source ip 주소와 destination ip 주소를 수정한다.

초기에는 source = 출발점 호스트, destination = 첫 번째 라우터 주소로 설정되고
첫 번째 라우터에 도착하면 현재 라우터 주소가 다시 source, 다음 라우터 주소가 destination으로 수정된다.

이 때 Pointer는 리스트에서 참고할 다음 라우터 엔트리의 주소로 설정된다.

Timestamp

timestamp는 패킷이 라우터에 의해 처리된 시간을 기록하기 위해 사용한다.
단위는 milliseconds 단위이다.

주로 인터넷 상의 라우터 동작을 추적하는 것에 사용하는데, 한 라우터에서 다른 라우터까지 이동하며 걸린 시간을 추정할 수 있다.

추정이라 표현하는 이유는 라우터들의 clock이 일치하지 않기 때문이다.

alt text

timestamp에서는 옵셔널 데이터 첫 바이트 포인터 외에도 이어지는 4bit O-Flow 필드와 4bit Flags 필드가 있다.

O-Flow(Overflow) 필드는 옵셔널 헤더의 크기가 초과되어 기록하지 못한 타임스탬프의 개수를 기록한다.

Flags field는 timestamp를 어떻게 저장할 지에 대해서 지정하는 필드이다.

alt text

Flags=0일 경우 오직 timestamp만 기록한다.
Flags=1일 경우엔 timestamp 뿐만 아니라 어떤 네트워크를 거쳤는지도 기록하기 위해 다가올 네트워크의 주소를 함께 기록하게 된다.

alt text

Flags=3의 경우 조금 특이한데, 미리 IP 주소들을 지정한 뒤, 다가올 네트워크 주소와 비교하여 일치할 경우 라우터에서 timestamp를 기록한다.

참고할만한 문서

RFC791
RFC782