Wenn ein TCP-Client ein Paket mit einer Sequenznummer von 10000 bis 20000 an einen TCP-Server sendet. Der TCP antwortet mit einem ACK mit seq_ack 20001.
Wenn ich das TCP-Paket vom Client abfange und das Paket in 2 TCP-Segmente aufspalte, eines mit einer Sequenz von 10000 bis 15000 und das andere mit einer Sequenz von 15001 bis 20000. Und dann werden diese 2 TCP-Segmente an den TCP-Server gesendet. Angenommen, das zweite Segment ist im Pfad verloren. Der TCP-Server antwortet mit seq_ack 15001 auf eine ACK.
Da der TCP-Client nun ein integrales Paket mit der Sequenz 10000 bis 20000 sendet, aber aus Sicht des Clients eine ACK mit 15001 erhält, ist dies seltsam. Wie wird es reagieren? Theoretisch sollte der Client die Bytes von 15001 bis 20000 erneut übertragen, dh, der Client überträgt ab 15001 neue Pakete. Wie sieht es jedoch bei der Implementierung des TCP-Stacks mit der Theorie aus?
Ich denke, im TCP-Sendepuffer, wenn ein TCP-Segment gesendet wird, bleibt das Segment immer noch dort, bis die ACK. Wenn die ACK kommt, werden diese Bytes für das Segment aus dem Puffer gelöscht. Es gibt einen Zeiger im Sendepuffer, wenn ein ACK kommt, zeigt der Zeiger auf die Stelle, an der ack_seq entspricht. Die Bytes unterhalb von ack_seq werden gelöscht. Auf diese Weise muss nicht das gesamte Segment erneut übertragen werden?