요약

  • RFC 2036은 역사적 클래스 A 부모에서 서브넷 하나를 학습하면 클래스풀 라우팅이 부모의 나머지 주소에 대해 작동 중인 기본 경로를 우회할 수 있다고 경고했습니다.
  • 남은 주소 풀을 개방하려면 레지스트리 할당, 사업자 라우팅, 고객 IGP, 경계 교환, 집계 및 구멍(hole) 처리에 이르는 조율된 전환이 강제되었습니다.
  • 이 RFC는 운영자 실제 적용 사례가 아니라 조건과 예상 실패 기제를 문서화했습니다. 이후 Historic 지위는 누락된 배포 기록을 대신 채워줄 수 없습니다.

기본 경로가 더 이상 완전한 답이 아니게 되다

제안된 변경 이전에는 클래스 없는(classless) 할당이 클래스 C 네트워크들의 슈퍼블록으로 조립되는 경우가 많았습니다. 그 선택은 매우 구체적인 의미에서 보수적이었습니다. 즉, 새로운 할당 정책 아래에서도 기존 라우팅 동작이 생존할 수 있게 해준 것입니다. 고객 도메인은 클래스풀 내부 프로토콜을 운영할 수 있고, 전체 테이블을 보유하지 않은 사업자는 기본 경로를 가져올 수 있으며, 다른 사업자는 고객을 대신해 인접한 클래스풀 블록을 집계할 수 있었습니다.

RFC 2036은 레지스트리가 그 타협을 더 이상 받아주지 않게 되면 무슨 일이 생기는지 물었습니다. 그 주제는 IANA가 당시 미할당 클래스 A 공간의 구성 요소들을 레지스트리에 넘겨 클래스 없는 접두사로 할당하게 하자는 권고였습니다. 주소 재고는 이미 존재했습니다. 호환성 문제는 접두사 경계가 첫 옥텟의 역사적 클래스와 더 이상 일치하지 않을 때 나타났습니다.

문서에서 가장 날카로운 문장은 기본 경로를 갖고 있으면서 클래스 A 네트워크의 서브넷 하나를 학습하는 사업자에 관한 것입니다. 클래스풀 해석 하에서 그 서브넷은 클래스 A 부모 전체에 대한 지식으로 취급될 수 있습니다. 다른, 광고되지 않은 구성 요소로 향하는 트래픽은 기본 경로를 따라가지 않을 수 있습니다. 대체 경로가 존재하고, 정확하며, 인터넷 대부분에 대해 선택되어 있더라도, 조각을 학습한 바로 그 부모에 대해서는 무의미해질 수 있습니다.

그래서 RFC 2036은 사업자들이 기본 경로에 의존하더라도 클래스 없는 라우팅을 배포해야 한다고 말했습니다. 전체 테이블을 보유한 사업자는 이미 그 요구를 감당하고 있었습니다. 이 제안은 이전에는 피어들이 프록시 집계를 대신 수행해 주던 소규모 사업자들의 예외를 제거했습니다. 주소 풀 활성화는 라우팅 의미론에 대한 시험이 되었습니다.

고객 측 기본 경로도 방향을 바꿔야 했다

압박은 사업자에서 멈추지 않았습니다. 클래스풀 내부 라우팅을 사용하는 비트랜짓 네트워크도 클래스 A 구성 요소를 받을 수 있었지만, 안전한 서브넷 기본 경로의 방향은 기존 배치와 반대였습니다.

클래스 경계에 맞춰진 할당에서는 사업자 쪽을 가리키는 반대 방향의 서브넷 기본 경로가 경계 루프를 막을 수 있었습니다. 그러나 클래스 A 부모에서 잘라낸 클래스 없는 구성 요소의 경우 RFC 2036은 고객의 클래스 A 서브넷 기본 경로가 일반 기본 경로를 따라 사업자 쪽으로 향해야 한다고 말했습니다. 그렇지 않으면 도메인이 자신이 배포한 구성 요소 밖의 목적지를 잘못 처리할 수 있습니다.

