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
quelle
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 wienc
. Also wannnc
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.