Verteilte Systeme - Übung 4 - Parallele und verteilte Systeme

Werbung
Verteilte Systeme
Übung 4
Jens Müller
Gruppe PVS (Parallele und Verteilte Systeme)
Institut für Informatik
Westfälische Wilhelms-Universität Münster
Sommersemester 2006
4.1 Aufgabe 1
Protokoll des Dateidienstes
Client-Anfragen:
Client-Anforderung
Datei empfangen (GET)
Zusatz
Dateiname
Server-Antworten:
Server-Antwort
Datei übermitteln (OK)
Datei nicht gefunden (NOT FOUND)
Ungültige Anfrage (BAD REQUEST)
Zusatz
Dateilänge und Dateiinhalt
-
Mögliche Erweiterungen:
Client-Anforderung
Verzeichnisinhalt anzeigen (LIST)
Datei löschen (DEL)
Datei übermitteln (PUT)
Zusatz
Dateiname
Dateiname, Dateigröße, Dateiinhalt
4-2
4.1 Aufgabe 1
Datenstrukturen des Protokolls (fileprotocol.h)
Mögliche Client-Anfragen
enum file_clientcommand
{
FP_GET
};
Mögliche Server-Antworten
enum file_serverretcode
{
FP_OK = 0,
FP_BADREQUEST,
FP_FILENOTFOUND,
FP_GENERROR
};
4-3
4.1 Aufgabe 1
Datentyp Client-Anfrage
typedef struct
{
int reqlen;
int cmd; /∗ file_clientcommand ∗/
char filename[FP_MAXFILENAME];
} clientrequest;
Datentyp Server-Antwort (statischer Teil)
typedef struct
{
int retcode; /∗ file_serverretcode ∗/
int filelen;
} serverresponse;
4-4
4.1 Aufgabe 1
Generische sendMsg-Funktion
/∗ Sendet &len Bytes beginnend bei msg ueber sock,
Gibt −1 bei Fehler und 0 bei Erfolg zurueck,
Tatsächliche Anzahl gesendeter Bytes wird in len geschrieben ∗/
int sendMsg(int sock, char ∗msg, int ∗len)
{
int total = 0;
int bytesleft = ∗len;
int n;
while(total < ∗len) {
n = send(sock, msg + total, bytesleft, 0);
if (n == −1) { break; }
total += n;
bytesleft −= n;
}
}
∗len = total;
return n==−1?−1:0;
4-5
4.1 Aufgabe 1
Versenden der Client-Anfrage (fileclient.c)
/∗ Request an Server ueber sock senden ∗/
int send_request(int ∗sock, char ∗filename)
{
clientrequest req; [...]
/∗ Request ausfuellen ∗/
req.cmd = FP_GET;
req.cmd = htonl(req.cmd);
strncpy(req.filename, filename, FP_MAXFILENAME);
}
/∗ Nachricht senden ∗/
sendMsgSize = sizeof(req);
retval = sendMsg(∗sock, (char∗)&req, &sendMsgSize);
/∗Fehlerbehandlung entsprechend retval∗/
Das direkte Versenden des struct clientrequest ist problematisch, Größe
und Alignment kann auf verschiedenen Architekturen unterschiedlich sein!
⇒ Eigenes Marshalling/Unmarshalling: clreq_to_char und
char_to_clreq-Funktionen implementieren
4-6
4.1 Aufgabe 1
Empfang der Server-Antwort (fileclient.c)
/∗ Reply vom Server ueber sock empfangen ∗/
int recv_reply(int ∗sock)
{
char buffer[BUFSIZE];
serverresponse resp;
/∗ Antwort empfangen ∗/
bytesrcvd = recv(∗sock, &resp, sizeof(resp), 0);
/∗[..] Fehlerbehandlung entsprechend bytesrcvd∗/
resp.retcode = ntohl(resp.retcode);
resp.filelen = ntohl(resp.filelen);
if(resp.retcode == FP_BADREQUEST)
err("Server responded: FP_BADREQUEST\n");
if(resp.retcode == FP_FILENOTFOUND)
err("Server responded: FP_FILENOTFOUND\n");
if(resp.retcode == FP_GENERROR)
err("Server responded: FP_GENERROR\n");
4-7
4.1 Aufgabe 1
}
/∗ Datei empfangen und ausgeben ∗/
if(resp.retcode == FP_OK)
{
while(filerecvd < resp.filelen)
{
bytesrcvd = recv(∗sock, buffer, BUFSIZE−1, 0);
if(bytesrcvd <= 0)
{
fprintf (stderr, "receiving file failed\n");
return −1;
}
buffer[bytesrcvd] = ’\0’;
fprintf (stdout, "%s", buffer);
filerecvd += bytesrcvd;
}
}
return 0;
4-8
Entwickler/User−Space
4.2 TCP/IP-Stack
Web−Browser, E−Mail,.
Andere
Anwendungen
Middleware:
CORBA, RMI
Programming Interface (Sockets)
TCP
Betriebssystem
Andere
Anwendungen
(erfordern
spezielle
Optimierung)
Appl.−Protokolle:
FTP, HTTP, SMTP, ...
Anwendung
IGMP
ICMP
RARP
ARP
Ethernet
UDP
RIP
IP
WLAN
Transport
OSPF
Vermittlung
...
ATM
Netzzugang
4-9
4.2 TCP/IP-Stack
4 Anwendungsschicht (Application Layer)
Standardisierte Protokolle für bestimme Anwendungsaufgaben (www,
E-Mail, ...)
Selbstdefinierte Protokolle für eigene Anwendungen
3 Transportschicht (Transport Layer)
Interprozesskommunikation
2 Vermittlungsschicht (Network Layer)
Adressierung
Wegewahl (Routing)
Überlastkontrolle
Segmentierung/Reassemblierung
1 Netzzugangsschicht (host to Network)
Übertragung von Bitströmen über ein Medium
Fehlerkontrolle
Zugriffsregelung
4-10
TCP/IP: Transportschicht
Aufgabe der Transportschicht:
Datentransport zwischen Prozessen
Zwei Transportprotokolle im TCP/IP-Stack:
UDP - User Datagram Protocol
Unzuverlässige Kommunikation, kein Verbergen der zugrundeliegenden
IP-Unzuverlässigkeiten
Protokollentwickler muss selbst Mechanismen zu Erreichen der
gewünschten Zuverlässigleit implementieren
TCP - Transmission Control Protocol
Expliziter Verbindungsaufbau
Erhält Absendereihenfolge von Daten
Liefert Daten garantiert aus
Welches Protokoll man einsetzt hängt von der Anwendung ab
4-11
Transportschicht: UDP-Header
0 12 345 67 890 1 23456789012345 67 89 0 1
Quell−Port
Ziel−Port
Länge
Prüfsumme
Daten . . .
4-12
Transportschicht: TCP-Header
0 1 23 4 56 7 8 9 01 2 34 56 78 90 12 34 56 7 89 01
Quell−Port
Ziel−Port
Sequenznummer
Bestätigungsnummer
Offset
1 2 3 4 5 6
nicht verw.
Fenster
Prüfsumme
Dringlich
Optionen
Füllbytes
Daten . . .
1 URG
2 ACK
3 PSH
4 RST
5 SYN
6 FIN
4-13
Transportschicht: TCP-Zustandsautomat
CLOSED
EINGABE/AUSGABE
(Anwendungsbefehlle)
(passive open)/
(active open)/SYN
timeout/RST
LISTEN
SYN/SYN,ACK
(send data)/SYN
RST/
SYN/SYN,ACK
SYN RECVD
(close)
timeout
SYN,ACK/ACK
ACK/
ESTABLISHED
(close)/FIN
SYN SENT
FIN/ACK
CLOSE WAIT
(close)/FIN
(close)/FIN
FIN WAIT−1
ACK/
FIN WAIT−2
FIN/ACK
FIN,ACK/ACK
FIN/ACK
CLOSING
LAST ACK
ACK/
ACK/
TIME WAIT
timeout
4-14
Transportschicht: TCP-Verbindungsaufbau
3-way handshake“:
”
(active open)
SYN−SENT
CLOSED
SEQ=100
CTL=SYN
LISTEN
CLOSED
(passive open)
ESTABLISHED
SEQ=300
ACK=101
CTL=SYN,ACK
SEQ=101
ACK=301
CTL=ACK
SYN−RECVD
DATA
ESTABLISHED
4-15
4.3 Linux/BSDs: Netzwerkinformationen
Anzeigen von Informationen zu Netzwerk Schnittstellen (nicht auf
Ethernet begrenzt): ifconfig
Anzeigen von Routing-Tabellen: netstat -nr
Route eines Pakets verfolgen: traceroute oder tracepath
Anzeigen des ARP-Caches: arp -a
Well-known ports: /etc/services
4-16
Herunterladen