Frage zu TCP Protokoll

Hallo,

hab mir grad ne Telnet-Session per Ethereal angesehen. Immer bevor der Host Telnet-Datenpakete sendet, erfolgt ein ACK über das TCP Protokoll. Ist es im TCP Standart so geregelt, dass an dieser Stelle ein ACK erfolgen MUSS (die volle Windowinggröße wurde meiner Meinung nach net ausgeschöpft), oder hat es andere Gründe, dass ein ACK, also ein bestätigen des Emfpangs der Segmente, erfolgt? Macht soweit ja auch Sinn, sonst fängt in einem unglücklichen Fall der Host an zu senden, obwohl der Server noch net fertig war. Aber wo steht das geschrieben??? Hab mir die TCP RFC schon angeschaut…

Mfg - JENS

Hallo,

Hab mir die TCP RFC schon angeschaut…

Auch Abschnitt 3.4 von RFC 793?

Gruß,

Sebastian

Hallo,

bei dem von dir genannten Abschnitt gehts doch nur um den Verbindungsaufbau bzw. -abbau?! In meinem Fall besteht die TCP Verbindung schon… Vielleicht sollte ich anders fragen: Wann wird ein ACK gesendet, außer wenn das Window voll ausgereizt ist? Gibt es da überhaupt noch andere Fälle? Gibts vielleicht ne feste Zeit nach der eins gesendet wird, oder kann ein Protokoll eines höheren Layers darauf zugreifen, ich denke net oder?

mfg - jens

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

bei dem von dir genannten Abschnitt gehts doch nur um den
Verbindungsaufbau bzw. -abbau?! In meinem Fall besteht die TCP
Verbindung schon… Vielleicht sollte ich anders fragen: Wann
wird ein ACK gesendet, außer wenn das Window voll ausgereizt
ist? Gibt es da überhaupt noch andere Fälle? Gibts vielleicht
ne feste Zeit nach der eins gesendet wird, oder kann ein
Protokoll eines höheren Layers darauf zugreifen, ich denke net
oder?

Wie das im TCP-Layer implementiert ist weiß ich auch nicht. Aber, gerade bei Telnet, wo du nur sehr selten was tippst, ist es gut, wenn das ACK sofort zurückgeschickt wird. Das Verzögern von ACK macht ja nur bei großen Datenströmen Sinn, wenn man einige Packerl abwarten kann und dann ein Sammel-ACK schickt.

Außerdem: bei Telnet bekommst du ja das Echo von remote, und daher ist die Anzeige des getippten Buchstaben sowieso ein Packerl aus der Gegenrichtung, das dann praktischerweise gleich das ACK mitführt.

Bye
Hansi

Hi!

bei dem von dir genannten Abschnitt gehts doch nur um den
Verbindungsaufbau bzw. -abbau?! In meinem Fall besteht die TCP
Verbindung schon… Vielleicht sollte ich anders fragen: Wann
wird ein ACK gesendet, außer wenn das Window voll ausgereizt
ist? Gibt es da überhaupt noch andere Fälle? Gibts vielleicht
ne feste Zeit nach der eins gesendet wird, oder kann ein
Protokoll eines höheren Layers darauf zugreifen, ich denke net
oder?

Wie das im TCP-Layer implementiert ist weiß ich auch nicht.
Aber, gerade bei Telnet, wo du nur sehr selten was tippst, ist
es gut, wenn das ACK sofort zurückgeschickt wird. Das
Verzögern von ACK macht ja nur bei großen Datenströmen Sinn,
wenn man einige Packerl abwarten kann und dann ein Sammel-ACK
schickt.

ja, nur mir magelt es an einer guten - belegbaren - begründung :wink:

Außerdem: bei Telnet bekommst du ja das Echo von remote, und
daher ist die Anzeige des getippten Buchstaben sowieso ein
Packerl aus der Gegenrichtung, das dann praktischerweise
gleich das ACK mitführt.

das is allerdings gut zu wissen. hast du vielleicht ne idee wo ich ne detailierte übersicht über ne telnet-session finde? gut wäre es wenn net nur das procedre angesprochen wird (kenn ich ja), sondern genau auf einzelne commandos/datenpakete eingegangen wird…

