Can someone please tell me what the difference in delivery of a pure ack packet and a data packet is?
The difference is just that the one contains data (application payload) while the other does not. If a packet contains data it needs to be acknowledged by the recipient. If it does not contain data it will not be acknowledged.
This means that a loss of the packet will be recognized by the sender only if the ACK is outstanding. This is not true for a pure window update.
Or in maybe more clear scenarios:
- A sends dataA to B. B sends ACK(dataA)+dataB to A.
A loss of the latter packet will be detected by B since an ACK(dataB) from A is expected.
- A sends dataA to B. B sends just an ACK without data back: ACK(dataA).
A loss of the latter packet will not be directly detected by B. But A will miss the ACK(dataA) and thus retransmit dataA, resulting in B sending ACK(dataA) again.
- B has already send ACK(dataA). It now send ACK(dataA) with just a window update and no data.
A will not detect if this packet got lost because it got ACK(dataA) before. B will not detect if this packet got lost either because it does not expect A to reply to it.