요약

  • Sun Microsystems의 RFC 1014는 인코딩한 항목의 길이를 네 바이트의 배수로 맞췄다. 길이가 바뀌는 문자열에는 먼저 네 바이트 길이 값이 오고, 문자 뒤에 다음 경계까지 0이 붙는다.
  • RFC의 파일 예시에서 sillyprog는 문자 아홉 바이트에 채움 0 세 바이트를 더한다. 파일 종류 값은 오프셋 16에서 시작한다. 길이 값은 이름의 크기를, 채움은 다음 항목의 위치를 알려준다.

기계마다 메모리를 정리하는 방식이 달랐던 시절, 파일 하나를 공유하려면 상대가 다음 값을 찾을 자리부터 맞춰야 했다. Sun Microsystems는 RFC 끝부분에서 john이라는 예시 사용자를 등장시킨다. 그는 sillyprog라는 Lisp 프로그램을 저장하며, 프로그램 내용은 (quit)이다. 이름이 장난스럽다고 바이트까지 자유로운 것은 아니었다. XDR은 네 바이트로 길이 9를 적고, 아홉 글자를 옮긴 다음, 0을 세 개 붙인다. 파일 종류는 오프셋 16에서 나온다. 세 개의 0은 이름의 일부가 아니라 다음 손님을 위한 자리 정리다.

1987년에는 Sun 워크스테이션, VAX, IBM PC, Cray처럼 속이 다른 기계들이 데이터를 주고받았다. RFC 1014는 XDR, 곧 외부 데이터 표현을 이들 사이에서 값을 설명하고 인코딩하는 방식으로 제시했다. Sun RPC와 NFS도 데이터 형식을 설명하는 데 XDR을 사용했다. 출발점은 의미를 보존해 운반할 수 있는 8비트 바이트였다. 그 위에 모든 인코딩 항목을 네 바이트 단위로 맞추는 규칙이 놓였다.

32비트 정수는 네 칸을 스스로 채운다. 아홉 글자 이름은 네 칸짜리 묶음 두 개를 채우고 세 번째 묶음에 한 칸만 쓴다. XDR은 나머지 세 칸에 0을 넣는다. 맨 앞의 길이는 여전히 9다. 실제 이름은 아홉 바이트이기 때문이다. 다만 전송 흐름에서 이름과 채움을 합친 자리는 열두 바이트가 된다. 받는 쪽은 길이만큼 읽고 빈 칸을 넘어 다음 네 바이트 경계로 간다.

RFC의 16진수 표를 따라가면 계산이 손에 잡힌다. 오프셋 0부터 3까지는 길이 9다. 4부터 12까지 아홉 글자가 들어간다. 13, 14, 15에는 0이 놓인다. 16에서 파일 종류 EXEC, 값 2가 시작된다. 0을 이름에 포함하면 이름이 달라진다. 글자 끝에서 바로 다음 값을 읽으면 세 바이트 앞에서 시작한다. 작은 빈칸 하나를 잘못 지나면 뒤의 값 전체가 비뚤어진다.

파일의 나머지도 같은 박자를 밟는다. EXEC는 판별 공용체에서 인터프리터를 담는 가지를 고른다. 인터프리터 lisp는 길이 4와 문자 네 개로, 소유자 john도 그렇게 기록된다. 내용 (quit)는 여섯 바이트이므로 앞에 길이 6을 두고 뒤에 0 두 개를 붙인다. 값의 실제 길이가 계속 달라져도 수신자는 같은 동작을 반복한다. 길이를 보고, 내용을 읽고, 네 바이트 경계로 이동한다.

XDR은 문자열과 불투명 데이터를 구별했다. 이 RFC의 문자열은 ASCII 바이트다. 불투명 데이터는 XDR이 내용을 해석하지 않고 바이트를 옮긴다. 가변 길이 값에는 최대 길이를 선언할 수 있으며, 이를 넘겨 인코딩하면 오류다. 앞의 길이 값은 내용의 끝을 찾고 한도를 확인하는 데 쓰인다. 뒤의 채움 0은 다음 값이 시작할 위치를 정한다. 둘을 같은 것으로 취급하면 승객과 빈 좌석을 섞어 세는 셈이다.

공통 데이터 설명은 송신 기계의 메모리 배치보다 우선했다. 한 프로그램의 포인터가 다른 컴퓨터에서도 같은 곳을 가리키지는 않는다. 컴파일러가 구조를 배치하는 습관도 다르다. XDR 설명은 값의 종류와 순서를 정하고, 인코딩은 공유할 바이트를 정했다. 파일 예시에서는 EXEC가 다음에 인터프리터를 읽으라고 알려준다. 네 바이트 경계가 그 판단을 내릴 위치까지 고정한다.

채움에는 비용이 든다. 아홉 바이트 이름 뒤에 세 바이트, 여섯 바이트 내용 뒤에 두 바이트. RFC는 이 비용을 오프셋 표에 그대로 드러냈다. 대가로 어느 기계든 다음 필드의 주소를 계산할 수 있다. sillyprog가 이름으로 웃겨도, 바이트 열차의 좌석 배치는 엄격했다. 서로 다른 기계가 오프셋 16에서 같은 값을 찾는 순간, 세 개의 빈칸은 마침내 제 몫을 했다.