"I'm trying to focus on how you can know when your data was received by the other side of the connection."
I think you need to know what type of application level protocol you are going to implement and what impact this has on application performance.
Take HTTP as an example of the Streaming like protocol. The server sends the data stream to the client. There is no longer an extra “ACK” application tier, and the server really doesn't care about when and how exactly its data stream arrives. This is very effective for high latency links.
Now compare this to SMB! Instead of streaming data, the data is divided into blocks. Each successfully transferred data block is marked at the application level. This gives you more control, however it effectively kills the protocol on WANs (check out “Bandwidth Delay Product”).
Given this, you can come up with your own design for your user protocol.
source share