Entfernte Funktionsaufrufe (RPC): Unterschied zwischen den Versionen
PhilKa (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
PhilKa (Diskussion | Beiträge) |
||
| Zeile 89: | Zeile 89: | ||
XDR trennt die Logik der Anwendung von der Datenkodierung. Dies macht es einfacher, RPC-Schnittstellen zu entwickeln, die langfristig stabil und zwischen vielen Systemen kompatibel bleiben. | XDR trennt die Logik der Anwendung von der Datenkodierung. Dies macht es einfacher, RPC-Schnittstellen zu entwickeln, die langfristig stabil und zwischen vielen Systemen kompatibel bleiben. | ||
==== Beispiel: Serialisierung mit XDR (C) ==== | |||
Das folgende Beispiel zeigt, wie eine einfache Datenstruktur mit XDR serialisiert (geschrieben) und deserialisiert (gelesen) wird. | |||
<syntaxhighlight lang="c"> | |||
#include <rpc/xdr.h> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
typedef struct { | |||
int id; | |||
float wert; | |||
} daten_t; | |||
/* Funktion zur XDR-Kodierung und -Dekodierung */ | |||
bool_t xdr_daten(XDR *xdrs, daten_t *d) { | |||
return (xdr_int(xdrs, &d->id) && | |||
xdr_float(xdrs, &d->wert)); | |||
} | |||
int main() { | |||
daten_t original = {42, 3.14f}; | |||
daten_t empfangen = {0, 0.0f}; | |||
/* Serialisierung in Speicher */ | |||
char buffer[100]; | |||
XDR xdr_encode; | |||
xdrmem_create(&xdr_encode, buffer, sizeof(buffer), XDR_ENCODE); | |||
xdr_daten(&xdr_encode, &original); | |||
xdr_destroy(&xdr_encode); | |||
/* Deserialisierung aus Speicher */ | |||
XDR xdr_decode; | |||
xdrmem_create(&xdr_decode, buffer, sizeof(buffer), XDR_DECODE); | |||
xdr_daten(&xdr_decode, &empfangen); | |||
xdr_destroy(&xdr_decode); | |||
printf("Empfangen: ID=%d, Wert=%f\n", empfangen.id, empfangen.wert); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
Dieses Beispiel: | |||
* Definiert eine einfache Struktur mit einem Integer und einem Float. | |||
* Kodiert die Daten in ein Byte-Array (Serialisierung). | |||
* Dekodiert die Daten wieder aus dem Byte-Array (Deserialisierung). | |||
Auf diese Weise können Daten sicher und plattformunabhängig zwischen Systemen übertragen werden. | |||
== Anwendungen == | == Anwendungen == | ||
Version vom 23. September 2025, 13:43 Uhr
Einführung
Entfernte Funktionsaufrufe (Remote Procedure Calls, RPC) sind ein Mechanismus, der es Programmen ermöglicht, Funktionen oder Prozeduren auszuführen, die sich auf einem entfernten System befinden, als ob sie lokal verfügbar wären. RPC abstrahiert die Details des Netzwerkprotokolls und erlaubt Entwicklern, sich auf die Funktionalität zu konzentrieren statt auf die Übertragungsschicht.
RPC ist ein zentrales Konzept verteilter Systeme und findet Anwendung in Betriebssystemdiensten, Microservices und Cloud-Architekturen.
Grundprinzip
Bei einem RPC ruft ein Client eine Funktion auf, die auf einem Server implementiert ist. Der Ablauf:
- Der Client ruft eine Stub-Funktion auf (lokales Platzhalterobjekt).
- Die Stub-Funktion serialisiert Parameter (Marshalling).
- Die Daten werden über ein Transportprotokoll (z. B. TCP oder UDP) gesendet.
- Der Server-Stub deserialisiert die Daten und ruft die eigentliche Serverfunktion auf.
- Das Ergebnis wird zurückgesendet und im Client-Stub deserialisiert.
Der ONC RPC-Standard
Open Network Computing Remote Procedure Call (ONC RPC) ist ein von Sun Microsystems entwickelter Standard, der erstmals in den 1980er-Jahren für das NFS eingesetzt wurde. ONC RPC ist in RFC 5531 definiert und gilt als einer der ältesten und am weitesten verbreiteten RPC-Standards.
Merkmale von ONC RPC:
- Transportunabhängig (UDP oder TCP)
- Definiert in der Sprache RPC Language (RPCL)
- Standardisierte Datenrepräsentation über XDR (External Data Representation)
- Weite Unterstützung in UNIX-Derivaten (Linux, BSD, Solaris)
Schnittstellendefinition
RPC-Systeme nutzen Schnittstellendefinitionssprachen (IDLs), um Funktionen, Parameter und Datentypen unabhängig von der Implementierung zu beschreiben. Im Fall von ONC RPC:
- Die IDL heißt RPC Language (RPCL).
- Aus RPCL-Dateien generieren Tools automatisch Client- und Server-Stubs (z. B. `rpcgen`).
- Dies ermöglicht Plattform- und Sprachenunabhängigkeit.
Beispiel einer RPCL-Definition:
program MATH_PROG {
version MATH_VERS {
int ADD(int a, int b) = 1;
} = 1;
} = 0x20000001;
Datenrepräsentation
Ein Kernproblem verteilter Systeme ist die plattformunabhängige Darstellung von Daten. ONC RPC löst dies durch XDR (External Data Representation):
- Fest definierte Endianness (Big-Endian)
- Definiert Datentypen wie int, float, arrays, strings
- Stellt sicher, dass Daten auf unterschiedlichen Rechnerarchitekturen korrekt interpretiert werden
Sicherheitsaspekte
RPC-Systeme müssen Authentifizierung, Autorisierung und Datenschutz gewährleisten. Bei ONC RPC existieren verschiedene Mechanismen:
- AUTH_NULL: Keine Authentifizierung (Standard, unsicher)
- AUTH_SYS: Überträgt UNIX-Benutzer-IDs
- AUTH_DES / AUTH_KERB (Kerberos): Sichere Authentifizierung via kryptografischer Verfahren
- RPC über sichere Transportprotokolle (z. B. TLS) ist möglich, aber im Standard nicht zwingend vorgeschrieben.
Empfohlene Sicherheitsmaßnahmen:
- Einsatz verschlüsselter Transportverbindungen (z. B. stunnel oder IPsec)
- Nutzung starker Authentifizierung (Kerberos)
- Firewalls und Zugriffskontrolllisten für RPC-Dienste
Vergleich zu anderen RPC-Implementierungen
| Merkmal | ONC RPC | DCE/RPC | gRPC |
|---|---|---|---|
| Transport | UDP/TCP | TCP/SMB | HTTP/2 |
| Datenrepräsentation | XDR | NDR | Protocol Buffers |
| Authentifizierung | AUTH_SYS, AUTH_DES, AUTH_KERB | Kerberos integriert | TLS, OAuth2 |
| Sprachunterstützung | C, C++ u. a. | C, C++, Java | Viele moderne Sprachen |
External Data Representation (XDR)
External Data Representation (XDR) ist ein standardisiertes Format zur plattformunabhängigen Kodierung von Daten. Es wurde von Sun Microsystems entwickelt und in RFC 4506 spezifiziert. XDR ist integraler Bestandteil von ONC RPC und dient dazu, Daten zwischen Systemen unterschiedlicher Architektur sicher und eindeutig zu übertragen.
Hauptmerkmale von XDR:
- Plattformunabhängigkeit – definiert feste Größen und Big-Endian-Byteordnung.
- Definierte Basistypen – Integer, Float, Double, String, Arrays, Strukturen und Unions.
- Erweiterbarkeit – unterstützt komplexe Datentypen und verschachtelte Strukturen.
- Kompatibilität – ermöglicht interoperable Kommunikation zwischen unterschiedlichen Hard- und Softwareplattformen.
XDR trennt die Logik der Anwendung von der Datenkodierung. Dies macht es einfacher, RPC-Schnittstellen zu entwickeln, die langfristig stabil und zwischen vielen Systemen kompatibel bleiben.
Beispiel: Serialisierung mit XDR (C)
Das folgende Beispiel zeigt, wie eine einfache Datenstruktur mit XDR serialisiert (geschrieben) und deserialisiert (gelesen) wird.
#include <rpc/xdr.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id;
float wert;
} daten_t;
/* Funktion zur XDR-Kodierung und -Dekodierung */
bool_t xdr_daten(XDR *xdrs, daten_t *d) {
return (xdr_int(xdrs, &d->id) &&
xdr_float(xdrs, &d->wert));
}
int main() {
daten_t original = {42, 3.14f};
daten_t empfangen = {0, 0.0f};
/* Serialisierung in Speicher */
char buffer[100];
XDR xdr_encode;
xdrmem_create(&xdr_encode, buffer, sizeof(buffer), XDR_ENCODE);
xdr_daten(&xdr_encode, &original);
xdr_destroy(&xdr_encode);
/* Deserialisierung aus Speicher */
XDR xdr_decode;
xdrmem_create(&xdr_decode, buffer, sizeof(buffer), XDR_DECODE);
xdr_daten(&xdr_decode, &empfangen);
xdr_destroy(&xdr_decode);
printf("Empfangen: ID=%d, Wert=%f\n", empfangen.id, empfangen.wert);
return 0;
}
Dieses Beispiel:
- Definiert eine einfache Struktur mit einem Integer und einem Float.
- Kodiert die Daten in ein Byte-Array (Serialisierung).
- Dekodiert die Daten wieder aus dem Byte-Array (Deserialisierung).
Auf diese Weise können Daten sicher und plattformunabhängig zwischen Systemen übertragen werden.
Anwendungen
- Network File System (NFS)
- Verwaltungstools unter UNIX/Linux
- Interprozesskommunikation in Clustern
Literatur und Standards
- RFC 5531 – RPC: Remote Procedure Call Protocol Specification Version 2
- RFC 4506 – XDR: External Data Representation Standard
- DCE/RPC
- gRPC