XDR/RPC gehört heute zum festen Bestandteil von fast jedem UNIX-System.
Wohl das wichtigste Projekt, das auf RPC aufsetzt, ist CORBA (Common Object Request Broker Architektur), das von den größten Softwarehersteller gemeinsam (OMG - Objekt Managament Group) verfolgt wird. Mithilfe von CORBA ist es möglich in einem Netzwerk netzwerktransparent Objekte zu Verwalten und ihre Dienste in Anspruch zu nehmen. Solche Objekte sind Zusammenschlüsse von einem Daten- und Programmteil, der die Zugriffsmethoden (methods) auf diese Daten enthält. Damit ist es möglich im Netzwerk Programme über Datenstrukturen auszuführen ohne Kenntnis, wo die Objekte liegen und auf welchen Rechner die Programme effektiv ablaufen (distributed data / distributed processing). Für das Verständnis von CORBA ist die Kenntnis von RCP eine Voraussetzung.
Ebenfalls auf XDR/RPC baut das SUN-Produkt ToolTalk. Es definiert ein Protokoll auf der Applikationsebene des ISO-OSI Modells. Mit ToolTalk gebaute Applikationen sind in der Lage ihre Daten auf einfache Weise auszutauschen.
Abstract Syntax Notation One (ASN.1) ist eine XDR-ähnliche Sprache von ISO/OSI. Sie enthält als Elemente z.B. folgende Datentypen:
boolean |
integer |
bit string |
octet string |-- einfache Datentypen
null |
object identifier |
object descriptor |
external |
sequence of |-- zusammengesetzte Datentypen
set of |
numeric string |
printable string |
teletex string |-- Strings
videotex string |
IA5string |
generalized time |
UTCTime |-- andere Datentypen
graphic string |
general string |
Die Schnittstellenspezifikationen in ASN.1 sind abstrakter, weisen aber auch grössere Flexibilität auf.
Das vorliegende Skript ist als Arbeitsgrundlage für ein Praktikum konzipert und ist für ein Studium ohne Zugang zu einem lauffähigen RPC-System wenig geeignet. Auf viele selbstverständliche Details, die bei den Übungen automatisch erlernt werden, wurde verzichtet.
Kursdauer:
In ein bis zwei Wochen kann bei Kursteilnehmern mit sehr guter Vorbildung alles Notwendige gesagt werden, so daß sie in der Lage sind mithilfe des Skripts und des Referenz Manuals selbständig Applikationen zu entwickeln. Die normale Kursdauer, ohne Protokoll-Spezifikationen, beträgt drei bis vier Wochen. Für Personen, die RPC auf einer Rechnerarchitektur neu portieren möchten, ist eine mindestens einwöchige detaillierte Auseinandersetzung mit Protokoll-Spezifikationen unerläßlich.
Voraussetzungen der Kursteilnehmer:
1. C gut beherrschen
2. ISO/OSI-Modell, Grundlagen Netzwerke
3. Ethernet oder Token Ring Grundlagen
4. TCP/IP Grundlagen: Addressieren in einem Netzwerk
5. API: Berkeley Sockets
6. UNIX-Grundlagen: Prozeß-Management: fork, exec
Die mehr logische Reihenfolge der Darstellung in diesem Skript wird möglicherweise den didaktischen Erfordernissen nicht genügen. Aus diesem Grunde bilden einzelne Kapitel abgeschlossene Einheiten, so daß die endgültige Reihenfolge und Auswahl in der Verantwortung des Dozenten liegt.
Es wird empfohlen den Unterricht nach einer Einführung und High-level
RPC gleich mit Middle-level RPC anzufangen. Um die Argumente von
registerrpc()
und callrpc()
zu erklären folgt die
Erklärung des Port
Mappers und anschließend ein Kapitel über XDR. Danach soll RPCGEN und
Low-level RPC erklärt werden.
Beim Studium des Protokolls empfiehlt sich den RFC1050 mit der offiziellen Protokoll-Spezifikation zur Hilfe zu ziehen. Man findet ihn auch im Network Programming Guide von SUN.
Die Aufgaben dienen auch als Anleitung zum Praktikum. Es wurde weniger Wert auf technische Details und mehr auf allgemeines Verständnis gelegt.
1. Nennen Sie in Stichpunkten, welche Informationen für einen sinnvollen RPC-Call nötig sind. Kann man theoretisch gesehen auf einige dieser Punkte verzichten ?
2. Warum bietet NFS nur einen zustandslosen Dienst ? Was bedeutet das für den NFS-Anwender ?
3. Warum muß die XDR-Konvertierung hin- und wieder zurück erfolgen, auch wenn unkonvertierte Daten technisch problemlos zu übertragen sind ? Kann man nicht mit einer Umwandlungen auskommen ?
4. Warum braucht der Server eine Endlosschleife ?
5. Warum ist der Portmapper notwendig ?
6. Warum muß ab Middle-level RPC die Registrierung einer Serverprozedur beim Neustart des Serverprozesses jedes Mal neu erfolgen ?
7. Warum müssen mehrere Versionen einer entfernten Prozedur im Server koexistieren können ?
8. Entwerfen Sie Programme, die zwei Versionen einer entfernten Prozedur verwenden.
9. Erklären Sie den Sinn des XDR-Handles.
10. Lassen sich Memory-Steams mit Record-Streams konstruieren, oder umgekehrt ?
11. Ist der Aufruf
xdr_string(&handle, &&stringdaten, ...)
sinnvoll ?
12. Schreiben Sie eine Prozedur, die zwei Strings von einer dem Aufrufer unbekannten Länge liefert und keinen zusätzlichen Platz allokiert oder als static belegt. Rufen Sie sie auf.
13. Welche Eigenschaft der XDR-Filter bewirkt, daß alle Custom-Filter unabhängig von ihrem Aufbau genauso in beide Richtungen konvertieren, wie das auch primitive Filter tun ?
14. Was ist ein »Wrapper« ?
15. Das Netzwerk ist für RPC nicht vollkommen transparent. Zu welchen Unterschieden führt der Ersatz von UDP durch TCP im Low-level RPC Code ? Nennen Sie in Stichpunkten so viele Unterschiede, wie Sie kennen.
16. Fangen Sie alle mögliche Fehler in den Beispiel-Programmen ab und behandlen Sie sie jeweils an den richtigen Stellen. Welche(r) Kursteilnehmer/Arbeitsgruppe findet die meisten Fehlermöglichkeiten ?
17. - gestrichen
18. Programmieren Sie einen Server, der für jeden Auftrag einen Kind-Prozeß erzeugt, und ihn mit der Weiterbearbeitung betraut.
19. Was passiert bei der vorherigen Aufgabe wenn der Port nicht rechtzeitig frei wird, und beim nächsten Request benutzt wird.
20. Warum ist es sinnvoll, daß Batching einen sicheren (reliable) Transport wie TCP benutzt ?
21. Ist es notwendig, daß der Client keine anderen Aufgaben erledigt, während er auf das Ergebnis eines RPC-Calls wartet ?
22. Schreiben Sie mit rpcgen Client und Server, die auf der Konsole des anderen Rechners lokal eingetippte Texte ausgeben.
23. Erstellen Sie aus den Beispielen des Kapitels über rpcgen einen Client und einen Server für die entfernte Directoryabfrage rls (remote ls).
24. Vergleichen Sie die Protokollschnittstelle der Sicherheitsmechanismen struct call_body mit der Programmierschnittstelle struct svc_req. Werden die Felder cred und verf durch die Felder rq_cred und rq_clntcred abgedeckt ?
25. Ist es mithilfe der Diffie-Hellman-Methode möglich, durch ein öffentliches Netz mit einem Partner, mit dem man vorher keinen Kontakt hatte um Passworte auszutauschen, so zu kommunizieren, daß keiner mithören kann ? Begründen Sie die Antwort.
1. 1. der Name (Adresse) des Servers, 2. die Programm- Version- und Prozedurnummer, 3. Semantik des Dienstes, Ein- und Ausgabedatenformate, die die Dienstroutine anbietet. Würde man die Datenformate gesondert kodiert mitübertragen, so wäre bei komplexeren Strukturen die Information darüber, was der Dienst eigentlich anbietet (Semantik), schwer zu formulieren.
2. Der Client wird durch Absturz/Neubooten des Servers in keine unbestimmte Lage geraten. Server-Dienste sind entweder ganz da, oder überhaupt nicht.
3. Die Datenformate können auf verschiedenen Computern verschieden sein. Es ist leichter das lokale Format einmal für jeden Rechnertyp bei XDR-Portierung zu berücksichtigen, statt bei jeder Kommunikation die Quelle- und den Zieltyp zu verwalten.
4. Damit er mehrere nacheinander folgende Call-Requests bedienen kann.
5. Der Aufrufer kann nicht wissen, an welchem Port der Serverprozeß wartet, da sich die Portnummer beim Neustart des Serverprozesses ändern kann.
6. Nach dem Neustart warten die Serverprozesse möglicherweise an anderen Ports, die man vorher nur schlecht voraussagen kann.
7. Das erleichtert z.B. die SW-Entwicklung, die gleichzeitig von mehreren Personen auf mehreren Rechner durchgeführt wird.
9. XDR-Handle koppelt die transportbedingten Daten von den Konvertierungsfiltern ab. Die zwei Mechanismen sind weitgehend unabhängig: weniger Möglichkeiten für nichtlokale Fehler, einfachere Entwicklung, bessere Wartung, etc.
10. Record-Streams bieten einen allgemeineren Mechanismus an. Mit ihrer Hilfe lassen sich Memory-Streams und Standard-IO-Streams als Spezial- fälle konstruieren.
11. Man kann die Adresse nur von einem real im Speicher existierenden Objekt bilden, &stringdaten ist nicht ein Objekt, sondern eine Zahl. Man findet oft in der Synopsis mancher Funktionen die Beschreibungen von Parameter als: typ **variable; Es müssen im Programm zwei reale Objekte vorkommen, um den Aufruf zu konstruieren.
12. Die doppelten char-Pointer sind notwendig. Der Aufrufer muß der Prozedur mitteilen, wo sie die Adressen der Strings ablegen soll. Im Falle von nur einem string könnte man auch durch den Rückgabewert ohne doppelte Pointer auskommen.
13. Die Konvertierungsrichtung wird in den Filtern selbst nicht behandelt.
14. Ein »Wrapper« (»Umwickler«) ist eine Routine, die nur einfache Aufbereitung der Parameter durchführt und dann die eigentliche Behandlungsroutine aufruft.
15.
16.
17.
18. Rufen Sie fork()
im Dispatcher und nicht in der entfernten
Prozedur auf, sonst würde der Dispatcher leere Ergebnisse an den
Client schicken,
noch bevor die eigentliche Aufgabe erledigt wurde. Es gibt keine
Überschneidungen von den Ports, da für den Transportweg das Paar
(Clientport, Serverport) entscheidend ist.
19. Der Mechanismus der Ports wird von der Transportschicht (TCP, UDP) angeboten und für Multiplexing benutzt. Der Transportweg wird auf beiden Transportendpunkten durch das Paar (Port des Senders, Port des Empfängers) gekennzeichnet.
20. Die Aufträge werden zusammen geschickt. Bei einem Fehler könnte die ganze Schlange zusammenbrechen.
21. Nein. Es gibt dafür mehrere Möglichkeiten: 1. geeigneter eigener Dispatcher, 2. Callbacks
22. Benutzen Sie das erste Beispiel des Paragraphen über rpcgen.
24. Nein. Bei UNIX-Identifikation wird z.B. rq_cred und rq_clntcred in zwei nacheinander folgenden Messages in dem Feld cred übertragen und verf wird gar nicht verwendet.
25. Ja. Mit dem öffentlichen Schlüssel (public key) teilt man dem Partner mit, wie seine Nachrichten zu verschlüsseln sind. Die anderen Teilnehmer sind jedoch nur aufgrund des öffentlichen Schlüssels nicht in der Lage, den dazu gehörenden Entschlüsselungs-Schlüssel zu erstellen, der lokal angewendet geheim bleibt.