요약

  • RFC 791은 IPv4 Identification 필드를 수신자가 하나의 원본 데이터그램에 속한 조각들을 연관시키는 데 도움이 되도록 정의했습니다.
  • RFC 6864는 원자적(atomic) 데이터그램에서 그 의미를 철회하여 어떤 ID 값이든 허용하고, 단편화가 불가능할 때 장치들이 이 필드를 무시하도록 요구합니다.

동일한 identification 값을 가진 두 패킷

어떤 호스트가 Don't Fragment 플래그가 설정된 경로로 두 개의 평범한 IPv4 데이터그램을 보낸다고 가정해 봅시다. 두 데이터그램 모두 More Fragments 플래그가 설정되어 있지 않고, 각각의 fragment offset은 0입니다. 그리고 두 데이터그램의 16비트 Identification 필드에는 동일한 값이 들어 있습니다.

현재 규격에 따르면, 이러한 값의 반복은 호스트가 패킷을 복제했거나 카운터를 소진했거나 고유성 규칙을 위반했다는 증거가 아닙니다. 이 데이터그램들은 원자적입니다. 즉, 조각이 아니며 이후의 단편화도 금지되어 있습니다. 어떤 재조립 프로세스도 이 조각들이 서로 속하는지를 판단할 필요가 영원히 생기지 않으므로, 그 Identification 값에는 프로토콜적 의미가 없습니다.

이 결과가 놀랍게 들리는 것은 필드의 이름을 그 필드의 권위로 취급할 때뿐입니다. IPv4의 와이어 포맷은 여전히 해당 비트를 할당하고 있습니다. 그러나 비트가 존재한다고 해서 모든 패킷이 내구적인 식별자를 받는다는 보장은 되지 않습니다. RFC 6864는 우선적인 질문을 던짐으로써 의미의 경계를 명시했습니다. 이 데이터그램이 단편화와 재조립에 참여할 수 있는가?

RFC 791이 이 필드에 기대했던 역할

RFC 791은 Identification을 데이터그램의 조각들 조립을 돕는 송신자가 부여한 값으로 설명했습니다. 큰 IPv4 데이터그램이 분할될 때, 각 조각은 목적지가 원본을 재구성할 수 있도록 정보를 유지합니다. 즉, 송수신 주소, 프로토콜 번호, Identification 값, More Fragments 플래그, 그리고 fragment offset입니다.

ID가 중요한 이유는 조각들이 따로 도착하고 순서가 뒤바뀔 수 있기 때문입니다. 동일한 송신 주소, 수신 주소, 프로토콜 튜플 내에서 수신자는 동일한 재조립 구간에서 여전히 살아 있는 다른 원본 데이터그램의 조각과 한 원본 데이터그램의 조각을 구분해야 합니다. 따라서 이 필드는 추상적인 식별자가 아니라, 경계가 정해진 재구성 문제 안에서의 상관 키(correlation key)입니다.

이 원래 목적은 더 넓은 운영 관행을 낳았습니다. 이 필드가 모든 IPv4 헤더에 등장했기 때문에, 구현체와 도구들이 때때로 이를 일반적인 패킷 식별자, 중복 억제 신호, 카운터, 혹은 경로상의 서로 다른 지점에서 이루어진 관측을 연관시키는 수단으로 취급한 것입니다. RFC 6864는 이러한 관행을 단편화가 실제로 요구하는 것과 분리했습니다.

16비트 약속과 패킷 속도의 충돌

16비트 필드는 65,536개의 가능한 값을 가집니다. 동일한 끝점과 프로토콜 사이의 모든 IPv4 데이터그램이 전체 최대 데이터그램 수명 동안 중복되지 않는 ID를 가지도록 요구하는 것은 전송 속도가 올라가면 어려워집니다. RFC 6864는 이 고유성 요구를 단편화가 불가능한 데이터그램까지 무차별적으로 적용하면, 안전한 총 전송률이 터무니없이 낮아질 수 있다고 설명합니다.

이 압박은 구조적인 것입니다. 송신자가 더 빠르게 증가시킨다고 값을 더 많이 만들 수는 없습니다. 빠른 재사용이야말로 문제입니다. 튜플을 확장하거나 오래된 조각이 사라졌을 때를 추측한다고 해서 유한한 필드가 보편적인 식별 공간으로 변하지는 않습니다. 그런 한편, 원자적 데이터그램은 수신자가 혼동할 조각을 아무것도 만들지 않습니다.

표준의 대응은 Identification을 폐지하거나 단편화를 무관하다고 선언하는 것이 아니었습니다. 재조립이 이 필드를 절대 참조할 수 없는 트래픽에는 희소한 고유성을 소비하지 않도록 한 것입니다. 수정된 규칙은 의무를 의존성에 맞춥니다.

