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 9 user data Ethernet trailer Kommunikation zwischen Schichten Rechner 2 Rechner 1 application ftp transport TCP network IP link Ethernet ftp-Protokoll TCP-Protokoll IP-Protokoll Ethernet-Protokoll 10 ftp TCP IP Ethernet Routing Rechner 1 application transport Rechner 2 ftp-Protokoll ftp ftp TCP-Protokoll TCP TCP Router network link IP Ethernet IP-Protokoll IP-Protokoll IP Ethernet-Protokoll Token Ring-Protokoll Ethernet 11 Token Ring IP Token Ring Transmission Control Protocol • Bestätigung von empfangenen Paketen • erneuter Versand von verlorenen Paketen • sequence numbers data data ACK ACK data data ACK 12 Verbindungsaufbau CLOSED passive open SYN active open K SYN + AC 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-AdresseL , PortL , IP-AdresseR , PortR ) • Verbindungsdaten anzeigen: $ netstat -f inet | more ... teak.TF.1023 eiche.TF.nfsd teak.TF.32820 teak.TF.ldap teak.TF.ldap teak.TF.32820 ... 24820 0 32768 0 32768 0 (TF = TechFak.Uni-Bielefeld.DE) 15 24820 0 32768 0 32768 0 ESTABLISHED ESTABLISHED ESTABLISHED 16 • Es kommt je ein neuer Eintrag hinzu: teak.TF.846 teak.TF.login teak.TF.login teak.TF.846 32768 0 32768 2 32768 3 32768 0 ESTABLISHED 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. Tip: Der service heißt telnet“ ” • Schließe die telnet-Verbindung wieder. Wie verändert sich die Ausgabe von netstat? • 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? Aufgaben 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 $ netstat -a | grep 54321 *.54321 *.* 0 0 24576 0 LISTEN • Der Server bindet sich an den angegebenen Port und wartet auf Verbindungen: 17 18 • Es wird eine Verbindung zwischen Client und Server aufgebaut. Der LISTEN-Eintrag bleibt erhalten: *.54321 localhost.56305 localhost.54321 *.* localhost.54321 localhost.56305 0 0 32768 0 32768 0 24576 0 32768 0 32768 0 LISTEN ESTABLISHED 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 localhost.54321 localhost.56315 localhost.54321 *.* localhost.56305 localhost.54321 localhost.56315 0 32768 32768 32768 0 0 0 0 24576 32768 32768 32768 0 0 0 0 LISTEN TIME_WAIT ESTABLISHED ESTABLISHED • Die Port-Nummer des Clients hat den angegebenen Wert: *.54321 localhost.55443 localhost.54321 *.* localhost.54321 localhost.55443 0 0 32768 0 32768 0 24576 0 32768 0 32768 0 LISTEN ESTABLISHED 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 PortNummer aufgebaut wird. Wiederhole auch diesen Aufruf zweimal. $ client.pl 54321 55443 • Rufe den Client mit einer festen Portnummer auf: • Rufe den Client zwei weitere Male auf. Was ändert sich bei jedem Aufruf? Benutze währenddessen netstat, um die Verbindung zu untersuchen. $ client.pl 54321 • Laß den Client Daten vom Server lesen: Aufgaben, cont. 19 • Die drei Clients arbeiten parallel. Es werden gleichzeit drei Verbindungen aufgebaut: *.54321 localhost.56427 localhost.54321 localhost.56428 localhost.54321 localhost.56429 localhost.54321 *.* localhost.54321 localhost.56427 localhost.54321 localhost.56428 localhost.54321 localhost.56429 0 32768 32768 32768 32768 32768 32768 0 0 0 0 0 0 0 24576 32768 32768 32768 32768 32768 32768 0 0 0 0 0 0 0 LISTEN ESTABLISHED ESTABLISHED ESTABLISHED ESTABLISHED ESTABLISHED 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 ServerPort verwendet, kann der Server erneut mit der selben Port-Nummer gestartet werden. • Der Server wird beendet, in einigen Shells erscheint zusätzlich die Meldung Bro” ken pipe“. Sämtliche Verbindungen werden beendet, es bleiben keine Sockets im Zustand TIME WAIT oder einem anderen übrig. • Was passiert, wenn Du den Client mit CTRL-C abbrichst, während er Daten vom Server liest? • Beende den Server und versuche ihn sofort mit der gleichen Portnummer neu zu starten. Was passiert? Was passiert? client.pl 54321 55443 &; client.pl 54321 55443 • Starte zwei Clients mit der gleichen Portnummer gleichzeitig: Was ist zu beobachten? client.pl 54321 &; client.pl 54321 &; client.pl 54321 • Starte mehrere Clients gleichzeitig: Aufgaben, cont.