Bye
Hansi

ciao - jens

Hallo,

ja, nur mir magelt es an einer guten - belegbaren - begründung
:wink:

Ähm, das ist doch gerade der Witz am TCP im Gegensatz z.B. zum UDP. Es wird ein recht großer Handshake Overhead für die daraus resultierende sichere Übertragung in Kauf genommen. Die maximale Paketlänge ist keine Begrenzung nach unten, sondern nach oben. D.h. es können und werden selbstverständlich auch erheblich kleinere Pakete verschickt.

*Jedes* empfangene Datenpaket wird mit einem ACK quittiert. Wenn dieses ACK nicht beim Sender ankommt, wird das ursprüngliche Paket nochmal geschickt. Darum eignet sich TCP prinzipiell nicht so gut für Streaming-Anwendungen. Wenn man ein Datenpaket per TCP verschicken will, können daraus durchaus 20 Pakete mit längeren Pausen auf dem Netz werden.

UDP sendet brav ein Paket nach dem anderen und kümmert sich nicht darum, ob sie auch ankommen.

Prinzipiell sieht es bei TCP so aus:

Sender Netzwerk Empfänger
=================================================

Sendet Pak. 1 ---\> (geht verloren)
Startet Timer

Timeout ACK

Sendet Pak. 1 -------------\> Ahh, ein Paket
nochmal
 ....

Am besten fängst Du nicht gleich mit den RFC an, sondern liest mal ein Buch über Computernetzwerke. Den Tanenbaum[1] oder den Comer[2] z.B. Da wird es sehr viel klarer dargestellt.

Gruß

Fritze

[1] Andrew S. Tanenbaum, Computernetzwerke, Prentice-Hall 2003
[2] Douglas E. Comer, Internetworking with TCP/IP, Band 1 – Principles, Protocols, and architecture, Prentice-Hall 2000

*Jedes* empfangene Datenpaket wird mit einem ACK quittiert.
Wenn dieses ACK nicht beim Sender ankommt, wird das
ursprüngliche Paket nochmal geschickt. Darum eignet sich TCP
prinzipiell nicht so gut für Streaming-Anwendungen. Wenn man
ein Datenpaket per TCP verschicken will, können daraus
durchaus 20 Pakete mit längeren Pausen auf dem Netz werden.

Hallo,

wo bleibt denn dabei die Flowcontrol, wenn jedes Packet bestätigt wird?

mfg - jens

Hallo,

auch,
http://de.wikipedia.org/wiki/Telnet
Da steht einiges drin, schau halt aich die Links ganz unten an, ich habs nicht angeschaut.
mfg Alex

Hallo,

wo bleibt denn dabei die Flowcontrol, wenn jedes Packet
bestätigt wird?

Was meinst Du denn mit „Flowcontrol“?

Fragt sich

Fritze

Hi!

Wie das im TCP-Layer implementiert ist weiß ich auch nicht.
Aber, gerade bei Telnet, wo du nur sehr selten was tippst, ist
es gut, wenn das ACK sofort zurückgeschickt wird. Das
Verzögern von ACK macht ja nur bei großen Datenströmen Sinn,
wenn man einige Packerl abwarten kann und dann ein Sammel-ACK
schickt.

ja, nur mir magelt es an einer guten - belegbaren - begründung
:wink:

Begründung wofür?

Außerdem: bei Telnet bekommst du ja das Echo von remote, und
daher ist die Anzeige des getippten Buchstaben sowieso ein
Packerl aus der Gegenrichtung, das dann praktischerweise
gleich das ACK mitführt.

das is allerdings gut zu wissen. hast du vielleicht ne idee wo
ich ne detailierte übersicht über ne telnet-session finde? gut
wäre es wenn net nur das procedre angesprochen wird (kenn ich
ja), sondern genau auf einzelne commandos/datenpakete
eingegangen wird…

Telnet-Session ist eine ganz einfache TCP Verbindung, _ohne_ zusätzliches Protokoll (wie das z.b. bei FTP, HTTP, … noch zusätzlich notwendig ist). D.h., wenn du

telnet mein.server.de

