Netzwerk-Programmierung Netzwerke Alexander Sczyrba Michael Beckstette {asczyrba,mbeckste}@techfak.uni-bielefeld.de 1
Übersicht Netzwerk-Protokolle Protkollfamilie TCP/IP Transmission Control Protocol (TCP) erste Schritte mit sockets 2
vernetzte Rechner Problem: versende Daten von Rechner A zu Rechner B A und B sind (indirekt) durch Netzwerk(e) verbunden Möglichkeiten: ein Protokoll für alles Familie von spezialisierten Protokollen, die aufeinander aufbauen 3
Netzwerk-Schichten application telnet, SMTP, HTTP transport TCP, UDP network IP, ICMP link Ethernet, ARP/RARP 4
link layer modelliert physikalische Verbindung Hardware-Adressen Daten in Frames empfindlich gegenüber Störungen Prüfsummen Beispiel: Ethernet, PPP,... 5
network layer modelliert Verknüpfung von mehreren Netzwerken Packets innerhalb von Frames connectionless, unreliable, best effort routing eigener Adressraum Beispiel: Internet Protocol (IP) Domain Name System (DNS) für lesbare Adressen 6
transport layer demultiplexing, Port-Nummern well known ports, /etc/services User Datagram Protocol (UDP): ähnlich zu IP: Datagramme, connectionless, unreliable Transmission Control Protocol (TCP): Datenstrom Verbindung Zuverlässigkeit durch Quitierverfahren flow control, congestion avoidance 7
application layer nutzt transport layer TCP oder UDP hängt von Problemstellung ab Programmierschnittstellen: Berkeley sockets X/Open Transport Interface... 8
encapsulation Ethernet header IP header TCP header application header user data Ethernet trailer 9
Kommunikation zwischen Schichten Rechner 1 Rechner 2 application ftp ftp-protokoll ftp transport TCP TCP-Protokoll TCP network IP IP-Protokoll IP link Ethernet Ethernet-Protokoll Ethernet 10
Routing Rechner 1 Rechner 2 ftp-protokoll application ftp ftp transport TCP TCP-Protokoll TCP Router network IP IP-Protokoll IP IP-Protokoll IP Ethernet-Protokoll link Ethernet Ethernet Token Ring Token Ring-Protokoll Token Ring 11
Transmission Control Protocol Bestätigung von empfangenen Paketen erneuter Versand von verlorenen Paketen sequence numbers data data ACK data ACK ACK data 12
Verbindungsaufbau CLOSED SYN passive open active open SYN + ACK LISTEN ACK SYN RCVD SYN SENT ESTABLISHED 13
Verbindungsabbau FIN ACK FIN CLOSED ACK ESTABLISHED CLOSE WAIT FIN WAIT 1 CLOSING LAST ACK FIN WAIT 2 TIME WAIT 14
TCP verwenden Verbindung durch socket pair identifiziert: (IP-Adresse L, Port L, IP-Adresse R, Port R ) Verbindungsdaten anzeigen: $ netstat -f inet more... teak.tf.1023 eiche.tf.nfsd 24820 0 24820 0 ESTABLISHED teak.tf.32820 teak.tf.ldap 32768 0 32768 0 ESTABLISHED teak.tf.ldap teak.tf.32820 32768 0 32768 0 ESTABLISHED... (TF = TechFak.Uni-Bielefeld.DE) 15
Aufgaben Erzeuge eine telnet-verbindungen zu einem Rechner (z.b. von asien nach australien). Beobachte in zwei verschiedenen xterms (jeweils eines auf dem jeweiligen Rechner) die Ausgabe von netstat. Welche Einträge kommen neu hinzu? Tip: Der service heißt telnet Schließe die telnet-verbindung wieder. Wie verändert sich die Ausgabe von netstat? Es kommt je ein neuer Eintrag hinzu: teak.tf.846 teak.tf.login 32768 0 32768 3 ESTABLISHED teak.tf.login teak.tf.846 32768 2 32768 0 ESTABLISHED Dem rlogin-client wurde eine freie Port-Nummer zugewiesen, in diesem Beispiel 846. Es bleibt ein Eintrag im TIME WAIT-Zustand zurück: teak.tf.login teak.tf.846 32768 0 32768 0 TIME_WAIT Da es sich um die ehemalige Serverseite der Verbindung handelt, kann man erkennen, daß das Beenden der Verbindung vom rlogin-client initiiert wurde, dieser also der erste FIN-Segment verschickt hat. 16
Aufgaben Die Skripte server.pl und client.pl befinden sich im Archiv uebung4.tar.gz. Bei den nachfolgenden Aufgaben brauchst Du drei xterms, um alle Programme starten zu können. Starte den Server. Du mußt dabei eine Portnummer angeben: $ server.pl 54321 Sieh Dir den Zustand des Servers an: $ netstat -a grep 54321 Der Server bindet sich an den angegebenen Port und wartet auf Verbindungen: $ netstat -a grep 54321 *.54321 *.* 0 0 24576 0 LISTEN 17
Aufgaben, cont. Laß den Client Daten vom Server lesen: $ client.pl 54321 Benutze währenddessen netstat, um die Verbindung zu untersuchen. Rufe den Client zwei weitere Male auf. Was ändert sich bei jedem Aufruf? Rufe den Client mit einer festen Portnummer auf: $ client.pl 54321 55443 Wiederhole auch diesen Aufruf zweimal. Es wird eine Verbindung zwischen Client und Server aufgebaut. Der LISTEN-Eintrag bleibt erhalten: *.54321 *.* 0 0 24576 0 LISTEN localhost.56305 localhost.54321 32768 0 32768 0 ESTABLISHED localhost.54321 localhost.56305 32768 0 32768 0 ESTABLISHED Es wird eine neue Verbindung aufgebaut. Dabei verwendet der Client eine neue Port-Nummer. Die alten Verbindungen sind eventuell noch im Zustand TIME WAIT: *.54321 *.* 0 0 24576 0 LISTEN localhost.54321 localhost.56305 32768 0 32768 0 TIME_WAIT localhost.56315 localhost.54321 32768 0 32768 0 ESTABLISHED localhost.54321 localhost.56315 32768 0 32768 0 ESTABLISHED Die Port-Nummer des Clients hat den angegebenen Wert: *.54321 *.* 0 0 24576 0 LISTEN localhost.55443 localhost.54321 32768 0 32768 0 ESTABLISHED localhost.54321 localhost.55443 32768 0 32768 0 ESTABLISHED Nachdem der Client beendet ist, bleibt wieder eine Socket im Zustand TIME WAIT zurück. Diese verschwindet, sobald eine neue Verbindung mit der gleichen Port- Nummer aufgebaut wird. 18
Aufgaben, cont. Starte mehrere Clients gleichzeitig: client.pl 54321 &; client.pl 54321 &; client.pl 54321 Was ist zu beobachten? Starte zwei Clients mit der gleichen Portnummer gleichzeitig: client.pl 54321 55443 &; client.pl 54321 55443 Was passiert? Beende den Server und versuche ihn sofort mit der gleichen Portnummer neu zu starten. Was passiert? Was passiert, wenn Du den Client mit CTRL-C abbrichst, während er Daten vom Server liest? Die drei Clients arbeiten parallel. Es werden gleichzeit drei Verbindungen aufgebaut: *.54321 *.* 0 0 24576 0 LISTEN localhost.56427 localhost.54321 32768 0 32768 0 ESTABLISHED localhost.54321 localhost.56427 32768 0 32768 0 ESTABLISHED localhost.56428 localhost.54321 32768 0 32768 0 ESTABLISHED localhost.54321 localhost.56428 32768 0 32768 0 ESTABLISHED localhost.56429 localhost.54321 32768 0 32768 0 ESTABLISHED localhost.54321 localhost.56429 32768 0 32768 0 ESTABLISHED Ein Client verbindet sich mit dem Server. Der andere wird mit einer Fehlermeldung abgebrochen: can t bind socket: Address already in use at./client.pl line 19. Der Server läßt sich nicht sofort neu starten, es kommt ebenfalls die Fehlermeldung can t bind socket: Address already in use at./server.pl line 16. Erst, wenn keine Socket im TIME WAIT-Zustand mehr vorhanden ist, die den Server- Port verwendet, kann der Server erneut mit der selben Port-Nummer gestartet werden. Der Server wird beendet, in einigen Shells erscheint zusätzlich die Meldung Broken pipe. Sämtliche Verbindungen werden beendet, es bleiben keine Sockets im Zustand TIME WAIT oder einem anderen übrig. 19