요약

  • XDR은 합의를 네이티브 메모리 레이아웃에서 벗어나 4바이트 단위에 기반한 하나의 외부 표현, 즉 최상위 바이트 우선 방식으로 옮겼습니다.
  • 가변 값은 자체 개수를 함께 실었습니다. 0으로 채우기가 정렬을 회복했지만 값에는 속하지 않았고, 동일한 값이 동일한 인코딩을 갖도록 0을 유지해야 했습니다.
  • 스키마는 필드 순서와 유니언 분기를 고정했고, 프레이밍·인증·권한 부여·응용 의미는 다른 계층에 남았습니다.

경계를 지킨 세 개의 0 옥텟

RFC 4506의 실습 파일 예제는 9바이트 파일명으로 시작합니다. XDR은 4바이트 개수, 9바이트 파일명, 그다음 세 개의 0 옥텟을 기록하고, 다음 필드는 이어지는 4바이트 경계에서 시작됩니다.

마지막 세 옥텟은 물리적으로 존재하지만 파일명의 문자가 아닙니다. 개수를 늘리지도 않고 응용 내용도 실지 않습니다. 그럼에도 인코더는 이를 편리한 여유 공간으로 쓸 수 없습니다. XDR은 0 채우기를 요구하기 때문입니다. 그 이유는 정돈된 정렬보다 강합니다. 한 기계가 빈 공간을 메모리 잔여물로 채우고 다른 기계가 다른 잔여물로 채운다면, 동일한 값이 서로 다른 바이트 표현을 갖게 됩니다. 비교와 체크섬은 결정성을 잃습니다.

이 빈 바이트들은 설계 전체를 드러냅니다. 상호운용성은 모든 컴퓨터가 메모리를 똑같이 배치한다고 가정함으로써 얻어지지 않았습니다. 어떤 차이가 외부 경계에서 사라져야 하는지를 정확히 정의함으로써 얻어졌습니다.

네이티브 레이아웃은 인코더에서 멈췄다

1987년 발표된RFC 1014는 워크스테이션, PC, VAX, Cray처럼 서로 다른 아키텍처 사이에서 교환되는 데이터를 기술하고 인코딩하기 위한 언어로 XDR을 도입했습니다. Sun RPC와 NFS는 이미 명시된 사용자였습니다. 기술 언어는 C를 닮았지만 프로그래밍 언어가 아니었고, 기계의 메모리 내 구조를 전송하지도 않았습니다.

XDR 부호 있는 정수는 최상위 바이트가 먼저 오는 2의 보수 형태 32비트를 차지합니다. 배열은 자연 순서를 따르고, 구조체 구성 요소는 선언 순서를 따릅니다. 단말은 내부적으로 편리한 어떤 네이티브 표현도 유지할 수 있지만, 인코더는 바이트를 내보내기 전에 그 사적 선택을 내려놓아야 하고, 디코더는 공유 형태로부터 로컬 객체를 다시 조립해야 합니다.

앞쪽에 엔디언 플래그는 없습니다. XDR은 하나의 순서를 선택했습니다. 이 표준 스스로 하나의 정규 순서가 일부 기계에 더 많은 변환을 강제한다는 점을 인정합니다. 얻는 이득은 더 상위의 프로토콜이 어떤 표현이 뒤따르는지 먼저 협상하지 않아도 된다는 것입니다. 매체에 저장된 XDR 객체는 협상 맥락이 사라진 뒤에도 자신의 해석을 유지할 수 있습니다.

4바이트 단위 역시 자연 법칙이 아니라 하나의 선택이었습니다. 더 작은 단위는 패딩을 줄이지만 맞추는 정렬 요구가 적어지고, 더 큰 단위는 더 많은 아키텍처에서 정렬을 쉽게 하지만 인코딩을 부풀립니다. 4가 선택된 절충안이었습니다.

개수가 데이터와 표현을 분리했다

고정 불투명 데이터는 스키마가 제공하는 크기를 가집니다. 가변 불투명 데이터는 32비트 부호 없는 개수에 이어 정확히 그만큼의 임의 바이트, 그리고 격자에 도달할 만큼의 0 채우기를 실어 나릅니다. 문자열도 동일한 개수 기반 형태를 씁니다. 가변 배열은 요소 개수와 이어지는 순서대로의 요소들을 전달합니다.

