Maximilian Krieg
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen

Ein verteiltes System ist im Prinzip der Zusammenschluss mehrerer Rechner zur Lösung einer gemeinsamen Aufgabe. Eines der größten verteilten Systeme ist das Internet mit seinen Applikationen. Teil 2 beschreibt die Kommunikation über das Netzwerk mittels TCP, UDP und Sockets. Im Anschluss folgt die Verwendung von Remote Procedure Calls.
| Skript-Annfang | VS_1_So2014 – Seite 1 |
|---|---|
| Skript-Ende | VS_6_So2014 – Seite 70 |
Welche Kommunikationsformen gibt es?
Wo sind die Unterschiede zwischen verbindungsloser und verbindungsorientierter Kommunikation?
| Verbindungslos | Verbindungsorientiert | |
| Protokoll | UDP | TCP |
| Reales Beispiel | Brief | Telefongespräch |
| Verbindung | Wird nicht ausgehandelt | Wird ausgehandelt mittels Handshake (Auf- und Abbau) |
| Paketverlust | Kann passieren | Zustellung wird garantiert |
| Reihenfolge | Nicht gewährleistet und muss von Anwendung geprüft werden | Reihenfolge wird garantiert |
| Broadcast/Multicast | Ja | Nein |
Was ist die synchrone Kommunikation?

Was ist die asynchrone Kommunikation?

Welche Kommunikationsform ist am besten geeignet in einem verteilten System?
Was kann bei synchroner Kommunikation passieren?
Welche Qualitätsparameter gibt es?
| Merkmal | Beschreibung |
| Latenz | Dauer des Transfers einer leeren Nachricht zwischen Sender und Empfänger |
| Datentransferrate | Datenmenge, die innerhalb einer Zeiteinheit über einen Übertragungskanal übertragen wird |
| Nachrichtentransferzeit | Dauer des Transfers einer Nachricht (Latenz + Datenmenge / Datentransferrate) |
| Durchsatz | Datenmenge pro Zeiteinheit |
| Bandbreite | Maximale Übertragungsrate |
Warum ist Latenz nicht gleich Nachrichtentransferzeit?
Bei welchen Anwendungen ist Latenz, wo ist Bandbreite wichtiger?
Warum kann die Bandbreite i.d.R. von einer Anwendung nicht voll ausgeschöpft werden?
Warum ist das wichtig für verteilte Systeme?
Wie ist ein Paket aufgebaut?
Was ist das OSI-Schichtenmodell?
Wie funktioniert das Internet?
Was ist Routing?
Was ist das IP-Protokoll?
Was ist das UDP-Protokoll?
Was ist das TCP-Protokoll?
Welches Protokoll ist für welche verteilte Anwendung am besten geeignet?
| Anwendung | Protokoll |
|---|---|
| Videokonferenz | UDP |
| DNS | UDP/TCP |
| Bank-Transaktionen | TCP |
| Webserver | TCP |
Für welche Qualitätsparameter ist der Paketaufbau wichtig?
Welche Probleme kann es dennoch geben?
Was macht man im Fehlerfall?
setsockopt oder selectWas sind Sockets?
Was braucht man zum Datenaustausch, um ein funktionierendes verteiltes System aufzubauen?
Sockets mit UDP
send(2x 5 Byte) werden als recv(2x 5 Byte) empfangenWie läuft die Kommunikation mit UDP-Sockets ab?
sendto()recvfrom() – alles (ok), nichts (Verlust) oder nur einen Teil (Puffer zu klein)
Was passiert, wenn man den Server an keine Adresse bindet?
Woher weiß das UDP-Socket wie groß die Nachricht ist?
Wie verschickt man Nachrichten größer als 64 KB?
recvfrom() bis alle Daten empfangen sindSockets mit TCP
send(2x 5 Byte) werden als recv(1x 10 Byte) empfangenWas passiert wenn der Server eine Anfrage akzeptiert?
Wie läuft die Kommunikation mit TCP-Sockets ab?
send()recv() – alles (ok), nichts (Verlust) oder beliebig viele Teilnachrichten
Was passiert in der Anwendung wenn Pakete verloren gehen oder vertauscht werden?
Woher weiß das TCP-Socket wie lang die Nachricht ist?
recv() 0 zurück liefert, ist die TCP-Verbindung erfolgreich abgebaut und alle Pakete empfangenrecv() X > 0 zurück liefert, wurden X Byte empfangenSind Sockets synchron?
Wie kann man asynchrones Verhalten erreichen?
Warum ist der Einsatz von select asynchron?
Was bringen Sockets im Hinblick auf die Transparenzeigenschaften?
was bringen Sockets im Hinblick auf die anderen Ziele eines verteilten Systems?
Was passiert, wenn man einen Integer über ein Socket zu einem anderen Rechner schickt und dort ausgibt?
Welche Zahlenumwandlungen gibt es?
ntohs – network-to-host shortntohl – network-to-host longhtons – host-to-network shorthtonl – host-to-network longWas sind RPCs?
Welche Ziele guter verteilter Systeme werden erfüllt?
Wie funktioniert ein Stub?