그 예외에는 자체적인 실패 지점이 있었습니다. 명시적 서브넷 도달 가능성이 사업자로 새어 나가 사업자가 올바른 집계를 오리지네이트해야 하는 상황이 생길 수 있습니다. 사업자가 레지스트리 할당 전체를 프록시 집계하면서 미배포 구성 요소로 향하는 트래픽을 고객에게 되돌리면, 패킷이 고객-사업자 인터페이스에서 링을 돌 수 있습니다. 사업자가 배포된 구성 요소만 광고하면, 구멍으로 향하는 트래픽은 기본 경로로 이동하다가 기본 경로가 없는 라우터에 도달해 다른 곳에서 폐기될 수 있습니다.

따라서 이 RFC는 흔히 별개로 기록되는 두 가지 제어를 하나로 묶었습니다. 즉, 레지스트리 할당 경계에서 집계하고, 미배포된 모든 구성 요소에 싱크(sink) 서브넷 경로를 설치하는 것입니다. 커버링 경로는 도달 가능성 정책을 표현했습니다. 싱크는 그 정책이 블록의 빈 부분을 통과하는 끝없는 경로를 약속하지 않도록 막았습니다. 어느 쪽도 다른 쪽이 실행 중임을 증명하지 않습니다.

멀티호밍이 호환성을 전이적으로 만들다

단일 호밍 고객은 신중한 기본 경로와 클래스 없는 사업자 하나로 경계를 세울 수 있었습니다. 멀티호밍은 그 격리를 없앴습니다. 서로 다른 사업자가 같은 역사적 부모의 서로 다른 구성 요소를 광고할 수 있으므로, 고객의 내부 프로토콜은 접두사 길이를 하나의 클래스 A 네트워크로 축소하는 대신 그대로 유지해야 했습니다.

피어 연결은 그 의무를 다시 확장했습니다. RFC 2036은 클래스풀 도메인이 클래스 없는 이웃으로부터 구성 요소 하나를 학습해 그것을 전체 부모로 승격시키는 사례를 기술했습니다. 그 광고는 다른 도메인의 사업자 기본 경로를 덮어쓸 수 있습니다. 그러면 부모의 모든 주소로 향하는 트래픽이 클래스풀 피어로 우회하고, 작은 구성 요소의 스텁으로 전달되며, 스텁이 로컬 목적지를 찾지 못하면 폐기됩니다.

할당 이후에 어떤 레지스트리도 이 경로를 수리할 수 없습니다. 실패는 할당 기록의 의미, 각 IGP가 기억하는 것, 각 경계가 내보내는 것, 포워딩이 구멍을 어떻게 다루는지 사이에 분산되어 있습니다. 단독으로는 클래스 없는 도메인도 피어가 그렇지 않다면 여전히 안전하지 않을 수 있습니다. 호환성은 그래프를 따라 전이적이 됩니다.

주소 풀은 배포의 레버였다

RFC 2036은 단계적 할당 기준을 제안했습니다. 초기 수령자는 이미 클래스 없는 내부 환경을 운영 중이거나, 제한된 클래스풀 예외 하에서 클래스 없는 사업자에 대해 격리되어 있거나 단일 호밍이어야 했습니다. 벤더는 서브넷 기본 경로가 일반 기본 경로를 따르는지 아니면 싱크에서 끝나는지를 포함하여 명시적인 클래스 없음/클래스풀 모드를 노출해야 했습니다. 호스트 구성은 언젠가 클래스·서브넷·호스트 분해만이 아니라 명시적인 로컬 접두사를 필요로 하게 됩니다. 사업자들은 클래스 없는 내부, 클래스 없는 피어링, 클래스 없는 고객 경계를 지원해야 했습니다.

한 달 뒤에 발표된 RFC 2050은 행정 측면을 더 직접적으로 만들었습니다. 즉, 할당은 가변 길이 서브넷 마스크와 클래스 없는 기술을 전제로 하며, 클래스풀 사용에 기반한 요청은 고려되지 않는다는 것입니다. 할당 규칙과 라우팅 요구는 이렇게 수렴했습니다. 레지스트리는 이제 단순히 준비 상태를 관찰하는 데 그치지 않았습니다. 입자 크기에 대한 그 선택이 누가 안전하게 재고를 받을 수 있는지를 바꿨습니다.

