본문 바로가기

개인공부/네트워크

XDR

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