machst, macht der die TCP-Verbindung auf (3-way-handshake) und wartet erst mal. Sobald du eine Taste tippst (manchmal wartet er auch bis du Return drückst, das kann man einstellen) schickt er ein TCP-Packerl mit genau 1 Byte Inhalt, nämlich deiner Taste in ASCII-Code weg. Die kriegt die Gegenstelle, leitet sie an den Telnet-Server weiter (der hat irgendwelche Verbindungen, z.b. zu einem TTY vom Betriebssystem), dieses Echoed das Zeichen zurück, das geht in den TCP/IP-Stack des Servers, der packt dieses eine Zeichen (das jetzt zur Anzeige am Telnet-Client vorgesehen ist) in ein TCP-Packerl ein, tut gleich die richtige ACK-Nummer rein und schickts los.

Dein Client kriegt das Packerl mit dem Zeichen und schickt wieder eine ACK zurück. So ist das bei „remote echo“. Bei „local echo“ gibts nur je Taste 2 Packerl, wobei das ACK-Packet gar keine Daten enthält.

Woher weiß aber der TCP/IP-Stack, ob er _sofort_ ein ACK-Packerl generieren soll, ob er sowieso Nutzdaten zum Zurückschicken hat oder ob er das Window noch ausnutzen kann?

TCP/IP hat da keine expliziten Regeln. Ich denke, dass er es aber erstens aus dem TOS (Type of Service) Feld (bulk transfer, low-latency, …) und aus der Window-Size bestimmt.

@Flow Control: Die wird mit der Änderung der Window-Size gesteuert. Wenn ein Host mal ein ACK unterdrückt, dann ist es ihm schon _viel_ zu heiß um die Ohren, das wird vermieden so lange es geht. Um das zu vermeiden gibt es ECN (Explicit Congestion Negotiation), ein Mechanismus der von Routern „unterwegs“ verwendet werden kann, um explizit auf eine notwendige Verringerung der Bandbreite hinzuweisen. Ohne ECN müsste er ein Packet wegwerfen, was eine brutale Methode ist.

Leider gibts aber noch einige alte Router, die ECN nicht verstehen, darum kann man es nicht immer verwenden. :frowning:

Bye
Hansi

1 „Gefällt mir“

vielleicht kennst du es unter dem Begriff „Windowing“ Der Host bzw. Server teilt dem Gegenpart mit wieviele Segmente er sendet, bevor er eine Bestätigung über deren Empfang vom Ziel erwartet. Die Anzahl der Segmente wird in der „Window-Size“ mitgeteilt, das ist ein Feld, dass du im TCP Header findest. Neben der Sequenz, der Acknowledgenummer, der MSS (Maximum-Segment-Size) und der Länge des Datenteils des Packetes.
Das ganze is deswegen da um zum einen unnötigen Datenverkehr zu vermeiden (deswegen wundere ich mich über deine Aussage) und die Verbindung von langsamen zu schnelleren Rechnern auszugleichen.

Mfg - JENS

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke schön, sehr aufschlussreich, hast nen Stern bekommen :smile:

mfg - jens

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

vielleicht kennst du es unter dem Begriff „Windowing“ Der Host
bzw. Server teilt dem Gegenpart mit wieviele Segmente er
sendet, bevor er eine Bestätigung über deren Empfang vom Ziel
erwartet.

Meines Wissens nicht. Er teilt dem Gegenpart mit, wieviele Pakete er noch senden kann, bis der Buffer gegenüber der Anwendung voll ist (und damit keine Daten mehr angenommen werden können). Das wird Flow Control genannt, hat aber nichts mit dem Senden und Empfangen der einzelnen Pakete an sich zu tun. Ggf. muss die Gegenstelle bei WindowSize 0 warten, bis wieder etwas >0 kommt :smile:

Es geht dabei nicht darum, unnötigen Datenverkehr zu verhindern, sondern ein Buffer-Overflow gegenüber der Anwendung zu vermeiden.

Gruß

Fritze

1 „Gefällt mir“

Schande über mich, aber du hast Recht… Hab mir das eben mal durchgelesen im Web :-/ Aber ok, hab ich wieder was gelernt, danke :smile:

ciao - jens

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]