Entfernte Funktionsaufrufe (RPC)
Überblick
Entfernte Funktionsaufrufe (Remote Procedure Calls, RPC) sind ein Konzept, bei dem ein Programm auf einem Rechner eine Prozedur (Funktion) auf einem entfernten Rechner aufruft, als handele es sich um eine lokale Funktion. RPC abstrahiert die Details der Netzwerkkommunikation und erleichtert so verteilte Systeme und Client-Server-Architekturen.
Funktionsprinzip
RPC ermöglicht es, dass der aufrufende Prozess („Client“) und der ausführende Prozess („Server“) transparent über ein Netzwerk kommunizieren. Der Client ruft eine Prozedur auf, übergibt Parameter, und erhält Rückgabewerte, ohne direkt mit Netzwerk-Sockets oder Protokollen umgehen zu müssen.
Typischer Ablauf:
- Der Client ruft eine lokale Stub-Funktion auf.
- Der Stub serialisiert die Parameter („Marshalling“) und sendet sie an den Server.
- Der Serverstub empfängt die Daten, deserialisiert sie und ruft die tatsächliche Serverfunktion auf.
- Das Ergebnis wird zurückserialisiert („Unmarshalling“) und an den Client übertragen.
ONC RPC-Standard
ONC RPC (Open Network Computing Remote Procedure Call) ist ein Standard, der ursprünglich von Sun Microsystems entwickelt wurde. Er ist im RFC 5531 spezifiziert und basiert auf UDP oder TCP. ONC RPC wird in UNIX-Umgebungen häufig verwendet, z. B. im Network File System (NFS).
Wichtige Merkmale von ONC RPC:
- Plattformunabhängigkeit durch einheitliche Datenrepräsentation
- Unterstützung mehrerer Transportschichten (UDP/TCP)
- Nutzung von Portmapper-/rpcbind-Diensten zur Dienstzuordnung
- Weit verbreitet in klassischen UNIX/Linux-Systemen
Schnittstellendefinition
Bei RPC werden Schnittstellen in einer Schnittstellenbeschreibungssprache (IDL) definiert.
- Bei ONC RPC wird die RPC Language (XDR/RPCGen) verwendet.
- Der Entwickler beschreibt die Prozeduren, Parameter und Datentypen in einer .x-Datei.
- Das Werkzeug rpcgen generiert aus dieser Datei automatisch Client- und Server-Stubs in C.
Beispiel (vereinfachter Auszug): ```c program ADD_PROG {
version ADD_VERS {
int ADD(int, int) = 1;
} = 1;
} = 0x23451111;