Demander au destinataire de renvoyer un accusé de réception est la meilleure façon, même si cela "se sent maladroit". N'oubliez pas qu'IP peut diviser vos données en plusieurs paquets et les réassembler, et cela peut être fait plusieurs fois au cours d'une transmission si divers routeurs ont des MTU différents, et donc votre concept de "paquet" et TCP peuvent être en désaccord.
Il est bien préférable d'envoyer votre "paquet", qu'il s'agisse d'une chaîne, d'un objet sérialisé ou de données binaires, et de demander au destinataire de faire tout ce qu'il doit vérifier pour s'assurer qu'il est là, puis de renvoyer un accusé de réception.
Le TCP expéditeur sait quand les données sont reconnues par l'autre extrémité, mais la seule raison pour laquelle il le fait est qu'il sait quand il peut supprimer les données (parce que quelqu'un d'autre est maintenant responsable de les transmettre à l'application de l'autre côté ).
Il ne fournit généralement pas ces informations à l'application d'envoi, car (malgré les apparences) cela ne signifierait pas réellement signifier beaucoup à l'application d'envoi. L'accusé de réception ne signifie pas que l'application réceptrice a obtenu les données et en a fait quelque chose de sensé - tout cela signifie que le TCP expéditeur n'a plus à s'en soucier. Les données peuvent encore être en transit - dans un serveur proxy intermédiaire, par exemple, ou dans la pile TCP de réception.
"Données reçues avec succès" est vraiment un concept au niveau de l'application - ce que cela signifie varie en fonction de l'application (par exemple, pour de nombreuses applications, il serait logique de considérer les données "reçues" une fois qu'elles ont été synchronisées sur le disque sur le récepteur côté). Cela signifie donc que vous devez l'implémenter vous-même, car en tant que développeur d'application, vous êtes vraiment le seul en mesure de savoir comment le faire de manière sensée pour votre application.