Transportprotokolle im TCP/IP- Referenzmodell verbindungsorientiert verbindungslos HTTP FTP Telnet SMTP DNS SNMP TFTP Application TCP UDP Transport IGMP ICMP IP ARP RARP Internet Ethernet Token Ring Token Bus Wireless LAN Host-to-network TCP (Transmission Control Protocol): Zuverlässig, verbindungsorientiert. UDP (User Datagram Protocol): Datagramm-Prinzip, verbindungslos, ohne Flusskontrolle, reihenfolgerichtige Zustellung eines Paketstroms nicht garantiert. 260 Eigenschaften von TCP Verbindungsorientiert und zuverlässig (fehlerfrei, reihenfolgetreu, ohne Duplikate) Fehlerbehandlung, Quittierung, Flusskontrolle (Sliding-Window-Verfahren) Bytestrom, kein Nachrichtenstrom Segmentierung (max. Segmentgröße 64 KByte) "Urgent"-Nachrichten außerhalb der Flusskontrolle Stark beschränkte QoS Adressierung der Applikation über Portnummern Port-Nummer IP-Adresse Client 1 2 Anwendungsschicht Transportschicht Vermittlungsschicht Host-to-network- Schicht wartet auf mehreren Ports 262 TCP und UDP - Die Transportschicht A Telnet-Client IP-Netzwerk B Telnet- Transportprotokolle sind als Dienst für die Applikationsschicht verfügbar. Sie stellen eine Kommunikation zwischen Anwendungsprozessen bereit. TCP ist ein verbindungsorientiertes Protokoll TCP bestätigt die Ankunft der Pakete UDP ist ein verbindungsloses und schnelles Protokoll TCP als sichere Verbindung Falls der -Port unbekannt ist, ist die Nutzung eines Prozess-s (Initial- Connection-Protocol) möglich: Port-Nummer Client Transportschicht Anwendungsschicht Prozess- IP-Adresse Vermittlungsschicht Prozess- übergibt bestehende Verbindung an den angefragten Sicherungsschicht Bitübertragung Alternative: Namensserver (vergleichbar zur Telefonauskunft) liefert Port zurück 261 263
TCP als sichere Verbindung Erzeugt logische Verbindungen zwischen zwei Sockets: IP-Adresse + 16 Bit Port-Nummer (48 Bit Adressinformation) Sockets sind somit der Zugangspunkt einer Anwendung zum Netz Ein Socket kann für mehrere Verbindungen gleichzeitig genutzt werden TCP-Verbindungen sind immer Vollduplex- und Punkt-zu-Punkt-Verbindungen Datenpakete, die zwischen den beiden Kommunikationsstationen ausgetauscht werden, nennt man Segmente Segmente werden ausgetauscht, um o Verbindungsaufbau, o Vereinbarung der Fenstergröße, o Datentransfer, o Verschicken der Bestätigungen, o Verbindungsabbau zu realisieren 264 Socket-Primitive in TCP Zur Kommunikation via TCP existiert ein Satz Primitive, die ein Anwendungsprogrammierer verwenden kann, um die Kommunikation zu in initialisieren und durchzuführen. Im wesentlichen sind dies: Primitiv Bedeutung SOCKET Erstellung eines neuen Netzzugangspunkts BIND Verknüpfe eine lokale Adresse mit dem Socket LISTEN Warte auf ankommende Verbindungswünsche ACCEPT Nimm einen Verbindungswunsch an CONNECT Versuch eines Verbindungsaufbaus SEND Sende Daten über die Verbindung RECEIVE Empfange Daten auf der Verbindung CLOSE Freigabe der Verbindung 266 Socket-Programmierung in TCP -Seite Der Anwendungsprozess, der Anfragen entgegennimmt () muss zuerst laufen Der erstellt einen Socket, über den Verbindungsanfragen entgegengenommen werden (d.h. es wird ein Port bereitgestellt) Um Anfragen mehrerer Clients entgegennehmen zu können, erstellt der bei einem Verbindungswunsch einen neuen Socket für den Client Client-Seite Der Client erstellt einen Socket Der Client generiert eine Anfrage mit IP-Adresse und Port des s Wenn der Client seinen Socket erstellt, wird eine Verbindung zum hergestellt Socket-Programmierung in TCP (auf Host hostid) Client create socket, port=x, for incoming request: welcomesocket = Socket() TCP wait for incoming connection request Verbindungsaufbau connectionsocket = welcomesocket.accept() create socket, connect to hostid, port=x clientsocket = Socket() read request from connectionsocket send request using clientsocket write reply to connectionsocket close connectionsocket read reply from clientsocket close clientsocket 265 267
Beispiel: Java-Client (TCP) import java.io.*; import java.net.*; class TCPClient { Puffer für Benutzereingabe bereitstellen Erstelle Client- Socket, baue Verbindung auf Erstelle Datenstrom für den Socket public static void main(string argv[]) throws Exception { String sentence; String modifiedsentence; BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in)); Socket clientsocket = new Socket("hostname", 6789); CONNECT DataOutputStream outto = new DataOutputStream(clientSocket.getOutputStream()); 268 Beispiel: Java- (TCP) import java.io.*; import java.net.*; class TCP { Erstelle Default-Socket auf Port 6789 public static void main(string argv[]) throws Exception { String clientsentence; String capitalizedsentence; BIND Socket welcomesocket = new Socket(6789); Warte auf eingehende Verbindungswünsche while(true) { LISTEN Socket connectionsocket = welcomesocket.accept(); Verknüpfe Buffer mit dem Socket BufferedReader infromclient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 270 Beispiel: Java-Client (TCP) Erstelle Datenstrom aus dem Socket BufferedReader infrom = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = infromuser.readline(); Sende an den outto.writebytes(sentence + '\n'); SEND modifiedsentence = infrom.readline(); RECEIVE Empfange vom System.out.println("FROM SERVER: " + modifiedsentence); clientsocket.close(); 269 Beispiel: Java- (TCP) Verknüpfe ausgehenden Datenstrom mit dem Socket DataOutputStream outtoclient = new DataOutputStream(connectionSocket.getOutputStream()); Lesen vom Socket clientsentence = infromclient.readline(); RECEIVE capitalizedsentence = clientsentence.touppercase() + '\n'; Schreiben auf den Socket outtoclient.writebytes(capitalizedsentence); Gehe zurück, warte auf nächste Anfrage SEND 271
TCP-basierte Applikationen Routing Information Virtual Terminal World Wide Web File Transfer Electronic Mail 255 FTP telnet SMTP http BGP 20 / 21 23 25 80 179 well-known (TCP) Ports RFC 1700 Portnummer ist 16-Bit-Adresse Ports von 0 bis 255 sind für Standardanwendungen reserviert. Ports von 256 bis 65535 können von jedem Host selbst festgelegt werden 272 Der TCP-Header Source- und Destination-Port: Port-Nummer von Sender bzw. Empfänger Sequence Number/Acknowledgement Number: Segmente haben eine eigene 32 Bit Sequenz- und Bestätigungsnummer für den Fenstermechanismus zur Flusskontrolle (Sliding Window). Sequenz- und Bestätigungsnummer zählen einzelne Bytes! Die Bestätigungsnummer gibt das nächste erwartete Byte an! Sequenznummern fangen nicht notwendigerweise bei 0 an! Piggybacking, d.h. eine Quittung kann im Datenpaket mitgeschickt werden HL: Wie bei IP verfügt auch der TCP-Header über eine Angabe seiner Länge. Die Angabe erfolgt in 32-Bit-Worten. Res = Reserved. Für spätere Verwendung freigehaltene Bits. Window Size: Größe des Pufferspeichers für die Verbindung. Zusammenhang zum Fenster der Flusskontrolle: das Fenster der Flusskontrolle gibt an, wie viele Dateneinheiten gleichzeitig unbestätigt unterwegs sein dürfen die Größe des Pufferspeichers zeigt an, wie viele Dateneinheiten der Empfänger gleichzeitig speichern kann. Hierdurch wird das Fenster der Flusskontrolle angepasst. 274 Der TCP-Header 20 Byte Header zzgl. Optionen dann folgen bis zu 65.495 Datenbytes Bit Position 0 8 16 24 31 HL Res. Source Port Destination Port Sequence Number Acknowledgement Number 6 Flags Window Size Checksum Urgent Pointer Options Padding Data 273 Der TCP-Header 6 Flags: URG: URGENT. Bei Benutzung des Urgent-Pointers, z.b. bei Tastatureingaben (Ctrl-C). ACK: Bestätigungsfeld, für den Fall, dass eine Quittung mitgesendet wird. PSH: PUSH. Direkte Weiterleitung der Daten, kein Warten auf weitere Daten. RST: RESET. Rücksetzen einer Verbindung, z.b. bei einem Hostabsturz oder einer Verbindungsabweisung. ("Im allgemeinen entstehen Probleme, wenn ein Segment mit gesetztem RST-Bit empfangen wird.") SYN: auf 1 gesetzt beim Aufbau einer Verbindung FIN: auf 1 gesetzt beim Abbau einer Verbindung Urgent Pointer: gibt an, ab wo dringende Daten stehen (Byteversatz von der aktuellen Folgenummer). Options: zusätzliche Funktionen: Aushandlung von Window Scale; Verwendung von Selective Repeat statt Go-Back-n im Fehlerfall; Angabe einer Maximum Segment Size (MSS) zur Festlegung der Größe des Datenteils. 275
Der TCP-Pseudo-Header Checksum: für den Prüfsummen-Algorithmus. Dient u.a. zur Verifikation, daß das Paket an das richtige Gerät ausgeliefert worden ist. Die Prüfsumme für das Checksum-Feld wird unter Verwendung eines Pseudo- Headers berechnet. Dazu wird dem Segment durch den Sender ein Pseudo- Header vorangestellt und dann die Prüfsumme über den Pseudo-Header und den normalen Header berechnet (das Checksum-Feld ist hierbei mit 0en belegt). Die Prüfsummenberechnung erfolgt durch das 1er-Komplement der Summe aller 16- Bit-Wörter des Segments samt Pseudo-Header. Die entstehende Prüfsumme wird eingesetzt. Der Empfänger kann durch Voranstellen des Pseudo-Headers den gleichen Algorithmus ausführen und muss auf 0 kommen. Quelladresse (IP) Zieladresse (IP) 00000000 Protokoll = 6 Länge des TCP-Segments 276 1. Verbindungsaufbau Client Der wartet mittels LISTEN und ACCEPT auf eingehende Verbindungswünsche. Der Client startet unter Angabe von IP-Adresse, Portnummer und maximal akzeptabler Segment-Größe eine CONNECT-Operation. SYN, SEQ=x CONNECT sendet ein SYN. SYN, SEQ=y, ACK=x+1 Ist der Destination Port der CONNECT-Anfrage identisch zu der Port-Nummer, auf der der wartet, wird die Verbindung akzeptiert, andernfalls mit RST abgelehnt. ACK=y+1, SEQ=x+1 ungeregelter Verbindungsaufbau Client / Client / Möglicherweise versuchen zwei Rechner zur gleichen Zeit, eine Verbindung zwischen den gleichen Sockets aufzubauen. 278 Der schickt seinerseits das SYN zum Client und bestätigt zugleich den Erhalt des ersten SYN-Segments. Three-Way-Handshake Der Client schickt eine Bestätigung des SYN- Segments des s. Damit ist die Verbindung aufgebaut. 277 SYN, SEQ=x SYN, SEQ=y Verbindungen sind durch ihre Endpunkte gekennzeichnet, es wird nur eine Verbindung aufgebaut. Die Endpunkte sind eindeutig gekennzeichnet: SYN, SEQ=x, ACK=y+1 (IP-Adresse 1, Portnummer 1, IP-Adresse 2, Portnummer 2 ) 2. Datenübertragung Client Vollduplex-Betrieb Aufteilung eines Bytestroms in Segmente. Übliche Größen sind 1500, 536 oder 512 Byte; dadurch wird IP- Fragmentierung vermieden. SEQ=101, ACK=201, Data SEQ=201, ACK=102 Üblicher Quittungsmechanismus: Alle Segmente bis ACK-1 sind bestätigt. Hat der Sender vor dem Empfang eines ACKs einen Timeout, überträgt er erneut. SEQ=102, ACK=201, Data SEQ=201, ACK=110 Üblich bei fehlenden Segmenten: Go- Back-N oder Selective Repeat. 279 SYN, SEQ=y, ACK=x+1
3. Verbindungsende Client Abbau als zwei Simplex-Verbindungen Senden eines FIN-Segments Wird das FIN-Segment bestätigt, wird die Richtung 'abgeschaltet'. Die Gegenrichtung bleibt aber noch offen, hier kann noch weiter gesendet werden. FIN, SEQ=207, ACK=116 FIN, SEQ=116, ACK=208 Verwendung von Timern zum Schutz vor Paketverlust. SEQ=208, ACK=117 280 Zustände während einer TCP-Session LISTEN Zustand CLOSED SYN RVCD SYN SENT ESTABLISHED FIN WAIT 1 FIN WAIT 2 TIME WAIT CLOSING CLOSE WAIT LAST ACK Beschreibung Keine Kommunikation vorhanden/benötigt Der wartet auf einen Request Ein Request wurde empfangen und verarbeitet, warte auf das abschließende ACK des Verbindungsaufbaus Die Anwendung hat begonnen, eine Verbindung zu öffnen Verbindung aufgebaut, Datenübertragung Die Anwendung startet einen Verbindungsabbau Die andere Seite bestätigt den Verbindungsabbau Warte noch auf "verspätete" Pakete Simultaner Verbindungsabbau Die andere Seite initiiert einen Verbindungsabbau Warte noch auf verspätete Pakete 282 Die gesamte TCP-Verbindung Normaler Pfad des s ungewöhnliche Ereignisse Ereignis/Aktion-Paar Ereignis: Systemaufruf durch Benutzer, Segmentankunft, Timeout Aktion: Senden eines Steuersegments Flusssteuerung und Pufferzuweisung Die Flusssteuerung ist ähnlich zu der auf Schicht 2, nur auf Netzebene: größere Anzahl an Verbindungen Pufferung von Segmenten Neben Verlusten auch Reihefolgevertauschungen dynamische Pufferverwaltung (Anforderung von Pufferspeicher durch den Kommunikationspartner) Arbeitsweise: Sliding Window mit veränderlicher Fenstergröße: Anpassung an Pufferplatz des Empfängers und an die Netzleistung Normaler Pfad des Clients 281 283
Flusskontrolle Sliding Window Sender sendet entsprechend der Fenstergröße (Bytes) Fenster wird um n Bytes versetzt, sobald ein ACK für n Bytes eingetroffen ist Ausnahme: Dringende Daten (URGENT-Flag) werden sofort gesendet Besonderheit: die Fenstergröße kann während der Übertragungsphase geändert werden Initial window 1 2 3 4 5 6 7 8 9 10 Segment 1, 2 und 3 acknowledged Window slides 1 2 3 4 5 6 7 8 9 10 "Silly Window"-Syndrom Empfängerpuffer ist voll Anwendung liest 1 Byte Platz für noch 1 Byte Header Segment zur Fensteraktualisierung übertragen Header Neues Byte kommt an 1 Byte Empfängerpuffer ist voll Lösungsansatz von Clark: Der Empfänger muss mit der nächsten Fensteraktualisierung warten, bis der Empfängerpuffer wieder halbwegs leer ist 284 286 Sliding Window - Beispiel Anwendung schreibt 2 KB Sender Empfänger 2K SEQ = 0 Empfänger-Puffer 0 4K Leer 2K Anwendung schreibt 2 KB Sender ist blockiert ACK=2048 WIN=2048 2K SEQ = 2048 ACK=4096 WIN=0 Voll Anwendung liest 2 KB Sender kann bis zu 2 KB übertragen ACK=4096 WIN=2048 1K SEQ = 4096 2K 1K 2K 285 Ablauf einer TCP-Session Client SYN / SEQ=2999 / ACK=x / Window=2500 / MSS=1460 ACK / SEQ=3000 / ACK=2001 / Window=2500 SYN, ACK / SEQ=2000 / ACK=3000 / Window=4200 / MSS=1400 DATA 1400 Byte / SEQ=3000 / ACK=2001 / Window=2500 DATA 1400 Byte / SEQ=4400 / ACK=2001 / Window=2500 DATA 1400 Byte / SEQ=5800 / ACK=2001 / Window=2500 ACK / SEQ=2001 / ACK=4400 / Window=4200 ACK / SEQ=2001 / ACK=5800 / Window=4200 ACK / SEQ=2001 / ACK=7000 / Window=4200 DATA 1400 Byte / SEQ=7000 / ACK=2001 / Window=2500 DATA 1400 Byte / SEQ=8400 / ACK=2001 / Window=2500 ACK / SEQ=2001 / ACK=8400 / Window=4200 ACK / SEQ=2001 / ACK=9800 / Window=4200 FIN, ACK / SEQ=9800 / ACK=2001 FIN, ACK / SEQ=2001 / ACK=9801 ACK / SEQ=9801 / ACK=2002 287