XDR (External Data Representation) 은
이기종 시스템 간 구조화된 바이너리 데이터를 안전하게 주고받기 위한 직렬화 포맷
핵심 목적
- 서로 다른 시스템(OS, CPU 아키텍처 등) 간에
int, float, struct, array 같은 복잡한 데이터를
일정한 형식으로 변환해 전송 - 특히 네트워크 환경에서 엔디안, 정렬 차이를 해결하기 위해 사용됨
예: 왜 필요한가?
문제 상황
- A 시스템: x86 (리틀 엔디안)
- B 시스템: SPARC (빅 엔디안)
이 두 시스템이 int 1234를 구조체로 전송하면
바이트 순서가 달라서 잘못된 값으로 해석될 수 있음.
XDR 도입 시:
- 데이터를 XDR 포맷으로 직렬화 (XDR encode)
- 네트워크로 전송
- 수신 측에서 XDR 디코딩 (decode)
→ 결과: 서로 다른 시스템도 동일하게 해석 가능
주요 특징
특징설명
| 고정 바이트 순서 | 항상 big endian 사용 |
| C 구조체와 호환 | 배열, struct, union 등 표현 가능 |
| 텍스트 아님 | 완전한 바이너리 포맷 |
| 프로토콜 독립 | TCP/IP, UDP, 파이프 등 어디든 사용 가능 |
| 사용 예 | ONC RPC, NFS, TIRPC 등 |
🔹 ONC RPC (Open Network Computing Remote Procedure Call)
- 원격에서 함수 호출(Remote Procedure Call)을 수행하기 위한 프로토콜
- 구조체나 데이터를 주고받을 때 XDR을 사용
- 예: client.call("getUser") → 실제 서버에서 함수 실행됨
→ 예전 유닉스 시스템에서 많이 사용됨 (rpcgen으로 자동 코드 생성)
🔹 NFS (Network File System)
- 네트워크를 통해 다른 서버의 파일시스템을 마치 로컬 디렉토리처럼 마운트해서 사용 가능
- 예: /mnt/server_data → 실제로는 서버에서 제공 중인 디렉토리
- 내부적으로 ONC RPC + XDR 기반
🔹 TIRPC (Transport-Independent RPC)
- ONC RPC의 후속 버전
- 기존 ONC RPC는 TCP/UDP에 종속 → TIRPC는 다양한 네트워크 전송을 지원
- 리눅스에서는 libtirpc 라이브러리로 구현
예시 구조체 (XDR 표현)
struct person {
int id;
string name<100>;
};
→ XDR에서는 이를 .x 파일에 정의하고,
rpcgen으로 자동 코드 생성해서 xdr_encode(), xdr_decode() 함수 사용
XDR vs 기타 직렬화 포맷 비교
포맷설명텍스트 기반?사용 예
| XDR | 고정 엔디안, RPC 통신용 | ❌ 바이너리 | ONC RPC, NFS |
| JSON | 사람-가독성 중심 | ✅ | 웹, API |
| Protocol Buffers | Google 개발, 작고 빠름 | ❌ | gRPC, 마이크로서비스 |
| ASN.1 | 통신 표준 (SNMP 등) | ❌ | 통신 프로토콜 |
| XML | 문서 중심 | ✅ | SOAP, 설정 파일 등 |
요약
항목내용
| 이름 | XDR (External Data Representation) |
| 성격 | 바이너리 직렬화 포맷 |
| 목적 | 이기종 시스템 간 데이터 일관성 유지 |
| 특징 | big endian 고정, 구조체/배열/문자열 표현 가능 |
| 사용처 | RPC, NFS, 커널-유저스페이스 통신 등 |
'개인공부 > 네트워크' 카테고리의 다른 글
| 포트 포워딩 (0) | 2025.05.15 |
|---|---|
| 바이너리 전송 방식 vs 텍스트 전송 방식 (0) | 2025.04.30 |
| TCP/IP 의 송수신 원리 한눈에 (0) | 2025.01.28 |
| epoll 의 EAGAIN (0) | 2025.01.23 |
| epoll 의 Edge-Triggered 방식 (0) | 2025.01.23 |