Alles über TCP-IP by Phyton Aufbau von TCP-IP TCP-IP ist allgemein in vier Layer (Schichten) unterteilt. Applications Layer: --------- ------ ------- ------- ----------- |Telnet | | FTP | | SMPT | | DNS | | sonstige | --------- ------ ------ ------- ----------- | | | | --------------------- -------------------- | Transport Control | | User Datagram | Transport Layer: | Protocol | | Protocol | | TCP | | UDP | --------------------- -------------------- | | ----------------------------------------------- | Internet Protocol IP | Internet Layer: | Internet Control Message Protocol ICMP | ----------------------------------------------- | | | --------- ------------ -------------- Network Layer: | X.25 | | Ethernet | | Token Ring | --------- ------------ -------------- Später mehr zu den einzelnen Layer bzw. Protokolle! Das System der Layer beruht darauf, dass ein Layer die Dienste des darunterliegenden Layers benutzen kann. Der Layer, der die Dienste in Anspruch nimmt, braucht nicht zu wissen, wie der benutzte Dienst erbracht wird, d.h. jeder Dienst hat seine eigene Aufgabe und muss sich nicht um die anderen Dienste kümmern. Daten, die von dem "Application Layer" über ein Netzwerk versendet werden, durchlaufen vom "Application Layer" ausgehend den "Transport Layer", den "Internet Layer" bis zum "Network Layer"! Jeder Layer (ausser der Application Layer) fügt dabei einen Header ein! Skizze: -------- Application Layer: | Data | -------- | ---------- -------- Transport Layer: | Header | | Data | ---------- -------- | ---------- ---------- -------- Internet Layer: | Header | | Header | | Data | ---------- ---------- -------- | ---------- ---------- ---------- -------- Network Layer: | Header | | Header | | Header | | Data | ---------- ---------- ---------- -------- Network Layer (Netzwerk Schicht) Der Netzwerk Layer bildet die unterste Schicht bei TCP-IP. Protokolle auf diesem Layer (z.B. Ethernet, Token Bus) legen fest wie ein Host an ein Netzwerk angeschlossen ist und wie die IP Pakete über dieses Netzwerk übertragen werden. Der Network Layer umfasst also die Aufgabe der Bitübertragungsschicht, Sicherungsschicht und Vermittlungsschicht. Internet Layer Einleitung: Das Internet verbindet Teilnetze miteinander. BACKBONES bilden das Rückgrat des Internet. BACKBONES werden aus Leitungen mit sehr hoher Bandbreite und schnellen Routern gebildet. An die BACKBONES sind größere Netze angeschlossen, die wiederum die LANs von ISPs, Unis, Behörden, etc... verbinden. Internet Protocol (IP) IP stellt die Basisdienste für die Datenübermittlung in TCP-IP da. Das Internet Protocol adressiert hauptsächlich Hosts und fragmentiert Datenpakete. Solche Pakete werden nach besten Bemühen übermittelt. Ob die Hosts im gleichen Netz oder in verschiedenen Netzen liegen, spielt keine Rolle. Die Ankunft der Pakete ist allerdings nicht garantiert. IP Header Ein IP Paket ist ein Datenblock mit dem Header, welcher notwendig ist, um den Datenblock zuzustellen. Der Header besteht aus einem mindestens 20 Byte großem Teil und einem optionalen Teil von variabler Länge. Bits 1 4 8 12 16 20 24 28 32 | | | | | | | | | ----------------------------------------------------------------- | | Version | Lenght | Type of Service | Total Lenght | | ----------------------------------------------------------------- H | Identification | Flags | Fragment Offset | E ----------------------------------------------------------------- A | Time to live | Protocol | Header Checksum | D ----------------------------------------------------------------- E | Source Adress | R ----------------------------------------------------------------- | | Destination Adress | | ----------------------------------------------------------------- | | Options (variable Länge) padding | | ----------------------------------------------------------------- | | Daten | ----------------------------------------------------------------- Beschreibung der IP Header Felder: Version: Enthält die Versionnr. des IP-Protokolls. Aktuelle Versionnr. ist 4. Aber Version 6 ist in Erprobung. Lenght: Lenght gibt die Länge des Headers an, da die Länge durch das Optionsfeld variabel ist. Die Länge wird in 32 Bit Worten angegeben. Kleinster Wert ist 5 (20 Byte), in diesem Fall fehlt das Optionsfeld. Der Header kann maximal 60 Bytes gross sein, das Lenghtfeld hat dann den Wert 15. Type of Service: Hier wird angegeben wie Nachrichten behandelt werden sollen. Das Feld hat normalerweise den Wert 0! 0 1 2 3 4 5 6 7 +-------+-------+-------+-------+-------+-------+-------+ | precedence | D | T | R | | | --------------------------------------------------------- Precedence (0-2 Bits): Priorität! Von 0 (normal) bis 7 (Steuerungspaket). Flags: Geben an worauf de Host am meisten Wert legen soll! D: Verzögerung (Delay) T: Durchsatz (Throughtput) R: Zuverlässigkeit (Reliability) Total Lenght: Gibt die Gesamtlänge des Datenpaketes an (max. 65.535 Bytes) Identification: Über dieses Feld wird dem Zielhost mitgeteilt, zu welchem Datengramm ein neu angekommenses Fragment gehört. Alle Fragmente eines Datengramms enthalten die gleiche Identification Nr. Die Nr. wird vom Sender vergeben. Flags (3 Bits): 1.Bit: ungenutzt 2.Bit: DF (Don't Fragment)! Datengramm darf nicht fragmentiert werden. 3.Bit: MF (More Fragments)! Datengramm besteht aus mehreren Fragmenten! Das MF Bit ist bei allen Fragmenten, ausser dem Letzten gesetzt. Fragment Offset: Bezeichnet, an welche Stelle (relativ zum Beginn des gesamten Datengramms) ein Fragment gehört. Mit diesen Angaben setzt der Zielhost das Paket wieder zusammen. Ein Datengramm kann aus maximal 8192 Fragmenten bestehen! Alle Fragmente, ausser dem letzten, müssen größer als 8 Byte sein. Time to Live: Dieses Feld ist ein Zähler mit dem die Lebensdauer eines IP-Paketes begrentzt wird. Maximalwert ist 255, also 255 Sekunden, da eine Einheit als eine Sekunde gilt. Jeder Netzknoten, den das Paket durchläuft, verringert dieses Feld um eine Stelle. Bei längeren Zwischenspeicherungen in einem Router kann der Wert auch mehrmals verringert werden. Wenn der Wert gleich 0 ist erhält der Absender eine ICMP Nachricht (mehr dazu später). Das Feld dient dazu, damit ein Paket nicht entlos im Netz umherwandert. Protocol: Enthält die Nr. des Transportprotokolls an das das Paket weitergeleitet wird. Bei UNIX Systemen in Datei /etc/protocols. z.B. 0 = IP 1 = ICMP 2 = IGMP 3 = GGP 6 = TCP 12 = PUP 17 = UDP 22 = IDP 255 = RAW Header Checksum: Prüfsumme des IP Headers! Jeder Netzknoten, den das Paket durchläuft berechnet die Header Checksum neu, da sich das TIME TO LIVE Feld bei jedem Netzknotendurchlauf verändert. Die Checksum wird aus dem 1er-Komplement der Summe aller 16-Bit Halbwörter der zu überprüfenden Daten genommen. Source/Destination Adress: Enthalten die 32 Bit langen Sender/Empfänger IP-Adressen. (später mehr). Options/Padding: Auf das Optionsfeld gehe ich hier nicht ein! Das Paddingfeld dient Füllzwecken, wenn ein Optionsfeld nicht 32 Bit lang ist. Adressesierung auf der Internet Schicht! Beim Durchlauf der vier TCP-IP Schichten werden vier verschiedene Adressen verwendet: 1.) Eine Netzwerkadresse (z.B. eine Ethernet Adresse) 2.) Eine Internet - Adresse 3.) Eine Transportprotokoll - Adresse 4.) Eine Portnummer Die Internet Adresse und die Transportprotokoll Adresse befinden sich im IP-Header. IP - Adressen Jeder Host und Router hat im Internet seine 32 Bit lange IP-Adresse. Die Netzwerkadressen werden vom NETWORK INFORMATION CENTER (NIC) vergeben. Die Adressen werden nicht einzeln zugeordnet, sondern nach Netzklassen vergeben. Wer IP - Adressen für ein Netz beantragt, erhält nicht für jeden Rechner eine Adresse, sondern einen Bereich von Adressen, den man selbst verwalten muss. Auf IP Adress Klassen gehe ich hier nicht ein! IP Adressen werden normalerweise in diesem Format geschrieben: 127.0.0.1 Die 32 Bit große Zahl wird als in 4 Bytes zerlegt, die mit Punkten voneinader getrennt sind. Beispiel: binär: 01111111111111111111111111111111 geschrieben als: 127.255.255.255 kleinste IP - Adresse ist: 0.0.0.0 größte IP - Adresse ist: 255.255.255.255 Fragmentierung Um Datengramme auf jeder Art von Netzwerk verschicken zu können, ist IP in der Lage die Größe des Datengramms an das Netzwerk anzupassen. Jeder Netzwerk gibt die maximale Paketgröße in der MTU (Maximum Transfer Unit - MTU) an. X.25 hat die MTU auf 128 Byte. Ethernet auf 1500 Byte. Jeder Host/Router/etc... muss also in der Lage sein IP Datengramme zu fragmentieren: --------------------------------------------------------------------- | IP Header | Data | --------------------------------------------------------------------- / | | \ / | | \ --------------------- --------------------- --------------------- | header | fragment | | header | fragment | | header | fragment | --------------------- --------------------- --------------------- Wie man sieht enthält jeder Fragment einen vollständigen IP Header! Durch das Identification Feld lassen sich die Fragmente wieder zusammenfügen. Die Lage eines Fragments im gesamten Datengramm wird mit dem Fragment Offset festgestellt. Internet Control Message Protocol (ICMP) ICMP ist Bestandteil jeder IP-Implementierung und hat die Aufgabe der Fehler- und Diagnoseinformation zu transportieren. ICMP wird in RFC 792 spezifiziert. Die ICMP Message wird in ein IP-Datengramm eingekapselt. Nur der Grundaufbau des ICMP-Header ist immer gleich, der Protokollkopf wechselt jedoch. Bits 1 4 8 12 16 20 24 28 32 | | | | | | | | | ------------------------------------------------------------------ | Type | Code | Checksum | ------------------------------------------------------------------ | Miscellaneaus | ------------------------------------------------------------------ | IP protocol header and further 64 Bits or test Data | ------------------------------------------------------------------ Der ICMP Header Wichtige ICMP-Nachrichtentypen: Destination Unreachable ein Netzwerk, Host, Protokoll, Port ist nicht erreichbar ein Paket kann nicht fragmentiert werden, weil das DF-Bit gesetzt ist die Source Route Option nicht erfolgreich ist Source Quench ein Host kann die gesendeten Nachrichten nicht mehr verarbeiten. Der sendende Host muss die Rate zum Aussenden von Nachrichten verringern. Parameter Problem falsche Angabe im IP-Header! Paket wird verworfen. Redirect Paket wurde falsch weitergeleitet. Sendende Host muss Route ändern. Time Exceeded Der "Time to Live" Wert im IP-Header hat den Wert 0 erreicht. ICMP verwendet IP zum Übertragen der Nachrichten, eine ICMP Nachricht wird also in ein IP-Datengramm eingekapselt! ------------------------------------------------- | IP HEADER | Datagram Daten | ------------------------------------------------- /\ ------------------------------------- | ICMP Header | ICMP Data | ------------------------------------- ICMP-Tunneling Über ICMP können auch versteckte Nachrichten übermittelt werden, das sog. "ICMP-Tunneling"! Dabei wird das Datenfeld des ICMP Paketes benutzt um Daten zu übertragen! Damit hat man zwar keinen Zugriff auf einen Rechner/Netz, allerdings ist es doch ein Bedrohung für die Sicherheit eines Netzes! Ich geh vielleicht später in einem anderen Tutorial darauf ein! Transport Layer Einleitung Über dem Internet Layer befindet sich der Transport Layer. Die wichtigsten Protokolle des Transport Layers sind TCP (Transmission Control Protocol) und das User Datagram Protocol (UDP). In diesem Text gehe ich nur auf TCP ein! Informationen über UDP gibts in RFC 768! Transmission Control Protocol (TCP) TCP stellt die Zuverlässigkeit der Datenübertragung mit dem Mechanismus Positive Acknowledgement with Re-Transmission (PAR) da. PAR sendet die zusendenden Daten so lange, bis der Empfänger das Erhalten der Daten positiv bestätigt hat. Ein Dateneinheit heißt Segment, ein Segment besteht aus einem 20 Byte große Header und den zu übertragenden Daten. In jedem Segment-Header ist eine Prüfsumme enthalten, anhand der Empfänger prüfen kann, ob die Daten fehlerfrei angekommen sind. Wenn die Daten fehlerfrei geschickt wurden, wird eine Bestätigung zurückgesendet, anderfalls wird das Segment verworfen und keine Bestätigung geschickt. Ist nach einer bestimmten Zeitperiode (timeout-period) keine Bestätigung beim Sender eingegangen wird das Segment erneut verschickt. Das TCP Segment wird in das IP-Datengramm eingefügt. IP-Datengramme mit TCP-Segmenten werden an TCP weitergeleitet. Three Way Handshake (Verbindungsaufbau) Da TCP ein verbindungsorientiertes Protokoll ist, muss vor jeder Datenübertragung ein Verbindungsaufbau statt finden. Dieser Verbindungsaufbau funktioniert über den Three Way Handshake! Three Way Handshake: --------- --------- | | SYN | | | A | ----------------------------------------------> | B | | | Sequenze Nr = X | | --------- --------- --------- --------- | | SYN, ACK | | | A | <---------------------------------------------- | B | | | Sequence Nr = Y Acknewledgement Nr. = X +1 | | --------- --------- --------- --------- | | ACK | | | A | ----------------------------------------------> | B | | | Sequence Nr = X +1 Acknewledgement Nr. = Y +1 | | --------- --------- Beschreibung des Three Way Handshakes: Im ersten Schritt sendet Host A ein Segment mit gesetztem SYN Flag im TCP Header (später mehr). Die Sequenze Nr. in diesem Segment teil Host B mit welche Sequenze Nr. von Host A verwendet wird. Im zweiten Schritt nimmt Host B die Verbindungsanforderung an, indem er das SYN und das ACK Flag im TCP Header setzt. Die Sequenze Nr. teilt Host A welche Sequenze Nr. Host B verwendet. Als Acknowledgement Nr. wird die Sequenze Nr. aus dem ersten Schritt von Host A verwendet und um 1 erhöht! Im dritten Schritt bestätigt Host A schlußendlich den Aufbau indem er das ACK Flag im TCP Header setzt. Die Sequenz Nr. ist gleich die Sequenz Nr. die in Schritt 2 von Host B erhalten wurde. Als Acknowledgment Nr. wird die gesendete Sequenz Nr. von Host B um 1 erhöht. Im dritten Schritt können bereits Daten übertragen werden. Nach diesem Vorgang ist der Verbindungsaufbau beendet und es können Daten ausgetauscht werden. Zum Beenden der Verbindung wird wieder ein Three Way Handshake mit gesetztem FIN Bit verwendet! Ports TCP leitet die Daten an die entsprechende Applikation (ftp, smtp, telnet, http) im Application Layer weiter. Zur Adressierung der Anwendungen werden auf dem Transport Layer sog. Portnumbers verwendet. Portnumbers sind 16 Bit groß, es können also bis zu 65535 verschiedene Ports je Host genutzt werden. Eine IP-Adresse zusammen mit einer Portnumber werden als SOCKET bezeichnet. Auf UNIX Systemen sind die Portnumbers in der Datei /etc/services definiert. Portnumbers bis 256 werden als well-known ports reserviert, auf ihnen laufen well-known services. Portnumbers von 256 bis 1024 werden für UNIX Dienste (z.B. rlogin) benutzt. TCP Header Bits 1 4 8 12 16 20 24 28 32 | | | | | | | | | ------------------------------------------------------------------ | | Source Port | Destination Port | | ------------------------------------------------------------------ H | Swquence Number | E ------------------------------------------------------------------ A | Acknewledgement Number | D ------------------------------------------------------------------ E | Offset|Reserved | Flags | Windows | R ------------------------------------------------------------------ | | Checksum | Urgent Pointer | | ------------------------------------------------------------------ | Option (variable Länge) | Padding | ------------------------------------------------------------------ | Daten | ------------------------------------------------------------------ TCP Header Beschreibung Source-/Destination Port Die Felder Source Port (Quellport) und Destination Port (Zielport) adressieren die Endpunkte der Verbindung. Die Größe eines der Felder beträgt 16 Bit. Sequence Number, Acknowledgement Number Die Sequence Number und die Acknowledgement Number sind jeweils 32-Bit Zahlen. Die Nummern geben die Stellung der Daten des Segments innerhalb des ausgetauschten Datenstroms an. Die Sequence Number gilt in Senderichtung, die Acknowledgement Number für Empfangsquittungen. Beim Verbindungsaufbau generiert jeder TCP-Verbindungspartner eine Sequence Number, die sich währen der Verbindung NICHT wiederholen darf. Bei der Datenübertragung wird die Sequence Nr. vom Absender jeweils um die Anzahl der bereits gesendeten Bytes erhöht. Mit der Acknowledgement Number gibt der Empfänger an, bis zu welchem Byte er die Daten bereits korrekt empfangen hat. Die Nr. gibt allerdings nicht an, welches Byte als letztes korrekt empfangen wurde, sondern welches Byte als nächstes zu erwarten ist. Offset Dieses Feld gibt die Länge des TCP-Headers in 32 Bit Worten an! Reserved Mmmhhh, was könnte das wohl heißen? Flags In diesem Feld werden die sechs 1-Bit Flags bestimmt! Das Flag Feld: 1 2 3 4 5 6 ------------- |U|A|P|R|S|F| |R|C|S|S|Y|I| |G|K|H|T|N|N| ------------- Beschreibung des Flag Feld: URG: Ist das Flag URG auf 1 gesetz, muss der Urgend Pointer beachtet werden ACK: Wird gesetzt um anzugeben, das die Acknowledgement Nr. gültig ist. Ist das Bit auf 0 gesetzt, enthält das TCP-Segment keine Bestätigung, das Feld Acknowledgement Nr. wird ignoriert! PSH: Ist das PSH-Bit gesetzt, so werden die Daten in dem entsprechenden Segment sofort bei Ankunft der adressierten Anwendung bereitgestellt ohne sie zu puffern. RST: Dieses Flag dient dazu eine Verbindung zurückzusetzen, falls ein Fehler bei Übertragung aufgetreten ist. Dies kan sowohl der Fall sein, wenn ein ungültiges Segment übertragen wurde, ein Host abgestürzt ist oder der Versuch eines Verbindungsaufbaus abegewiesen werden soll! SYN: Das SYN-Flag (Synchronize Sequence Numbers) wird verwendet, um Verbindung aufzubauen. Zusammen mit der Acknowledgement Number und dem ACK-Bit wird die Verbindung mit dem Three Way Handshake aufgebaut. FIN: Das FIN-Flag dient zum Beenden einer Verbindung. Ist das Bit gesetzt, gibt dies an, daß der Sender keine weiteren Daten zu Übertragen hat. Das Segment mit gesetztem FIN-Bit muß quittiert werden. Window Dieses Feld enthält die Anzahl der bytes, die der Empfänger ab dem bereits bestätigten Byte empfangen hat. Mit diesem Feld erfolgt die Flußsteuerung. Jede Seite einer Verbindung darf die Anzahl Bytes senden, die im Feld Window angegeben sind, ohne auf eine Quittung vom Empfänger zu warten. Checksum Die Checksum prüft den Protokollkopf, die Daten und den Pseudo Header! Pseudo Header: Bits 1 4 8 12 16 20 24 28 32 | | | | | | | | | ------------------------------------------------------------------ | Source Address | ------------------------------------------------------------------ | Destination Adress | ------------------------------------------------------------------ | 000000000 | Protocol = 6 | TCP segment lenght | ------------------------------------------------------------------ Der Algorithmus für die Checksum ist einfach: alle 16 Bit Wörter werden im 1er Komplement addiert und die Summe ermittelt. Ist das Feld nach der Berechnung nicht 16 Bit lang wird es um ein Nullbyte aufgefüllt. Führt der Empfänger des Segments die Berechnung auf das gesamte Segment aus - inkluse des Checksum Feld - sollte das Ergebnis 0 sein. Durch den Pseudo Header kann verhindert werden das falsch zugeteilte IP-Pakete erkannt werden. Urgent Pointer Der Urgent Pointer zeigt wichtige Daten in dem TCP-Segment an! Der Urgent Pointer wird gelesen wenn das URG Flag gesetzt ist! Options Optionsfeld mit variabler Länger Padding Siehe IP Have a lot of fun! by Phyton