이는 디코더가 로컬에서 검증할 수 있는 증거를 제공합니다. 개수를 프로토콜이 선언한 최대치와 비교하고, 충분한 바이트가 남았는지 확인하며, 다음 정렬 위치를 계산할 수 있습니다. 경계가 있는 불투명 값 같은 선언은 한도를 넘는 인코딩을 무효로 만듭니다. 스키마 최대치를 생략했다고 해서 수신자가 언어의 이론적 한계를 예약해야 하는 것은 아닙니다. 수신자는 여전히 자신의 메모리와 작업 한도를 소유합니다.

개수, 할당, 의미는 분리된 상태를 유지해야 합니다. 개수 기반 XDR 문자열에는 로컬 언어가 NUL을 문자열 끝으로 취급하더라도 NUL 옥텟이 들어갈 수 있습니다. 한쪽 관례를 신뢰하면서 다른 쪽 관례로 할당하면 파싱·비교·해제가 서로 어긋날 수 있습니다. 정규 바이트는 스키마가 실제로 정의하는 곳에서만 아키텍처적 모호성을 제거합니다.

판별자는 한 분기에 존재 권한을 부여했다

XDR은 암시적 타이핑을 사용합니다. 일반적인 값은 모든 구성 요소마다 필드 이름과 범용 타입 태그를 실지 않습니다. 양쪽 모두 이미 선언을 공유하고 있어야 합니다. 그렇기에 선언 순서는 헌법적입니다. 보존되는 스키마에서 두 필드의 순서를 바꾸는 것은 외관적 변경이 아니라 이후 바이트에 배정되는 타입을 바꿉니다.

판별 유니언은 한 분기의 선택을 명시적으로 만듭니다. 판별자를 먼저 인코딩한 뒤 선택된 분기를 인코딩합니다. 선언에 기본 분기가 없다면 목록에 없는 판별자는 유효한 인코딩이 없습니다. 옵션 데이터가 간결한 예입니다. 불리언이 요소가 뒤따르는지를 말하고, false는 0바이트void를 선택합니다. 부재는 빈 페이로드로 추측하는 것이 아니라 분기 선택자로 증명됩니다.

판별자의 권한은 좁습니다. 합의된 스키마 안에서 타입 분기를 선택할 뿐입니다. 원격 절차를 승인하거나, 발신자를 인증하거나, 선택된 내용이 타당하다는 것을 증명하지는 않습니다.

표현은 기록도 판결도 되지 않았다

RFC 1832는 1995년 배포된 형식을 표준화 트랙으로 옮겼습니다. 11년 뒤 RFC 4506은 STD 67이 되었고, 그 회선 계약에 대해 명시적으로 어떤 기술적 변경도 하지 않았습니다. 이전 텍스트에 없던 IANA 처리, 참조 규율, 보안 지침을 추가했을 뿐입니다. 그 오랜 수명은 표현 자체에 속하며, 모든 디코더가 안전했다는 주장에 속하지 않습니다.

RFC 5531은 이 경계를 깨끗하게 보여줍니다. ONC RPC 메시지는 XDR로 기술되지만, TCP 상의 RPC는 바이트 스트림 안에서 메시지를 구분하기 위해 별도의 레코드 마킹 계층이 필요합니다. 그 프래그먼트 헤더는 명시적으로 XDR 표준 형식이 아닙니다. 따라서 하나의 XDR 값을 성공적으로 디코딩했다고 해서 임의의 TCP 메시지가 어디서 끝나는지, 어느 호출이 그것을 소유하는지, 연산이 커밋되었는지가 증명되지 않습니다.

XDR은 또한 인증, 기밀성, 권한 부여, 재생 보호를 제공하지 않습니다. 2006년의 보안 절은 대신 구체적 의무를 프로토콜과 디코더에 부과합니다. 가변 값에 한도를 두고, 개수 기반 문자열을 네이티브 관례와 조정하며, 재귀 구조를 제한하도록 요구합니다. 정규 문법은 잘못된 입력을 식별 가능하게 만들 수 있지만, 소프트웨어가 그것을 안전하게 거부하도록 강제할 수는 없습니다.

근거와 한계

닫힌 기록은RFC 1014,RFC 1832,RFC 4506,RFC 5531입니다. 이 문서들은 함께 인코딩, 개정 이력, 설계 근거, 문서화된 RPC/NFS 관계, 레코드 계층 경계를 확립합니다. 다만 현재의 사용 현황을 측정하거나, 제품을 인증하거나, 캡처된 패킷을 기술하거나, 표현의 합의를 정책이나 진실에 관한 합의로 바꾸지는 않습니다.