원자적과 비원자적은 와이어에서 보이는 상태

RFC 6864는 이미 존재하는 필드들을 사용해 IPv4 데이터그램을 두 개의 완전한 부류로 나눕니다. DF가 1이고, MF가 0이고, Fragment Offset이 0이면 데이터그램은 원자적입니다. 즉, 아직 단편화되지 않았으며 라우터가 이후에 단편화하는 것도 금지됩니다.

단편화가 여전히 가능하거나 단편화 상태가 이미 존재하는 경우, 즉 DF가 0이거나 MF가 1이거나 Fragment Offset이 0보다 크면 데이터그램은 비원자적입니다. 이 부류에서는 조각들이 재조립 중에 연관될 필요가 있을 수 있으므로 Identification 필드는 여전히 의미를 지닙니다.

이 구분은 새로운 ID 값을 예약하지 않고도, 새로운 헤더 비트를 요구하지 않습니다. 0은 ID가 무의미하다는 특별한 선언이 아닙니다. DF, MF, Fragment Offset의 조합이 분류를 제공하며, 이를 통해 오래된 와이어 포맷과 새로운 의미가 공존할 수 있습니다.

의미는 한 부류에서 제거되었지, 전반적으로 약화되지 않았다

원자적 데이터그램에서는 송신 원본이 IPv4 ID를 어떤 값으로 설정할 수 있습니다. IPv4 헤더를 검사하는 모든 장치는 이 부류에서 해당 필드를 무시해야 합니다. 고정된 0, 반복되는 값, 혹은 구현체 고유의 패턴은 재조립 식별자로 해석될 수 없습니다. 재조립은 그 데이터그램의 가능한 미래 밖에 있기 때문입니다.

비원자적 데이터그램에서는 반대 경계가 적용됩니다. 송신자는 여전히 관련 튜플과 수명 안에서 조각들을 구분할 수 있는 ID를 사용해야 합니다. 따라서 RFC 6864는 조각 간의 모호성이 발생할 수 있는 바로 그곳에서 이 필드의 원래 기능을 유지합니다.

이는 ID가 선택 사항이 되었다고 말하는 것보다 더 정확합니다. IPv4 헤더에서 이 비트들은 선택 사항이 아니며, 단편화도 사라지지 않았습니다. 달라진 것은 동일한 비트가 모든 패킷 상태에서 동일한 의미를 지닌다는 주장입니다.

다른 용도들이 표준적 권위를 잃은 이유

RFC 6864는 IPv4 ID가 단편화와 재조립 이외의 목적으로 사용되어서는 안 된다고 명시합니다. 이 규칙은 원자적 ID가 패킷 고유성의 상호운용 가능한 증거로 작동할 수 있다는 생각을 거부합니다.

중복 검출이 한 예입니다. 동일한 ID를 가진 두 원자적 데이터그램이 반드시 중복은 아닙니다. 또한 서로 다른 ID를 가진 두 패킷이 애플리케이션에 유용한 의미에서 반드시 다른 페이로드인 것도 아닙니다. 진단적 상관도 그렇습니다. 경로 도구가 특정 구현체가 만들어내는 패턴을 관측할 수는 있지만, 프로토콜은 더 이상 그러한 패턴을 보장하지 않고 안정적인 의미도 부여하지 않습니다.

이 제한이 모든 측정을 불가능하게 만드는 것은 아닙니다. 증거 기준을 바꾸는 것입니다. 중복 억제나 관측 상관이 필요한 시스템은, 규격에 부합하는 송신자가 자유롭게 반복할 수 있는 값에 보편적 의미를 부여하기보다는 해시와 다른 패킷 필드 같은 더 강한 맥락을 사용해야 합니다.

하나의 필드는 의미 중 하나보다 오래 남을 수 있다

IPv4 Identification의 역사는 흔한 형태의 프로토콜 유지보수를 보여줍니다. 배포된 헤더를 함부로 재설계할 수는 없지만, 경험이 기존 해석이 불필요하거나 지속 불가능함을 보여주면 필드에 붙은 의무는 좁혀질 수 있습니다.

RFC 791은 조각 연관 메커니즘을 제공했습니다. RFC 6864는 그 메커니즘을 유지하면서 실제로 그에 의존할 수 있는 패킷들을 분류하고, 단편화와 무관한 해석들을 철회했습니다. 필드는 제자리에 남았지만, 그 권위는 조건부가 되었습니다.

오래 남는 교훈은 식별이 무의미해졌다는 것이 아닙니다. 프로토콜 식별자는 자신이 해결하도록 설계된 문제의 범위 안에서만 고유해야 한다는 것입니다. IPv4에서 관련된 문제는 재조립입니다. 데이터그램이 원자적일 때, Identification이라는 이름의 필드는 식별 힘 없이 존재하는 문법일 뿐입니다.

출처