Müssen wie bei Sockets die Zahlen konvertiert werden?
Was sind die Vorteile von RPCs?
Was sind die Nachteile von RPCs?
Was ist eine Interface Definition Language (IDL)?
Woher kommen die Stubs?
Wie implementiert man Aufruf und Funktion?
Welche Programmiersprachen werden unterstützt?
| Framework | Sprachen |
|---|---|
| Apache Thrift | C, C++, Java u.v.m. |
| Sun ONC-RPC | C |
| XML-RPC | RPC Aufrufe als XML codiert |
| JSON-RPC | Wie XML-RPC, nur mit JSON |
Wie implementiert man einen Service?
Welche Protokolle verwendet Thrift?
Wie adressiert man den Server?
Welche Datentypen kennt Thrift?
Wie implementiert man die IDL bzw. Schnittstelle?
service Calculator {
void ping(),
}
i32 add(1: i32 num1, 2: i32 num2)
Wie kompiliert man die IDL?
$> thrift gen cpp calc.thrift
Wie implementiert man den Server?
class calculatorHandler : virtual public calculatorIf
{
public:
calculatorHandler()
{
// Your initialization goes here
}
void ping()
{
// Your implementation goes here
printf("ping\n");
}
int32_t add(const int32_t num1, const int32_t num2)
{
// Your implementation goes here
printf("add\n");
}
};
int main(int argc, char **argv) {
int port = 9090;
shared_ptr<calculatorHandler> handler(new calculatorHandler());
shared_ptr<TProcessor> processor(new calculatorProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
return 0;
}
Wie implementiert man den Client?
#include "calculator.h"
int main()
{
try
{
// Variablen initialisieren
int n1 = 2, n2 = 3;
// Verbindung auf Port 9090 öffnen
shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
shared_ptr<TTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
CalculatorClient client(protocol);
transport->open();
// Aufruf der Serverfunktion mit Rückgabewert
int result = client.add(n1,n2);
// Verbindung schließen
transport->close();
// Ausgabe
cout << n1 << " + " << n2 << " = " << result << endl;
}
catch(TException &tx)
{
cout << "error calling server: " << tx.what() << endl;
}
return 0;
}
Wie implementiert man eigene Datentypen?
struct UserProfile {
1: i32 uid,
2: string name,
3: string blurb
}
service UserStorage {
void store(1: UserProfile user),
UserProfile retrieve(1: i32 uid)
}
Was ist ONC RPC?
Welche Datenformate unterstützt ONC RPC?
Wie sieht eine Schnittstelle aus?
/* calc.x: Remote calculator */
struct numbers {
int n1;
int n2;
};
program CALCULATORPROG {
version CALCULATORVERS {
int add(numbers) = 1;
} = 1;
} = 0x20000001;
//version = 0x20000001
//program = 1

Wie findet der Client den Server ohne Port?
version und program angebenWas ist XML-RPC?
Wie sieht ein Aufruf aus?
POST /RPC2 HTTP/1.0 User-Agent: Frontier/5.1.2 (WinNT) Host: betty.userland.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param </params> </methodCall> </?xml>
Wie sieht eine Antwort aus?
HTTP/1.1 200 OK Connection: close Content-Length: 158 Content-Type: text/xml Date: Fri, 17 Jul 1998 19:55:08 GMT Server: UserLand Frontier/5.1.2-WinNT <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>South Dakota</string></value> </param> </params> </methodResponse> </?xml>
Wie sieht ein Client aus?
string const serverUrl("http://localhost:8080/RPC2");
string const methodName("sample.add");
xmlrpc_c::clientSimple myClient;
xmlrpc_c::value result;
// Aufruf
myClient.call(serverUrl, methodName, "ii", &result, 5, 7);
// Ergebnis
int const sum = xmlrpc_c::value_int(result);
cout << "Result of RPC (sum of 5 and 7): " << sum << endl;
Wie sieht ein Server aus?
class sampleAddMethod : public xmlrpc_c::method {
public:
sampleAddMethod() {
// signature and help strings are documentation -- the client
// can query this information with a system.methodSignature and
// system.methodHelp RPC.
this->_signature = "i:ii";
// method's result and two arguments are integers
this->_help = "This method adds two integers together";
}
void execute(xmlrpc_c::paramList const& paramList,
xmlrpc_c::value * const retvalP) {
int const addend(paramList.getInt(0));
int const adder(paramList.getInt(1));
paramList.verifyEnd(2);
*retvalP = xmlrpc_c::value_int(addend + adder);
}
Was sind Protocol Buffers?
Was sind die Vorteile?
Was sind die Nachteile?