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