After both sides have gotten a given number of acknowledgement of the acknowledgement of the acknowledgement ... of the acknowledgement: isn't it obvious that the original message was delivered?
It only takes one round-trip for both sides to be confident that the first message was received. However, the second party can't be sure the first party knows they received the message without hearing an ACK from the first party. As far as they're concerned, the first party might think it's shouting into the void. This despite the first party (hypothetically) in fact receiving the second party's ACK.
Both parties can never agree on the status of all messages, because you have to generate a new message in order for an old one to advance its state. TCP works on this principle, but because not all messages are semantically relevant to the application, it can generate extra messages to push semantically meaningful messages into the agreed-upon prefix.
On the other hand, a TCP connection must always terminate with at least one message un-ACKed. The best we can do is guarantee that there are no more application-level messages in flight.
Sort of; 1 is just as good as 100, since whether the other army is going to attack or not is still dependent on their receiving your Nth acknowledgement, and past acknowledgements don't change the confidence of its arrival.
Which brings us to the relaxed case from the OP; make it so we only need one acknowledgement, and account for the confidence level of getting that one acknowledgement.
Yeah; ultimately no matter how many levels of acknowledgement, the other army's decision to attack is predicated on receiving an acknowledgement to the most recent message, not past ones (else you don't need an acknowledgement at all). There's an inductive principle at play; even at 100 levels deep it's the same problem as the original.
Both parties can never agree on the status of all messages, because you have to generate a new message in order for an old one to advance its state. TCP works on this principle, but because not all messages are semantically relevant to the application, it can generate extra messages to push semantically meaningful messages into the agreed-upon prefix.
On the other hand, a TCP connection must always terminate with at least one message un-ACKed. The best we can do is guarantee that there are no more application-level messages in flight.