si un client TCP envoie un paquet, avec un numéro de séquence de 10000 à 20000, à un serveur TCP. le TCP répondra avec un ACK avec seq_ack 20001.
si j'intercepte le paquet TCP du client, et divise le paquet en 2 segments TCP, un avec seq de 10000 à 15000, et l'autre avec seq de 15001 à 20000. Et puis ces 2 segments TCP sont envoyés au serveur TCP. Supposons que le deuxième segment soit perdu dans le chemin. Le serveur TCP répondra un ACK avec seq_ack 15001.
Maintenant, puisque le client TCP envoie un paquet intégral avec seq 10000 à 20000, mais il obtient un ACK avec 15001, du point de vue du client, c'est bizarre. Comment va-t-il réagir? En théorie, le client devrait retransmettre les octets de seq 15001 à 20000, à savoir, le client transmettra de nouveaux paquets de seq 15001. Mais qu'en est-il de la pratique, dans la mise en œuvre de la pile TCP, est-ce la même que dans la théorie?
Je pense que dans le tampon d'envoi TCP, lorsqu'un segment TCP est envoyé, le segment reste là jusqu'à l'ACK. Lorsque l'ACK arrive, ces octets pour le segment sont effacés de la mémoire tampon. Il y a un pointeur dans le tampon d'envoi, quand un ACK arrive, le pointeur pointe vers l'emplacement auquel correspond ack_seq. Les octets situés en dessous de ack_seq sont effacés. De cette façon, l'ensemble du segment n'a pas besoin d'être retransmis?
la source
La taille des segments peut (et change) au cours de la durée de vie d'une connexion. Heureusement, TCP n'a pas besoin d'enregistrer la taille de segment avec laquelle les paquets individuels ont été envoyés précédemment. Par conséquent, il fera ce qui suit:
Les deux opérations sont effectuées indépendamment de la taille du segment dans lequel ces octets ont été envoyés à l'origine. La théorie devrait donc correspondre à la plupart des implémentations.
Permettez-moi de donner quelques informations pour expliquer:
TCP utilise-t-il des octets ou des segments? Pour l'application, TCP expose une interface de flux d'octets. De plus, tous les champs d'en-tête et les variables internes sont en octets. Cependant, pour transmettre des informations, TCP les segmente en segments, car envoyer des octets un par un serait un gaspillage :-). L'utilisation de compteurs d'octets partout a l'avantage que la taille du segment n'a pas besoin de rester constante pendant la durée de vie de la connexion:
BTW: SACK n'est pas la réponse ici, car le récepteur n'utilisera (généralement) SACK que s'il reconnaît un trou dans le flux d'octets (c'est-à-dire si un paquet s'est perdu mais qu'un paquet suivant est arrivé).
la source