Was macht ein suspendierter TCP-Prozess unter Linux genau und was nicht?


0

Bezüglich TCP-Verbindungen mit NetGui (und Wireshark zum Analysieren):

Mit dem Befehl stelle ich eine TCP-Verbindung zwischen zwei PCs her nc -p 11111 etc ... für den Server und den entsprechenden für den Client, so dass sie tatsächlich Nachrichten senden und lesen konnten (in pc2 (Server)).

Danach drückte ich Strg Z in pc2 (Server sollte angehalten werden) und einige Nachrichten mit pc1 (Client) gesendet. Durch die Nutzung netstat -tna Befehl Ich kann die im Puffer wartenden Nachrichten sehen. Bevor Sie den Server wieder in den Vordergrund bringen Ich höre auf tcpdump Erfassen Sie im Router zwischen diesen beiden PCs, und stellen Sie fest, dass diese Nachrichten (wie erwartet) gesendet, aber auch vom Server bestätigt wurden.

Wenn der Server die Nachrichten beim Verlassen des Puffers bestätigt (d. H. Wenn sie verarbeitet und auf eine andere Ebene verschoben werden), wurden diese Nachrichten dann wirklich vom Server aus dem Puffer "geholt"? Wenn ja, was bedeutet es, suspendiert zu werden?

Wenn jedoch Nachrichten vor der Verarbeitung ABGEGEBEN werden, würde pc1 dann nicht glauben, dass diese Nachrichten verarbeitet wurden, und so ist der Puffer frei und sendet weiterhin Nachrichten, bis das Fenster den Wert Null erhält? Wenn ja, welche Bedeutung hat die folgende Formel?

rwnd = ReceiveBuffer - (LastByteReceived – LastByteReadByApplication)

Wo irre ich mich

Antworten:


0

TCP-Segmente werden vom TCP-Stapel im Kernel bestätigt, wenn der Kernel-TCP-Stapel sie vom NIC-Treiber empfängt. Ja, das TCP-Empfangsfenster stellt einen Puffer im Kernel dar, und wenn der Zielprozess niemals die eingehenden Daten liest, die im Kernel gepuffert wurden, füllt sich das Empfangsfenster und der Absender hört auf zu senden.

Der Absender beginnt dann mit "Nullfenstersonden". Das heißt, es werden leere TCP-Segmente gesendet, nur um den TCP-Stapel des Empfängers zum Zurücksenden von Bestätigungen mit Empfangsfensteraktualisierungen zu veranlassen, um festzustellen, ob sich ein Raum im Empfangsfenster geöffnet hat, sodass der Absender erneut senden kann. Sobald der Zielprozess einige der Daten, die der Kernel für ihn gepuffert hat, endgültig gelesen hat, führt die nächste Nullfenstersonde des Absenders zu einer Bestätigung mit einer Aktualisierung des Empfangsfensters, die den Platz im Empfangsfenster anzeigt, sodass der Absender das Senden der Nutzdaten fortsetzt TCP-Segmente.


Danke, Spiff, dass du geantwortet hast. Im Grunde liest der Server die eingehenden Nachrichten nicht, da er sich in einem angehaltenen Zustand befindet, aber er akzeptiert diese Nachrichten (sogar in angehaltenem Zustand?) Und dies würde schließlich zu einer Fensterfüllung führen. Wäre das richtig?
Pablo

Der Server verarbeiten (netcat / nc in deinem Beispiel) Acks nie etwas, auch wenn es läuft. TCP-Bestätigungen liegen immer in der ausschließlichen Verantwortung des TCP / IP-Stacks im Kernel. Es liegt niemals in der Verantwortung von Prozessen wie nc. Also wann nc wird angehalten, es kann nicht read () auf dem TCP-Socket aufrufen, auf dem es lauscht, so dass die dafür im Kernel gepufferten Daten aufgebaut werden, bis das Empfangsfenster des Kernels für diese Verbindung vollständig gefüllt ist.
Spiff

Verstanden. Großartige Arbeit und viel Glück, Spiff
Pablo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.