주소 수명 기대(Address Lifetime Expectations) 워킹 그룹이 압박의 맥락을 제공했습니다. 그 헌장은 IPv4 수명 추정, 할당 및 사용률 정책, 경로 수 모니터링, 가능한 회수 및 리넘버링, 그리고 CIDR 배포와의 조율을 요구했습니다. RFC 2036은 클래스 C 공간에서 계속 그려지면 그 부분이 소진되는 반면 상위 클래스 A 범위의 상당 부분이 남아 있을 수 있다는 ALE의 우려를 보고했습니다. 그러나 ALE의 데이터를 재현하거나 예측을 결과로 바꾸지는 않았습니다.

이후의 역사가 증명하는 것과 증명하지 않는 것

RFC 2036은 발표 당시 Informational이었고 오늘날에는 Historic입니다. RFC Editor는 이 문서에 대해 정정 사항(errata)을 보고하지 않습니다. RFC 4632는 2006년에 그 상태를 변경하면서, CIDR이 완전히 배포되었고 이전에 클래스 A였던 공간에서의 클래스 없는 할당이 6년 넘게 경험을 축적했다고 밝혔습니다. RFC 4632는 또한 집계 오리지네이터가 집계와 일치하지만 더 구체적인 경로가 없는 패킷을 폐기해야 한다는 이후의 일반 규칙을 기술하는데, 이는 구멍 문제의 건축적 후속물입니다.

이 회고는 의미가 있지만, 그 증거는 경계가 있습니다. 전환이 살아 있는 경고에서 역사적 관행으로 이동했다는 표준 커뮤니티의 후대 판단을 뒷받침할 뿐입니다. 사업자들을 열거하지 않고, 실패율을 드러내지 않으며, 어떤 제품이 먼저 바뀌었는지 보여주지 않고, 모든 고객이 깨끗하게 전환했다는 것을 증명하지도 않으며, RFC 2036이 그 결과를 낳았다는 것을 확립하지도 않습니다.

오늘날의 IANA 레지스트리는 더 이상 1996년에 기술된 미할당 상위 절반 풀을 보여주지 않으며, 이후의 IANA 기록은 마지막 /8들의 선정과 소진 이후 메커니즘을 설명합니다. 그 사실들은 재고의 장을 닫습니다. 그러나 배포 예측을 인구조사로 바꾸지는 못합니다.

여섯 개의 분리된 증명서

기록들을 서로 분리해 두면 역사가 더 명확해집니다. 레지스트리 증명서는 할당된 접두사와 그 경계를 보여줍니다. 사업자 증명서는 수신한 경로, 기본 경로, 정책과 클래스 없는 해석을 보여줍니다. 고객 증명서는 내부 경로, 서브넷 기본 경로의 방향과 외부 교환을 보여줍니다. 집계 증명서는 어느 구성 요소가 커버링 경로를 활성화했는지, 어느 구멍이 로컬에서 종료되는지를 보여줍니다. 피어 증명서는 연결된 모든 도메인이 접두사 길이를 보존한다는 것을 보여줍니다. 포워딩 증명서는 배포된 목적지와 미배포 테스트 목적지에 대해 실제 넥스트 홉 또는 폐기가 어디에서 일어나는지 보여줍니다.

Lu Heng의 running-code 논지는 이 구분을 더 선명하게 합니다. 즉, 올바른 할당과 올바른 명세는 실행에 대한 입력이지, 실행의 대체물이 아니라는 것입니다. 그의 실재 계층(reality-layer) 프레임워크는 각 주장이 실제로 어디에서 강제되거나 관찰될 수 있는지를 묻습니다. 여기에 적용하면 교훈은 조율 기록이 비현실적이라는 것이 아닙니다. 레지스트리가 적어 넣은 접두사는 도달 가능성이 되기 전에 모든 소프트웨어와 정책 경계를 통과해 살아남아야 한다는 것입니다.

RFC 2036은 재고 자체가 레버가 되는 순간의 전환을 기록했습니다. 쓰이지 않은 주소를 개방하는 일은 숨어 있던 클래스풀 가정을 드러냈습니다. 호환성 시험은 체인 전체의 입자 크기에서만 통과되었고, 결코 레지스트리 하나만으로 통과되지 않았습니다.

출처