Projektarbeit ” Transmission Control Protocol“
Transcription
Projektarbeit ” Transmission Control Protocol“
Institut für Informatik Lehrstuhl für Rechnerorganisation und -kommunikation bei Dr. Sommer Spezielle Techniken der Rechnerkommunikation Projektarbeit Transmission Control ” Protocol“ Eine Ausarbeitung von Alexander Keller und Maik Burandt - 13. Juni 2007 1 Inhaltsverzeichnis 1 Einleitung 1.1 TCP-Stack-Manipulation . . . . . . . . . . . . . . . . . . . . . . 1.1.1 TCP-Stack unter Linux . . . . . . . . . . . . . . . . . . . 1.1.2 TCP-Stack unter Windows . . . . . . . . . . . . . . . . . 4 4 4 5 2 Allgemeines 2.1 Vergleich: TCP/IP-Stack vs. OSI-Stack . . . . . . . . . . . . . . 7 7 3 Der TCP-Frame 10 3.1 TCP-Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2 TCP-Pseudo-Header . . . . . . . . . . . . . . . . . . . . . . . . 13 4 Verbindungen 15 4.1 Verbindungsaufbau . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.2 Datenaustausch . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.3 Verbindungsabbau . . . . . . . . . . . . . . . . . . . . . . . . . 17 5 Interne Stellgrößen 5.1 Windowsize . . . . . . . . 5.1.1 Manipulation unter 5.1.2 Manipulation unter 5.2 Retransmission Timer . . 5.2.1 Manipulation unter 5.2.2 Manipulation unter 5.3 Keep-Alive Timer . . . . . 5.3.1 Manipulation unter 5.3.2 Manipulation unter 5.4 Persistence Timer . . . . . . . . . . . Linux . . Windows . . . . . . Linux . . Windows . . . . . . Linux . . Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 21 21 22 23 24 24 24 25 25 6 TCP-Algorithmen 27 6.1 Sliding Window-Algorithmus . . . . . . . . . . . . . . . . . . . . 27 6.2 Slow-Start Algorithmus . . . . . . . . . . . . . . . . . . . . . . . 30 6.3 Nagle-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . 31 A Tools 33 A.1 EditTCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 A.1.1 Über das Programm . . . . . . . . . . . . . . . . . . . . 33 A.1.2 Das Hauptfenster . . . . . . . . . . . . . . . . . . . . . . 34 2 A.1.3 Allgemeine Optionen . . A.1.4 TCP/IP-Einstellungen . A.1.5 Ändern der Registry . . A.1.6 Aufbau einer Verbindung A.2 Wireshark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 38 39 39 41 B technische Referenz 44 B.1 sonstige Parameter unter Linux . . . . . . . . . . . . . . . . . . 44 B.2 Parameter unter Windows . . . . . . . . . . . . . . . . . . . . . 46 3 1 Einleitung Im Folgenden werden wir das Transmission Control Protocol (kurz: TCP) der Transportschicht im TCP/IP Stack beleuchten und insbesondere auf Manipulationsmöglichkeiten unter den Betriebssystemen Windows XP und Linux (Debian Knoppix 4.0 und Suse 10.2) eingehen. Wir werden grundlegende Funktionsweisen klären (Verbindungsauf- und abbau und Datenübertragung), auf technische Details eingehen (z.B. Paketaufbau, Timer und deren Berechnung) sowie Algorithmen, die in Verbindung mit dem TCP-Protokoll auftreten, erläutern. Unser grundsätzliches Vorgehen orientiert sich an der Klärung theoretischer Grundlagen eines bestimmten Aspektes mit anschließender praktischer exemplarischer Darlegung, sofern dies für uns möglich ist. Im Anhang befindet sich zudem eine Referenz, die manipulierbare Parameter unter Linux und Windows genauer beschreibt. 1.1 TCP-Stack-Manipulation 1.1.1 TCP-Stack unter Linux Der Vorteil am Linux-Betriebssystem ist, dass Änderungen am TCP-Stack dynamisch, d.h. zur Laufzeit durchführbar sind. Der Zustand wird in Variablen vermerkt, die sich alle in dem gleichen Verzeichnis befinden (/proc/sys/net/ipv4). Werte von Variablen können behandelt werden wie Dateien und demnach zum Beispiel mit cat“ oder more“ angezeigt werden. ” ” Nachteil ist, dass eventuelle Änderungen nach einem Neustart des Systems verloren gehen und so Skripte erzeugt werden müssen, die bei jedem Start die Werte ändern, wenn man diese dauerhaft erhalten möchte. Es gibt zwei Möglichkeiten eine Variablenänderung zu bewirken.1 • Benutzung des echo“ Befehls und Schreiben in die Variable durch Um” lenkung des Ausgabestroms, z.B. 1 4 in beiden Fällen sind Root-Rechte nötig $echo "5" > /proc/sys/net/ipv4/tcp_retries1 • Benutzung des Befehls sysctl“ . ” Mit der Option -a werden alle Werte aller Variablen angezeigt 2 . Geändert wird ein Wert über die Option -w, wobei zu beachten ist, dass das Wurzelverzeichnis von sysctl“ /proc/sys/ ist. Beispiel: ” sysctl -w net/ipv4/tcp_retries1=5 (äquivalent zu sysctl -w net.ipv4.tcp_retries=5) 1.1.2 TCP-Stack unter Windows Windows erlaubt leider keine dynamische Änderung von TCP-Werten. Nach einer Änderung muss das System neu gestartet werden, dafür bleiben die Änderungen jedoch dauerhaft erhalten. Die Werte stehen in der Windows-Registry unter dem Schlüssel: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ Hier befinden sich allgemeine Parameter. Spezielle Parameter sind unter weiteren Subschlüsseln zu finden. Windows erlaubt eine Unterscheidung der verwendeten Netzwerkadapter, die allerdings in der Registry nicht namentlich im Klartext aufgeführt werden, sondern durch eine ID gekennzeichnet sind. Diese ID muss vor beabsichtigten Manipulationen in Erfahrung gebracht werden, z.B. durch Suchen in der Registy unter: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\ Die Registrierung wird mit dem Programm regedit.exe“ bearbeitet, welches ” unter C:\Windows\ zu finden ist. Es ist zu beachten, dass viele der änderbaren Parameter nicht standardmäßig in der Registrierung eingetragen sind. Sind die Schlüssel nicht vorhanden, werden vom Betriebssystem die in den Treibern implementierten Standardwerte genutzt. Möchte man nicht vorhandene Schlüssel ändern, hilft nur die Konsultation der Dokumentation (www.microsoft.com) 2 Werte anderer Protokolle wie IPv4 oder IPv6 werden ebenfalls angezeigt 5 um die richtigen Registrierungspfade zu ermitteln. Auch muss der richtige Datentyp des Parameters eingestellt werden. Dies ist ebenfalls der Dokumentation zu entnehmen und ist meist D WORD“ . ” An dieser Stelle sei auf den Anhang B verwiesen (Anhang B.2, Seite 46). Eine weitere Möglichkeit zur Manipulation des TCP/IP-Stacks ist das von uns geschriebene Tool EditTCP“, auf welches später noch genauer eingegangen wird ” (Kapitel A.1, Seite 33). Für aktuelle Systeme (Windows-Vista, Windows Server Longhorn) wurde der TCP/IP-Stack neu implementiert, es entstand der Next-GenereationTCP/IP-Stack. Hier ist eine dynamische Änderung der Einstellungen möglich. [3] 6 2 Allgemeines Das Transmission Control Protocol (TCP) hat sich über die Zeit hinweg zu einem der wichtigsten Transportprotokolle in Computernetzwerken entwickelt. Es ist verbindungsorientiert und vor allem zuverlässig und bildet als Teil der Internetprotokollfamilie eine Grundlage für das sogennante Internet“ [6]. ” Der Grundstein für TCP wurde im Rahmen der Erforschung von zuverlässigen und vor allem robusten Rechnernetzwerken 1973 von Robert E. Kahn und Vinton G. Cerf gelegt. Hintergrund hierfür war das große Interesse des Militärs zu Zeiten des Kalten Krieges“ an Computernetzwerken, die auch nach einem ” Atomschlag weiter funktionieren würden. Aber auch die Verbindung von verschiedenen Netzen war ein wichtiges Kriterium. Die Entwicklung und Standardisierung des TCP-Protokolls dauerte schließlich bis 1981. Es ging das erste Request for Comments (RFC) mit der Nummer 793 hervor. Dort enthalten sind die technischen Details zum TCP-Protokoll (Paket-Aufbau, spezielle Algorithmen, Zusammenarbeit mit anderen Protokollen...) [1]. Im Laufe der Zeit kamen einige Neuerungen hinzu, die schließlich 1992 im RFC 1323 standadisiert wurden [11]. Aufgrund der frühen Standardisierung und der besonderen Eigenschaften von TCP (sichere Datenübertragung, Bidirektionalität, Überlaststeuerung...) ist dieses Protkoll sehr weit verbreitet und aus der Welt der Computernetzwerke nicht mehr wegzudenken. 2.1 Vergleich: TCP/IP-Stack vs. OSI-Stack Das wichtigste theoretische Modell eines Netzwerkstacks ist das 1983 standardisierte OSI-Schichtenmodell (ISO 7498-1), wobei OSI für Open Systems ” Interconnection“ steht [2]. Es ist ein Referenzmodell zur Beschreibung herstellerunabhängiger Kommunikationssysteme und dient diesen als Grundlage. Das OSI-Modell spezifiziert sieben Schichten, die vertikal angeordnet sind, wobei höhere Schichten die Dienste der direkt darunterliegenden Schicht nutzen. Die Funktion und Aufgabe jeder Schicht ist exakt definiert. Trotz oder gerade wegen seines klaren, aber strengen Schichtenmodelles gibt es in der Realität kaum 1:1-Implementationen des OSI-Referenzmodelles [4]. 7 Dem gegenüber steht das TCP/IP-Referenzmodell, welches bereits 1981 standardisiert wurde. Es wurde also unabhängig vom OSI-Modell entwickelt und hat sich als Quasi-Standard für die Netzwerkkomunikation durchgesetzt. Das TCP/IP-Modell besteht lediglich aus vier Schichten, die ebenfalls vertikal angeordnet sind. Abbildung 1 zeigt eine Gegenüberstellung der Schichten der beiden Modelle. Abbildung 1: OSI-Stack vs. TCP/IP-Stack Anders als beim OSI-Modell ist es beim TCP/IP-Modell möglich, dass eine Schicht unter Umgehung zwischenliegender Schichten von einer oberen Schicht genutzt wird. Dadurch arbeitet das TCP/IP-Protkoll deutlich effizienter, was ein Grund für dessen große Verbreitung ist. Weiterhin ist auch die genaue Funktion der einzelnen TCP/IP-Schichten nicht exakt vorgeschrieben. Hier ein kurzer Überblick über die vier Schichten des TCP/IP-Referenzmodelles: 8 Anwendungsschicht (OSI-Schicht 5 + 6 + 7): Diese Schicht umfasst sämtliche Protokolle, die von Anwendungsprogrammen genutzt werden. Transportschicht (OSI-Schicht 4): Die Transportschicht stellt eine Ende-zu-Ende-Verbiundung her. Auf dieser Ebene ist TCP angesiedelt. Internetschicht (OSI-Schicht 3): Diese Schicht ist für das Routing und die Weiterleitung von Paketen verantwortlich. Auf dieser Ebene ist IP angesiedelt. Netzwerkzugang (OSI-Schicht 1 + 2): Diese Schicht enthält kein vorgeschriebenes Protokoll und wird entsprechend der Netztechnik gefüllt. In der Praxis ist hier oft Ethernet anzutreffen. Man kann also sagen, dass das OSI-Modell ein sehr sauberes, gut strukturiertes und durchdachtes Modell ist, welches jedoch häufig nur für theoretische Überlegungen herangezogen wird. Das TCP/IP-Modell ist dagegen quick and ” dirty“ entstanden, um den alltäglichen Bedürfnissen gerecht zu werden. OSI ” ist Ordnung, die niemand will und TCP/IP ist Chaos, das funktioniert!“ ist ein humorvoll klingender Satz mit wahrem Hintergrund. 9 3 Der TCP-Frame Ein TCP-Frame besteht aus zwei Teilen, dem sogenannten TCP-Header und den Nutzdaten, auch Payload genannt. Der TCP-Header enthält wichtige Informationen über das TCP-Frame (Abbildung 2). Im Allgemeinen ist der TCPHeader 20 Byte groß. Diese Angabe kann jedoch aufgrund enventuell vorhandener Optionen in 4-Byte Schritten nach oben variieren. 3.1 TCP-Header Es soll hier nun kurz der Aufbau dieses Headers und die Bedeutung der einzelnen Segmente gezeigt werden. die angesprochenen Flags (URG, ACK...) sind gesetzt, wenn ihr Wert 1‘ ist. ’ 10 Abbildung 2: Der TCP-Header Source-Port (Bit 1 - 16) Dieser Eintrag im TCP-Header enthält die Portnummer des sendenden Rechners. Jede Portnummer kann auf einem Rechner nur einmal vergeben werden. Somit ist gewährleistet, dass die IP und die Portnummer eindeutig einen Verbindungsendpunkt eines Computers beschreiben. Destination-Port (Bit 17-32): Der Destination-Port ist die Portnummer des empfangenden Rechners, also der Ziel-Port. Sequence-Number (Bit 33 - 64): Die Sequenznummer ist für den Empfänger wichtig, damit er die unter Umständen in falscher Reihenfolge empfangenen Pakete sortieren kann. Im Gegensatz zu vielen anderen Protokollen werden bei TCP die einzelnen Bytes des Datenstroms nummeriert und nicht die einzelnen Pakete. Wichtig ist auch, dass eine Sequenznummer immer eindeutig einer Ver- 11 bindung zugeordnet werden kann, damit Pakete nicht falsch interpretiert werden. Hierfür gibt es verschiedene Ansätze wie zum Beispiel Abspeichern der zuletzt verwendeten Nummern oder Orientierung an einem Zeitgeber, auf die hier aber nicht näher eingegangen werden soll. Acknowledgement-Number (Bit 65 - 96): Mit der Bestätigungsnummer gibt der Empfänger die Sequenznummer des von ihm als nächsten erwarteten Bytes an. Gleichzeitig wird damit der Empfang aller Pakete bis zu dieser Sequenznummer - 1 signalisiert. Voraussetzung für die Bestätigungsnummer ist das gesetzte ACK-Flag. Data-Offset (Bit 97 - 100) Das Data-Offset gibt die Position im Paket an, an der die Nutzdaten beginnen. Diese Zahl ist ein vielfaches von 32 (Bit) und ist nötig, da die Länge der Optionen variieren kann. Mindestens steht hier jedoch 5‘, was ’ bedeutet, dass der Header 20 Byte lang ist und es somit keine Optionen gibt. reserved (Bit 101 - 106) Diese Bits werden nicht verwendet und müssen Null sein. URG (Bit 107) Das Dringlichkeits-Bit signalisiert, ob der Urgent-Pointer (s.u.) ausgewertet werden soll, was bedeutet, ob ein Teil der Daten prioritär behandelt werden soll. Ist dieses Bit gesetzt, so unterbricht die Anwendung die Abarbeitung des aktuellen TCP-Segementes und verarbeitet zunächst die dringlichen Daten. ACK (Bit 108) Ist dieses Bit gesetzt, so ist die Acknowledgement-Number gültig und es wird der Empfang von TCP-Segmenten bestätigt. Ist zusätzlich auch das SYN-Flag gesetzt, so dient dieses Bit zur Bestätigung beim Drei-Wege” Handshake“. Das Flag ist bei fast allen Übertragungen gesetzt. PSH (Bit 109) Das Setzen des Push-Bits sorgt dafür, dass Daten nicht im Puffer des Empfängers zwischengespeichert werden, sondern direkt an die Anwendung gegeben werden. Somit wird eine Verzögerung der eventuell zeitkritischen Daten verhindert. Der Nagle-Algorithmus (siehe Kapitel 6.3) wird damit ausgehebelt. 12 RST (Bit 110) Soll eine Verbindung abgebrochen werden, so ist das Reset-Bit gesetzt. SYN (Bit 111) Das SYN-Flag ist gesetzt bei der Synchronisation von Sequenznummern beim Verbindungsaufbau. Ist es gesetzt, wird der Drei-Wege-Handshake“ ” (siehe Kapitel 4.1) gestartet. FIN (Bit 112) Gibt es keine Daten mehr zu senden, so wird die Verbindung abgebaut, indem von beiden Seiten ein Paket mit gesetztem FIN-Bit gesendet wird. Window-Size (Bit 113 - 128) Damit der Empfangspuffer nicht überläuft, sendet der Empfänger hier die maximale Anzahl an Bytes, die der Sender senden darf (siehe Kapitel 5.1). Checksum (Bit 129 - 144) Aus dem TCP-Header, dem TCP-Pseudo-Header (siehe Kapitel 3.2) und den Daten wird eine Prüfsumme errechnet. Dies soll für eine bessere Zuverlässigkeit (Erkennung von Fehlern) dienen. Urgent-Pointer (Bit 145 - 160) Der Dringlichkeits-Zeiger gibt an, wo in dem Datenstrom die dringlichen Daten anfangen. Er ist nur gültig, wenn das URG-Flag gesetzt ist. Options (Bit 161 - (160 + n * 32)) Zusätzliche Optionen können hiermit ausgehandelt werden. Die Länge des Optionen-Feldes muss ein Vielfaches von 32 sein. Ist es kleiner, so wird es mit Nullen auf diese Größe aufgefüllt. Dies nennt man Padding. Mögliche Optionen sind beispielsweise, dass Erlauben eines Selective Acknowledge oder das Window Scaling (siehe Kapitel 5.1). 3.2 TCP-Pseudo-Header Der TCP-Pseudo-Header wird allein zur Sicherung der Datenintegrität und zum Schutz vor fehlgeleiteten Segmenten genutzt. 13 Abbildung 3: Der TCP-Pseudo-Header Beim Sender wird vor Berechnung der Prüfsumme das Feld Checksum“ auf ” Null gesetzt. Weiterhin wird die Byte-Länge des TCP-Segmentes überprüft. Sollte sie ungerade sein, so wird den Nutzdaten ein Null-Byte hinzugefügt (welches nicht übertragen wird) und der Pseudo-Header erzeugt (Abbildung 3). Anschließend werden die gesamten Daten in 16-Bit-Werte zerlegt, ins Einerkomplement überführt und dann addiert. Für diese Summe wird abermals das Einerkomplement berechnet und dann schließlich als Checksumme im TCPHeader gespeichert. Der TCP-Pseudo-Header wird anschließend verworfen und nicht übertragen! Der Empfänger erstellt ebenfalls den Pseudoheader und addiert die 16-BitWerte, nur dass er das Checksum“-Feld nicht auf 0 setzt. Ist sein errechne” tes Ergebnis FFFF (Hexadezimal), so wurden die Daten korrekt übertragen. Andernfalls werden die Daten verworfen. Da die Bestätigung beim Sender ausbleibt, wiederholt dieser die Übertragung. 14 4 Verbindungen 4.1 Verbindungsaufbau Der Verbindungsaufbau wird im TCP-Protokoll eher als eine Synchronisation von Sender und Empfänger verstanden. Deswegen heißt das hierfür zugehörige Flag auch SYN“ (siehe Kapitel 3). Das Protokoll benutzt einen sogenann” ten Three-Way-Handshake“, durch den Datenverlust oder sogar duplizierte ” Sitzungen vermieden werden können. Abbildung 4: TCP-Verbindungsaufbau Wie sich aus dem Namen schon ableiten lässt, besteht der Vorgang im Grunde genommen aus drei Einzelschritten. Zunächst beginnt der Client(1) ein Paket 15 zu senden, in dem das SYN-Flag (3 und 6) gesetzt ist. Mit diesem schickt er eine von ihm gewählte Startsequenznummer mit. Der Server(2) schickt seinerseits eine Startsequenznummer, bestätigt gleichzeitig die Kenntnisnahme der Sequenznummer des Clients und setzt somit in seinem Paket das ACK-Flag und das SYN-Flag(4). Zum Schluss sendet der Client nocheinmal eine Bestätigung der Sequenznummer des Servers und kann in diesem Paket bereits die ersten Daten einfügen(5). Dieses System ist gegen alle Eventualitäten abgesichert: • Das erste Paket des Clients geht verloren: Der normale RetransmissionTimer (siehe Kapitel 5.2) läuft ab und das Paket wird erneut gesendet. • Die Antwort des Servers geht verloren: Der Client vermisst die Antwort und nach Ablauf des Retransmission-Timers wird erneut gesendet. • Die Bestätigung der Sequenznummer des Servers durch den Client geht verloren: auch hier wird das Paket wegen ausbleibender Antwort neu gesendet. • Ein verzögertes Connection Request vom Client erreicht den Server: der Server weiß nicht, ob diese Anfrage eine Wiederholung oder tatsächlich ein falsches Duplikat ist und sendet einfach seine Startsequenznummer nocheinmal. Der Client erkennt den Fehler an der bereits zuvor einmal empfangenen Sequenznummer und verwirft das Paket. • Der Client erhält niemals eine Antwort: Nach endlichen Versuchen wird der Verbindungsaufbau abgebrochen und an die Anwendungsschicht gemeldet. 4.2 Datenaustausch Während des Datenaustausches werden zusätzlich zu den bereits beschriebenen Mechanismen wie Sendewiederholung oder Duplikaterkennung Prinzipien wie die Flusssteuerung (siehe Kapitel 5.1), Verwendung von Algorithmen (SlowStart (Kapitel 6.2) und Nagle-Algorithmus (Kapitel 6.3)) und weitere Timer (Keep-Alive Timer (Kapitel 5.3) und Persistence Timer (Kapitel 5.4)) eingesetzt. 16 4.3 Verbindungsabbau Beim Verbindungsabbau wird durch TCP die verlustlose Datenübertragung garantiert, indem auch hier ein Three-Way-Handshake“ verwendet wird, welches ” Graceful Close“ genannt wird. ” Zunächst sendet eine der beiden Seiten das Disconnection Request indem das FIN-Flag (siehe Kapitel 3) gesetzt wird(1).3 Die andere Seite antwortet dann, indem sie ebenfalls das FIN-Flag setzt und zusätzlich durch das ACK-Flag das FIN-Flag des Verbindungspartners bestätigt(2). Zum Schluss wird durch ein weiteres Paket des Verbindungsabbauinitierers, in dem das ACK-Flag gesetzt ist, der Verbindungsabbau bestätigt und damit beendet(3). Auch dieses Verfahren ist sehr sicher und funktioniert analog zu den Verfahren des Verbindungsaufbaus. 3 Im Beispiel ist hier auch das ACK-Flag gesetzt, was in diesem Fall aber lediglich das zuletzt gesendete Datenpaket bestätigt und hier nur aus Effizienzgründen zusammen mit dem FIN-Flag gesendet wird. 17 Abbildung 5: TCP-Verbindungsabbau 18 5 Interne Stellgrößen 5.1 Windowsize Für jede TCP-Verbindung steht ein festgelegter maximaler Speicherbereich für die empfangenen Pakete zur Verfügung, wobei die tatsächliche Größe des Fensters variabel ist. Die aktuelle Größe wird durch die sogenannte Windowsize festgelegt, welche immer kleiner als die maximale Windowsize ist [1][11]. Die Windowsize ist für den Sender der Sendekredit. Sie beschreibt also, wieviele Bytes der Sender schicken darf, bis er spätestens auf eine Antwort warten muss. Der Empfänger teilt seine Windowsize mit jedem Acknowledgement dem Sender mit, wobei die Größe davon abhängt, wieviel Speicher seines Empfangsfensters bereits belegt ist (siehe Abbildung 6) und natürlich wie groß das Fenster maximal ist. Abbildung 6: Windowsize und maximale Paketgröße ohne Header (MSS) Der Algorithmus für die Kontrolle des Datenflusses wird Sliding Window“ ” genannt und wird in Kapitel 6.1 auf Seite 27 genauer erläutert. 19 Window Scaling Die Größe der maximalen Windowsize ist durch die Struktur des TCP-Header auf 65535 Bytes begrenzt (siehe Kapitel 3.1). In Netzwerken mit einer höheren Round-Trip-Time und hoher Bandbreite kann der effektive Datendurchsatz durch eine größere Windowsize verbessert werden [5]. Damit die Fenstergröße mehr als 65535 Bytes groß sein kann, wurde die Option TCP Window Sca” le Option (WSopt)“ eingeführt [11]. Es kann nun festgelegt werden ob und mit welchem Multiplikator (Saklierungsfaktor) Window Scaling genutzt wird. Der Skalierungsfaktor ist die angegebene Zahl als Exponent zur Basis zwei. Dies kann im Stack als Shift-Operation ausgeführt werden und wird deshalb in dem RFC1323 als shift.cnt“ bezeichnet. Damit Window Scaling auch wirklich ” eingesetzt wird, müssen beide Kommunikationspartner diese Option aktiviert haben! Abbildung 7: Windowsize mit Scaling-Option Die tatsächliche Windowsize wird nun aus dem Produkt der angegebenen Windowsize eines jeden Paketes und dem im SYN-Paket mitgeteilten Skalierungsfaktor berechnet [11]. In Abbildung 7 ist ein SYN-Paket mit angegebener Windowsize und Window Scaling Optionen zu sehen. Die tatsächliche Windowsize beträgt vor der Rundung dort 2097152 statt 8192 Byte. Wird die Win- 20 dowsize auf einen Wert über 65535 Bytes gesetzt, so wird der Skalierungsfaktor nach Rundung automatisch berechnet und mit entsprechender Windowsize im TCP-Header gesendet. 5.1.1 Manipulation unter Linux Eine gewünschte Windowsize genau einzustellen ist sehr umständlich unter Linux. Zunächst ist wichtig zu wissen, dass erstellten Sockets Speicherplatz zugewiesen wird. Dieser Speicherplatz teilt sich in Speicher für die Anwendung und Speicher für das Fenster. Mit drei Variablen lässt sich die Windowsize einstellen: tcp_adv_win_scale, mit der das Verhältnis von Anwendungs- zu Fensterspeicher definiert wird, tcp_app_win, die die Größe des Anwendungsspeichers auf eine andere Art definiert und tcp_rmem, mit der die Größe des gesamten Empfangspuffers geregelt wird. Für genauere Erklärungen siehe Anhang B.1. 5.1.2 Manipulation unter Windows Für die maximale Größe der Windowsize sind die Werte TcpWindowSize und GlobalMaxTcpWindowSize verantwortlich. Hier wird die gewünschte Zahl eingetragen, wobei TcpWindowSize für jeden Netzwerkadapter anders sein kann und maximal gleich GlobalMaxTcpWindowSize sein darf. Die angegebene Windowsize wird beim zweiten Paket automatisch entprechend der genutzten Netzwerktechnologie geändert. Sie wird auf das nächste Vielfache der Maximum Segment Size (MSS) gerundet. So wird im Ethernet der Wert von 8192 auf 8760 gesetzt (Standard). Um die Option Window Scaling zu aktivieren, muss der Wert Tcp1323Opts auf 1 oder 3 gesetzt werden (wobei 3 auch Timestamps aktiviert). Abbildung 7 zeigt ein SYN-Paket ohneWindow Scaling und einer Windowsize von 17520. Abbildung 6 zeigt ein SYN-Paket mit Window Scaling und einer Windowsize von 8192 * 256 = 2097152 (was aber noch gerundet wird). 21 5.2 Retransmission Timer Der Retransmission Timer ist der wahrscheinlich wichtigste Timer im TCPProtokoll. Er gibt an, nach welcher Zeitspanne ein nicht bestätigtes Paket neu gesendet werden soll. Die Dauer richtet sich nach bereits erfolgten Misserfolgen für das spezifische Paket und liegt einem Algorithmus zu Grunde, der meist die Round-Trip-Time vergangener Pakete, also die Zeit die vom Absenden eines Paketes bis zum Empfangen der Bestätigung vergangen ist, mit in die Berechnung einbezieht. Es gibt verschiedene Ansätze den Retransmission-Timer zu berechnen. Abbildung 8: Retransmission Timeout in einer Linux Implementation von TCP 1. rekursiv über einen gewichteten Mittelwert der Round-Trip-Time: Dieser Algorithmus wird in der dem TCP Protokoll zugrundeliegenden RFC 793 beschrieben und gliedert sich in zwei Teilgleichungen (1981). RTTest = a * RTTest + (1 - a) * RTTsamp mit RTTest = geschätzte Round-Trip-Time, RTTsamp = Round-Trip-Time des letzten Paketes, a = Gewichtungsfaktor (0.8 - 0.9) Retransmission Time = b * RTTest mit b = 1,3 - 2,0 2. abhängig von der Standardabweichung D der eintreffenden Acknowledges (Jacobson 1988) D = a * D + (1 - a) * abs(RTTest - RTTsamp ) 22 3. unabhängig von RTT und Acknowledges, nach immer gleichem Schema (Karn 1987) Dass einem ankommenden Acknowledge unter Umständen ein zuvor erfolgtes Neusenden des Paketes vorausgeht, weil der Retransmission Timer kurz zuvor abgelaufen ist, ist der Nachteil bei Algorithmen, die von der Round-Trip-Time abhängig sind. Die neue Round-Trip Time wird nun falsch berechnet, da bei einem Acknowledge nicht unterschieden werden kann, zu welchem Paket es ursprünglich gehörte. Abbildung 9: Retransmission Timeout begrenzt auf 4 Wiederholungen Abhilfe schafft hier der Karn-Algorithmus, der von einer initialen Zeit für den ersten Paketverlust ausgeht, und dann bei jedem weiteren Verlust diese Zeit einfach verdoppelt. Dies ist auch die bei unserer Implementation vorherrschende Vorgehensweise (siehe Abbildung 8). 5.2.1 Manipulation unter Linux Unter Linux ist es möglich, die Anzahl der Wiederholungsversuche zu beeinflussen. Dies geschieht über die Variable tcp_retries2. Im Beispiel wurde so die Wiederholungsanzahl auf vier begrenzt (Abbildung 9). Dies regelt allerdings nur das Wiederholen von Datenpaketen. Zur Steuerung der Anzahl von Verbindungsaufbauversuchen wird dagegen die Variable tcp_syn_retries verwendet. Ebenfalls beeinflusst werden kann wie oft auf eine eingehende SYN-Anforderung reagiert werden soll, und zwar mit der Veriable tcp_synack_retries. 23 5.2.2 Manipulation unter Windows Bei Windows ist der Timer initial auf drei Sekunden gestellt und wird danach automatisch entsprechend der Situation des Netzwerkes angepasst. Es ist möglich die Anzahl der Wiederholungsversuche zu ändern. Der Parameter TcpMaxConnectRetransmissions gibt dabei die maximale Anzahl an Versuchen für eine Verbindungsanforderung (SYN) an. Ist diese überschritten, werden die Versuche abgebrochen. TcpMaxDataRetransmissions regelt hingegen die Sendewiederholungsversuche von Datenpaketen. 5.3 Keep-Alive Timer Der Keep-Alive Timer wird verwendet, um bei einer bestehenden Verbindung über die eine gewissen Zeit keine Daten mehr gesendet wurden, ein Test-Paket abzuschicken, dass zeigen soll, ob der Kommunikationspartner überhaupt noch erreichbar ist. Falls nicht, wird nach einer gewissen Anzahl von Versuchen die Verbindung geschlossen. Standardmäßig wird nach zwei Stunden mit dem Versenden von TCP-Keep-Alives begonnen. Dies wird dann alle 75 Sekunden wiederholt (siehe Abbildung 10). Abbildung 10: Keep-Alive Timeout mit 75 sekündiger Wiederholrate 5.3.1 Manipulation unter Linux Unter Linux kann man hier sehr flexibel agieren. Mit tcp_keepalive_time kann bestimmt werden, wann mit dem Versenden von Keep-Alives begonnen werden soll. Mit tcp_keepalive_intvl wird die darauf folgende Wiederholrate eingestellt und mit tcp_keepalive_probes schließlich die Anzahl der Versuche bei NichtAntwort. In unserem Beispiel sind tcp keepalive time = 1 und tcp keepalive probes = 5 (siehe Abbildung 11). 24 Abbildung 11: Retransmission Timeout mit 5 sekündiger Wiederholrate 5.3.2 Manipulation unter Windows Unter Windows gibt es zwei Parameter, die für die Keep-Alive-Einstellungen zuständig sind. Das sind KeepAliveInterval und KeepAliveTime. Der erste Parameter gibt das Zeitintervall zwischen zwei Keep-Alive-Paketen in Millisekunden an. KeepAliveTime hingegen gibt die Zeit in Millisekunden an, die bei einer Verbindung im Leerlauf vergeht, bis das erste Keep-Alive-Paket gesendet wird. Leider konnten wir die Auswirkungen nicht beobachten. 5.4 Persistence Timer Der Persistence-Timer wird gestartet, sobald ein Kommunikationspartner die Window-Size des Receiver-Windows auf 0 setzt (siehe Kapitel 5.1). Er soll sicherstellen, dass falls das Paket, dass das Fenster wieder öffnet, verloren geht, die Kommunikation nicht zum Stillstand kommt. Sollte er ablaufen, so wird ein Paket mit einer ungültigen Acknowledge-Nummer gesendet, worauf der Empfänger mit der richtigen Nummer antwortet und nebenläufig die aktuelle Window-Size mitsendet. Unter Windows wie auch unter Linux ist es uns leider nicht möglich gewesen, diesen Timer zu verändern. Man kann allerdings beobachten, dass er, zumindest bei unserem Versuch, serverseitig fast genauso wie der Retransmission Timer (siehe Kapitel 5.2) berechnet wird (bei kleinerem maximalen Timeout) und als ungültige Acknowledge-Nummer einfach die erste der Kommunikation gesendet wird ( 0‘ - siehe Abbildung 12). ’ 25 Abbildung 12: Der Persistence-Timer beim TCP 26 6 TCP-Algorithmen 6.1 Sliding Window-Algorithmus Der Sliding Window-Algorithmus ist ein Datenfluss-Algorithmus. Der Empfänger steuert damit den Datenfluss, welcher vom Sender stammt (Windowscaling/Windowsize siehe Kapitel 5.1). Der Sender weiß so immer, wieviele Daten er noch senden kann, bevor der Empfänger diese nicht mehr annimmt. Außerdem muss der Sender nun nicht mehr auf eine Bestätigung jedes einzelnen Bytes warten, bevor weitere Bytes gesendet werden, was bei großen Umlaufzeiten sehr negative Auswirkungen auf die Effizienz hätte. Abbildung 13: Sliding Window: Start (Senden Byte 1 und 2) Der Sender kann soviele Daten senden, wie er Sendekredit durch den Empfänger in einem vorherigen ACK-Paket bekommen hat. Der Empfänger kann jedoch trotzdem jedes einzelne Byte bestätigen, bevor das Empfangsfenster voll ist. Abbildung 13 zeigt den Initialzustand. Der Sender schickt nun maximal zwei Bytes mit den Nummern 1 und 2 bevor er auf eine Bestätigung warten muss. Hat der Empfänger die Daten erhalten und wurden die Sequenznummern noch nicht empfangen, so setzt er sein Fenster weiter und sendet eine Bestätigung für die erhaltenen Sequenznummern und wartet auf neue Daten (Abbildung 14). Hierbei teilt der Empfänger der Gegenseite auch wieder einen Sendekredit mit, der hier jedoch wieder 2‘ ist. Es wurden also alle Bytes verarbeitet. Der ’ Empfänger könnte hier auch nach Erhalt und Verarbeitung des ersten Bytes das Fenster um eins weiter schieben und so den neuen Sendekredit lediglich auf 1‘ setzen. ’ 27 Abbildung 14: Sliding Window: Empfang von Byte 1 und 2 Hat der Sender die Bestätigungen für die Daten erhalten, so setzt er sein Fenster entsprechend seinem Sendekredit weiter (hier wieder 2‘) und sendet ’ die neuen Daten. Sind jedoch die Bestätigungen für die Bytes verloren gegangen, so schickt der Sender die Daten nach Timer-Ablauf erneut. Der Empfänger hat jedoch sein Fenster schon verschoben und erkennt die Sequenznummern als alt. Der Empfänger bestätigt diese erneut (in der Hoffnung, dass die Acknowledgments nun den Sender erreichen). Die Verlustsituation der Daten vom Sender zum Empfänger wurde hier nicht weiter berücksichtigt, da dies bereits im Kapitel 5.2 geschehen ist. Abbildung 15: Sliding Window: Acknowledgment Byte 1 und 2 Ein Problem, welches beim Sliding Window-Algorithmus auftreten kann, ist das sogenannte Silly Window-Syndrom“. Dieses tritt auf, wenn auf Empfangs” seite der Speicher voll ist, weil die Anwendung mit der Verarbeitung nicht 28 nachkommt. Der Empfänger teilt dem Sender einen Kredit von 0‘ mit, ein so’ genanntes Zero Window“ (siehe Abbildung 16). Dort ist das Empfangsfenster ” vollgelaufen. Abbildung 16: Zero Window Verarbeitet die Anwendung nun nur sehr wenige Bytes und würde der Sendekredit für den Sender dementsprechend angepasst, so würde dieser nur sehr wenige Daten verpackt in einem großen Paket (mit Header etc.) verschicken (siehe Abbildung 17). Dies stellt natürlich einen sehr großen Overhead dar. Ist dann das Fenster wieder voll, dann wird erneut ein Zero Window geschickt. Eine Wiederholung dieses Ablaufes mindert natürlich die Effizienz. Um dies zu verhindern, wartet der Empfänger mindestens so lange mit dem Senden einer neuen Window Size, bis mindestens die MSS im Speicher frei ist [6]. 29 Abbildung 17: Silly Window-Syndrom 6.2 Slow-Start Algorithmus Der Slow-Start Algorithmus dient dazu weder den Empfänger noch das Netzwerk zu überlasten, wenn noch nicht sichergestellt werden kann, dass beide Komponenten ausreichend funktionsfähig sind. TCP verwaltet zusätzlich zum Receiver-Control Fenster (siehe Kapitel 6.1) ein Sendefenster für den Slow-Start Algorithmus, welches durch ein Segment fester Größe initialisiert wird. Das tatsächliche Sendefenster wird bestimmt durch das kleinere dieser beiden. Wie der Name des Algorithmus schon andeutet, wird eine neu aufgebaute Verbindung nur langsam belastet. Bei erfolgreichen Acknowledges des Kommunikationspartners wird die Fenstergröße solange verdoppelt, bis ein spezifischer Schwellwert erreicht wird, ab dem es immer um einen festen Wert erhöht wird. Sollte ein Acknowledge ausbleiben, also ein Retransmission-Timer zuschlagen, so beginnt der Algorithmus erneut mit der initialen Fenstergröße, wobei allerdings der Schwellwert, der das Fensterwachstum von exponentiell auf linear umschaltet, auf die halbe aktuelle Fenstergröße gesetzt wird. Dies führt allerdings dazu, dass lang anhaltende Verbindung pumpen“, d.h. ” das Fenster wird linear erhöht bis die Belastung der Verbindung zu hoch wird, das Fenster wird zurückgesetzt und dies beginnt von vorn. Ein weiterer Nachteil dieses Algorithmus ist, dass er stets davon ausgeht, dass eine ausbleibende Bestätigung auf eine Überlast des Netzwerkes zurückzuführen ist, obwohl zum Beispiel auch Übertragungsfehler insbesondere in der drahtlosen Übertragung daran Schuld sein können und die Rücksetzung des Fensters somit unnötig, ja sogar hinderlich ist. 30 6.3 Nagle-Algorithmus Mit dem Nagle-Algorithmus wird die Netzlast vermindert. Er sorgt dafür, dass Pakete mit zu kurzem Datenteil gesammelt werden, bevor sie dann zusammen in einem einzigen Paket verschickt werden. Dieses Verfahren ist allerdings bedenklich, falls prioritäre Daten oder kurze Daten, die auf eine Reaktion warten, versendet werden. In diesem Fall kann allerdings das Push-Flag“ gesetzt wer” den (siehe Kapitel 3.1), welches den Nagle-Algorithmus aushebelt und dafür sorgt, dass Daten direkt zur Anwendung hochgereicht werden. In unserem Beispiel kann man den Nagle-Algorithmus durch einen Trick zweimal hintereinander angewendet sehen. Aus einer Virtual Machine mit Windows XP heraus sendeten wir über das Programm EditTCP“ (siehe Anhang A.1) ” Pakete der Länge 1‘ . In Abbildung 18 ist zu sehen, dass diese bereits innerhalb ’ der Virtual Machine zur Länge 2 zusammengefasst wurden. Abbildung 18: der Nagle Algorithmus innerhalb der Virtual Machine Im eigentlichen Betriebssystem (wieder Windows XP) werden diese Pakete der gleichen Verbindung nocheinmal deutlich zusammengefasst, wie in der Abbildung 19 zu sehen ist. 31 Abbildung 19: der Nagle Algorithmus außerhalb der Virtual Machine 32 A Tools A.1 EditTCP A.1.1 Über das Programm Wir haben dieses C++ - Programm entwickelt, um damit möglichst einfach und schnell Parameter des TCP/IP-Stacks unter Windows (getestet unter WinXP Prof. und Vista Home Premium) zu ändern. Es macht ein aufwändiges Suchen und Editieren der Parameter der einzelnen Netzwerkadapter überflüssig. Weiterhin ist das Speichern der Einstellungen möglich. So können die Einstellungen sehr bequem auf andere Computer übertragen werden. Die Registry-Subschlüssel der einzelnen Parameter sind in einer extra Datei (config.txt) gesichert, so dass es ohne weiteres möglich ist das Programm auf andere Windows-Versionen zu portieren, bzw. falsche Pfadangaben und Werttypen zu korrigieren. Man kann mit diesem Programm auch Verbindungen aufbauen, um darüber Daten zu übertragen. So ist es möglich die veränderten Einstellungen zu testen und zum Beispiel mit Wireshark (siehe Kapitel A.2) zu analysieren. Hierfür kann EditTCP sowohl als Server, als auch als Client fungieren. Die Datenübertragung geschieht über die Socket-Funktionen accept, bind, connect, listen, select, recv, send. Genaue Beschreibungen dieser Funktionen und deren Parameter sind leicht im Internet oder in der MSDN von Microsoft [9] zu finden. Im Folgenden soll kurz die Oberfläche des Programmes erklärt werden. 33 A.1.2 Das Hauptfenster Abbildung 20: EditTCP - Das Hauptfenster - Server-Modus 34 Abbildung 21: EditTCP - Das Hauptfenster - Client-Modus Nummer 1 2 3 4 5 5a 6 7 8 9 10 11 Beschreibung zeigt die IP des Zielcomputers zeigt den Port des Zielcomputers zeigt Anzahl der aufzubauenden Verbindungen der Status der Winsock startet das Empfangen baut die Verbindung(en) auf und startet das Senden beendet das Senden oder Empfangen (je nachdem, ob Client oder Server) legt den Betriebsmodus des Programmes fest ruft die Einstellungen des Programmes auf startet den Computer neu (nach Änderungen der Registry notwendig) beendet das Programm zeigt die Verbindungen und ihre Informationen an 35 A.1.3 Allgemeine Optionen Abbildung 22: EditTCP - Allgemeine Optionen 36 Nummer 1 2 3 4 5 6 7 8 9 10 11 Beschreibung legt den Haupt-Registry-Pfad fest wenn aktiviert, werden in einer Endlosschleife zwischen 0 und der gewählten Obergrenze gesendet (Client-Modus) wenn aktiviert, wird die ausgewählte Datei gesendet (Client-Modus) legt die IP des Zielcomputers fest (ClientModus) legt den Port des Zielcomputers fest (ClientModus) legt die Anzahl der aufzubauenden Verbindungen fest (Client-Modus) legt den zu überwachenden Port fest (ServerModus) legt die Anzahl der zu überwachenden Verbindungen fest (Server-Modus) lädt vorhandene Einstellungen speichert die aktuellen Einstellungen blendet die Optionen aus 37 A.1.4 TCP/IP-Einstellungen Abbildung 23: EditTCP - TCP/IP-Einstellungen Nummer 1 2 3 4 5 38 Beschreibung Auswahl der vorhandenen Netzwerkadapter Informationen zum gewählten Adapter liest die Einstellungen des Adapters aus der Registry schreibt die Einstellungen des Adapters in die Registry Parameter des TCP/IP-Stacks A.1.5 Ändern der Registry 1. Um die Parameter des TCP/-IP-Stacks zu verändern, startet man EditTCP und klickt auf Einstellungen“. Es öffnet sich das Fenster mit den ” Optionen. 2. Man wählt nun die Registerkarte TCP-Parameter“, um zu den TCP” Parametern zu gelangen. 3. Als nächstes wählt man links oben den Netzwerkadapter, den man manipulieren möchten. Es werden nun rechts daneben Informationen zum gewählten Adapter angezeigt. 4. Nun ist es möglich die Parameter zu ändern. Jedoch kann man auch erst die aktuellen Parameter des Adapters auslesen, indem man auf Regis” try auslesen“ klickt. Die Textfelder der Parameter werden entsprechend gefüllt. Leere Textfelder bedeuten, dass die Schlüssel nicht vorhanden sind und das System Standardeinstellungen benutzt (siehe 1.1.2, Seite 5). Sollten man diese Schlüssel anlegen, wird das System diese in Zukunft nutzen. 5. Um die vorgenommenen Änderungen zu sichern, klickt man auf Registry ” schreiben“. Man beachte unbedingt, dass EditTCP in dieser Version die gemachten Einstellungen nicht überprüft! Man muss also selbst Sorge für die korrekten Werte tragen! Genaueres ist im Anhang B ab Seite 46 zu erfahren. 6. Damit die Einstellungen wirksam werden, klickt man auf Zurück“ und ” im Hauptfenster auf Windows-Neustart“. Man beachte unbedingt, dass ” man Daten vorher gespeichert hat, damit sie nicht verloren gehen! A.1.6 Aufbau einer Verbindung Für einen Datenaustausch ist es nötig zwei Instanzen von EditTCP zu starten. Dies kann, muss aber nicht auf unterschiedlichen Computern passieren. Man muss bei mehreren Computern sicherstellen, dass die IP-Adressen oder der Hostnamen bekannt sind, da diese Angaben für den Client wichtig sind. 39 Es ist zu beachten, dass einige hier verwendete Socket-Funktionen blockierend sind! Auch wenn EditTCP vorläufig nicht reagiert, heißt dies nicht zwangsläufig, dass es abgestürzt ist! Server 1. Sofern man EditTCP gestartet hat, klicken man auf Einstellungen“, um ” die Parameter für den Verbindungsaufbau festzulegen. 2. Hier findet man unter der Registerkarte Allgemein“ allgemeine Optio” nen. 3. Hier gibt man unter Server-Modus an, welcher Port auf wieviele einge” ” hende Verbindungen überwacht werden soll. 4. Nun klickt man auf Zurück“ und wählt im Hauptfenster rechts oben den ” Modus Server“ aus. ” 5. Nun kann man den Empfang durch klicken auf Empfangen starten“ star” ten. 6. Sollte kein Fehler auftreten, findet man die empfangenen Daten nach der Übertragung durchnummeriert im Verzeichnis incomming“ im Anwen” dungsverzeichnis von EditTCP. 7. Zum vorzeitigen beenden der Transmission klickt man auf Empfangen ” beenden“. Tut man dies nicht, wird die Übertragung unendlich fortgeführt oder die Datei vollständig gesendet wurde (je nach Betriebsmodus). Client 1. Sofern man EditTCP gestartet hat, klickt man auf Einstellungen“, um ” die Parameter für den Verbindungsaufbau festzulegen. 2. Hier findet man unter der Registerkarte Allgemein“ allgemeine Optio” nen. 3. Hier wählt man unter Daten zu senden“ aus, ob eine unendliche Anzahl ” von Zahlen oder eine Datei gesendet werden soll. 40 4. Nun legt man unter Client-Modus“ den Zielcomputer fest, indem man ” den Hostnamen oder die IP-Adresse in das dafür vorgesehene Textfeld einträgt. 5. Nun man unter Client-Modus“ die Portnummer ein, über welche die ” Programme kommunizieren sollen. Diese muss unbedingt im Server und Client gleich sein! 6. Man legt nun unter Client-Modus“ noch fest, wieviele Verbindungen ” aufgebaut werden sollen. Über alle Verbindungen werden die gleichen Daten gesendet. Man findet diese nach der Übertragung durchnummeriert im Verzeichnis incomming“ im Anwendungsverzeichnis des Servers. ” 7. Nun klickt man auf Zurück“ und wählet im Hauptfenster rechts oben ” den Modus Client“ aus. ” 8. Durch klicken auf Verbindung aufbauen“ werden die Verbindungen zum ” Server hergestellt. 9. Nun kann man die Übertragung durch klicken auf Senden starten“ star” ten. 10. Zum vorzeitigen beenden der Transmission klickt man auf Senden be” enden“. Tut man dies nicht, wird die Übertragung unendlich fortgeführt oder die Datei vollständig gesendet wurde (je nach Betriebsmodus). A.2 Wireshark Wireshark (ehemals Ethereal ) ist wohl eines der bekanntesten und mächtigsten Tools zur Netzwerkanalyse und soll an dieser Stelle kurz erläutert werden. Das Programm ist Open-Source und kann hier heruntergeladen werden: http://www.wireshark.org/ 41 Abbildung 24: Wireshark Wireshark umgeht mit Hilfe einer speziellen Bibliothek bzw. Treiber den Protokoll-Stack und fängt den Netzwerkverkehr ab [7]. Je nach Betriebssystem ist es die libpcap“ (Linux) oder die WinPcap“ (Windows) Bibliothek, ” ” die das zur Verfügung stellt. Es ist also möglich mit Wireshark die gesamte Netzwerkkommunikation mitzuschneiden und zu analysieren. Man kann aus allen empfangenen Paketen (siehe Abbildung 24, rot hinterlegt) ein einzelnes auswählen und dessen Details betrachten (siehe Abbildung 24, blau und gelb hinterlegt), wobei Wireshark einmal versucht die Bytes selbst Protokollen zuzuordnen und einmal alles Empfangene in hexadezimaler Schreibweise darstellt. Weiterhin bietet Wireshark eine Vielzahl von Optionen und Filtern, um ganz gezielt nach Informationen zu suchen. Auch kann das Programm spezielle Statistiken (Datendurchsatz...) erstellen. An dieser Stelle sei hiermit auf die folgende Internetseite verwiesen: http://www.nwlab.net/tutorials/ethereal/ethereal-tutorial.html 42 Dort findet man ein gutes deutschsprachiges Tutorial, welches den Einstieg in Wireshark sehr erleichtert. 43 B technische Referenz B.1 sonstige Parameter unter Linux Die Beschreibung wurde teilweise von Oskar Andreasson übernommen [10]. 1. tcp adv win scale Wert: ganze Zahl Standardwert: 2 Beschreibung: Steuert das Verhältnis von Anwendungs- zu TCP-Windowspeicher eines Sockets (Gleichung für positive Werte: 2tcp adv 1win scale , für negative Werte: 1 − 2−tcp adv1win scale , für 0: keine Reservierung). 2. tcp app win Wert: Standardwert: Beschreibung: 3. tcp fin timeout Wert: Standardwert: Beschreibung: 44 natürliche Zahl 31 Sagt dem Kernel wieviel Speicher für ein spezifisches TCP-Window verwendet werden soll window (Gleichung: 2tcp app win , für 0: keine Reservierung). natürliche Zahl 60 (Sekunden) Gibt an wie lange auf ein FIN“ des Kommu” nikationspartners gewartet werden soll, bis die eigene Verbindung beendet wird. 4. tcp mem Wert: “natürliche Zahl natürliche Zahl natürliche Zahl ” Standardwert: keiner Beschreibung: Gibt den Speicher in Speicherseiten (normalerweise 4kb) an, der dem TCP-Stack zur Verfügung steht. Der 1.Wert gibt den Speicher an, der auf jeden Fall zur Verfügung gestellt werden soll, der 2. die Grenze, ab der versucht werden soll Speicher durch Kompression zu sparen und der 3. die maximale Grenze. 5. tcp orphan retries Wert: natürliche Zahl Standardwert: 7 Beschreibung: Definiert wie oft versucht werden soll an die Gegenseite ein FIN“ zu senden, bevor bei Misser” folg die eigene Verbindung schließlich abgebaut wird. 6. tcp rmem Wert: “natürliche Zahl natürliche Zahl natürliche Zahl ” Standardwert: keiner Beschreibung: Setzt den Speicher in Byte für das Empfangsfenster wobei der 1. Wert das Minimum ist, der 2. der default (Startwert) und der 3. das Maximum. 7. tcp wmem Wert: “natürliche Zahl natürliche Zahl natürliche Zahl ” Standardwert: keiner Beschreibung: Setzt den Speicher für das Sendefenster und funktioniert ansonsten genauso wie tcp rmem. 45 B.2 Parameter unter Windows Im Folgenden werden die veränderbaren TCP-Schlüssel der Windows XP-Registry beschrieben [5]. Dabei wird jeweils kurz auf die Funktion bzw. Auswirkung des Keys und seiner Parameter eingegangen. Weiterhin wird die genaue Position angegeben. Das Ändern der Registry-Werte kann unter Umständen zu Problemen führen! Es wird daher dringend empfohlen ein Backup der Registry zu erstellen, bevor etwas geändert wird. Weiterhin wird für die Richtigkeit der folgenden Einstellungen keine Garantie übernommen. Es sei hiermit auf die entsprechende Internetseite http://support.microsoft.com/kb/ 314053/de von Microsoft verwiesen. Dort sind noch einige weitere Parameter zu finden (speziell IP-Parameter). Weiterhin gibt es viele TuningSeiten, die weitere Einstellungsmöglichkeiten aufzeigen, die nicht auf der Microsoft-Seite zu finden sind (Bsp.: [8])! 1. DatabasePath Schlüssel: Werttyp: Wert: Standardwert: Beschreibung: Tcpip\Parameters Zeichenfolge (REG EXPAND SZ) gültiger Windows NT-Dateipfad %SystemRoot%\System32\Drivers\Etc gibt Pfad zu den StandardInternetdatenbankdateien (HOSTS, LMHOSTS, NETWORKS, PROTOCOLS) an (wird von der Windows Sockets-Schnittstelle verwendet) 2. EnableDeadGWDetect Schlüssel: Tcpip\Parameters\Interfaces\Adapter-ID Werttyp: Boolescher Wert (REG DWORD) Wert: 0 oder 1 (FALSE oder TRUE) Standardwert: 1 (TRUE) Beschreibung: 1: Dead Gateway Detection eingeschaltet (wechseln auf Reservegateway, wenn Segment mehrmals ohne Rückmeldung gesendet wurde) 0: Dead Gateway Detection deaktiviert 46 3. EnablePMTUBHDetect Schlüssel: Tcpip\Parameters Werttyp: Boolescher Wert (REG DWORD) Wert: 0 oder 1 (FALSE oder TRUE) Standardwert: 0 (FALSE) Beschreibung: 1: es wird versucht Black-Hole-Router zu erkennen 0: Black-Hole-Router-Erkennung deaktiviert 4. EnablePMTUDiscovery Schlüssel: Tcpip\Parameters Werttyp: Boolescher Wert (REG DWORD) Wert: 0 oder 1 (FALSE oder TRUE) Standardwert: 1 (TRUE) Beschreibung: 1: es wird versucht die MTU entlang des Pfads zu einem Remotehost zu erkennen (mögliche Fragmentierung kann unterbunden werden) 0: MTU von 576 Byte für alle Verbindungen, die nicht zu Computern im lokalen Subnetz gehen 5. GlobalMaxTcpWindowSize Schlüssel: Tcpip\Parameters Werttyp: Zahl (REG DWORD) Wert: 0 - 65535 (mit Window-Scaling: 1073741823) Standardwert: 65535 (TRUE) Beschreibung: dies ist die maximale Windowsize für Verbindungen (TcpWindowSize kann nicht größer als dieser Parameter sein) 47 6. KeepAliveInterval Schlüssel: Tcpip\Parameters Werttyp: Zeit in Millisekunden (REG DWORD)(eventuell REG QWORD) Wert: 1 - 4294967295 Standardwert: 1000 (eine Sekunde) Beschreibung: gibt das Zeitintervall zwischen KeepaliveNeuübertragungen an 7. KeepAliveTime Schlüssel: Tcpip\Parameters Werttyp: Zeit in Millisekunden (REG DWORD)(eventuell REG QWORD) Wert: 1 - 4294967295 Standardwert: 7200000 (zwei Stunden) Beschreibung: gibt das Zeitintervall nachdem ein KeepalivePakets gesendet wird, wenn Verbindung im Leerlauf 8. MTU Schlüssel: Werttyp: Wert: Standardwert: Beschreibung: 9. Tcp1323Opts Schlüssel: Werttyp: Wert: Standardwert: Beschreibung: 48 Tcpip\Parameters\Interfaces\Adapter-ID Zahl (REG QWORD) 68 - vom Netzwerk unterstützte maximale Paketgröße 4294967295 gibt maximale Paketgröße in Byte an Tcpip\Parameters\Interfaces\Adapter-ID Zahl (REG DWORD) 0, 1, 2 oder 3 0 3: aktiviert Window-Scaling und Timestamps 2: aktiviert nur Timestamps 1: aktiviert nur Window-Scaling 0: deaktiviert Window-Scaling und Timestamps 10. TcpMaxConnectRetransmissions Schlüssel: Tcpip\Parameters Werttyp: Zahl (REG DWORD)(eventuell REG QWORD) Wert: 0 - 4294967295 Standardwert: 2 Beschreibung: gibt Anzahl der Verbindungsanforderung (SYN) an, bevor der Versuch abgebrochen wird (Zeitüberschreitungswert wird bei jeder erneuten Übertragung verdoppelt. Startwert beträgt drei Sekunden.) 11. TcpMaxDataRetransmissions Schlüssel: Tcpip\Parameters Werttyp: Zahl (REG DWORD)(eventuell REG QWORD) Wert: 0 - 4294967295 Standardwert: 5 Beschreibung: gibt Anzahl der Übertragungsversuche für einzelne Datensegmente an, bevor die Verbindung abgebrochen wird (Zeitüberschreitungswert wird bei jeder erneuten Übertragung verdoppelt. Startwert wird nach Round-Trip Time ermittelt.) 12. TcpNumConnections Schlüssel: Tcpip\Parameters Werttyp: Zahl (REG DWORD) Wert: 0 - 16777214 Standardwert: 16777214 Beschreibung: maximale Anzahl der gleichzeitig geöffneten Verbindungen 49 13. TcpRecvSegmentSize Schlüssel: Tcpip\Parameters Werttyp: Zahl (REG DWORD) Wert: 0 - 16777214 Standardwert: 1460 Beschreibung: Platz, der für die Nutzdaten zur Verfügung steht 14. TcpSendSegmentSize Schlüssel: Tcpip\Parameters Werttyp: Zahl (REG DWORD) Wert: 0 - 16777214 Standardwert: 1460 Beschreibung: Platz, der für die Nutzdaten zur Verfügung steht 15. TcpTimedWaitDelay Schlüssel: Tcpip\Parameters Werttyp: Zahl (REG DWORD) Wert: 30 - 300 Standardwert: 120 Beschreibung: Zeitdauer, die eine Verbindung im TIME WAIT-Zustand bleibt (Socketpaar kann nicht neu verwendet) 16. TcpUseRFC1122UrgentPointer Schlüssel: Tcpip\Parameters Werttyp: Boolescher Wert (REG DWORD) Wert: 0 oder 1 (FALSE oder TRUE) Standardwert: 0 (FALSE) Beschreibung: 1: für dringende Daten die RFC 1122Spezifikation 0: Modus von BSD-abgeleiteten Systemen (Berkeley Software Design) 50 17. TcpWindowSize Schlüssel: Werttyp: Wert: Standardwert: Beschreibung: 18. SackOpts Schlüssel: Werttyp: Wert: Standardwert: Beschreibung: Tcpip\Parameters\Interfaces\Adapter-ID Zahl (REG DWORD) 0 - 65535 (mit Window-Scaling: 1073741823) 16384 (abhängig von Netzwerktyp) maximale vom System angebotene TCPEmpfangsfenstergröße für eine Verbindung Tcpip\Parameters Boolescher Wert (REG DWORD) 0 oder 1 (FALSE oder TRUE) 0 (FALSE) 1: aktiviert Selective Acknowledgements 0: deaktiviert Selective Acknowledgements Es kann unter Umständen zu Problemen bei den Werttypen REG DWORD“ kommen, da der Wertebereich eventuell nich aus” reicht. Sollte dies der Fall sein, so kann der Werttyp REG QWORD“ ” Abhilfe schaffen, da dessen Wertebereich doppelt so groß ist. 51 Literatur [1] Defense Advanced Research Projects Agency Information Processing Techniques Office/Information Sciences Institute University of Southern California (Hrsg.): TRANSMISSION CONTROL PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION. September 1981. – URL http://tools.ietf.org/ html/rfc793. – Zugriffsdatum: 25.05.2007 [2] ISO/IEC (Hrsg.): Information Technology - Open Systems Interconnection - Basic Reference Model: The Basic Model. 1994. – URL http://standards.iso.org/ittf/PubliclyAvailableStandards/ s020269_ISO_IEC_7498-1_1994(E).zip [3] Microsoft Corporation (Hrsg.): Next Generation TCP/IP-Stack unter Windows Vista und Windows Server Longhorn. August 2005. – URL http://www.microsoft.com/germany/technet/datenbank/ articles/600902.mspx. – Zugriffsdatum: 21.05.2007 [4] Wikipedia (Hrsg.): OSI-Modell. Mai 2007. – URL http://de. wikipedia.org/wiki/OSI-Referenzmodell. – Zugriffsdatum: 25.05.2007 [5] Microsoft Corporation (Hrsg.): TCP/IP- und NBTKonfigurationsparameter für Windows XP. Januar 2007. – URL http://support.microsoft.com/kb/314053/de. – Zugriffsdatum: 21.05.2007 [6] Wikipedia (Hrsg.): Transmission Transport Protocol. Mai 2007. – URL http://de.wikipedia.org/wiki/Transmission_Control_Protocol. – Zugriffsdatum: 24.05.2007 [7] Loris Degioanni: WinPcap: The Windows Packet Capture Library. Januar 2007. – URL http://www.winpcap.org/. – Zugriffsdatum: 30.05.2007 [8] Matt Mathis, Raghu Reddy: Enabling High Performance Data Transfers. November 2006. – URL http://www.psc.edu/networking/ projects/tcptune/. – Zugriffsdatum: 25.05.2007 [9] Microsoft: Microsoft Developer Network Library. 2005 52 [10] Oskar Andreasson: Ipsysctl tutorial 1.0.4. 2005. – URL http:// ipsysctl-tutorial.frozentux.net/chunkyhtml/tcpvariables.html. – Zugriffsdatum: 28.05.2007 [11] V. Jacobson LBL R. Braden ISI D. Borman, Cray Research: TCP Extensions for High Performance. Mai 1992. – URL http://tools. ietf.org/html/rfc1323. – Zugriffsdatum: 25.05.2007 53 Abbildungsverzeichnis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 54 OSI-Stack vs. TCP/IP-Stack . . . . . . . . . . . Der TCP-Header . . . . . . . . . . . . . . . . . Der TCP-Pseudo-Header . . . . . . . . . . . . . TCP-Verbindungsaufbau . . . . . . . . . . . . . TCP-Verbindungsabbau . . . . . . . . . . . . . Windowsize . . . . . . . . . . . . . . . . . . . . Windowsize mit Scaling-Option . . . . . . . . . TCP-Retransmission Timeout . . . . . . . . . . TCP-Retransmission Timeout 2 . . . . . . . . . TCP-Keep-Alive Timeout . . . . . . . . . . . . TCP-Keep-Alive-Timeout 2 . . . . . . . . . . . TCP-PersistenceTimer . . . . . . . . . . . . . . Sliding Window: Start (Senden Byte 1 und 2) . Sliding Window: Empfang von Byte 1 und 2 . . Sliding Window: Acknowledgment Byte 1 und 2 Zero Window . . . . . . . . . . . . . . . . . . . Silly Window-Syndrom . . . . . . . . . . . . . . TCP-Nagle Algorithmus1 . . . . . . . . . . . . . TCP-Nagle Algorithmus2 . . . . . . . . . . . . . EditTCP - Das Hauptfenster - Server-Modus . . EditTCP - Das Hauptfenster - Client-Modus . . EditTCP - Allgemeine Optionen . . . . . . . . . EditTCP - TCP/IP-Einstellungen . . . . . . . . Wireshark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 11 14 15 18 19 20 22 23 24 25 26 27 28 28 29 30 31 32 34 35 36 38 42