The sender is sending N packets to receiver. I want a protocol or method that guarantees delivery, each packet is received at least once. It is ok if some packets are received more than once due to retransmision ,or packets arrive out of order, as long as ALL packets eventually arrive. TCP achieves in order delivery and also has flow control mechanism. I suspect if that is an overkill or there is unnecessary overhead in my situation. What protocol should I use?
I want a good efficient protocol.
TLDR: If you are choosing between TCP and UDP, use TCP.
you wanted a "good efficient protocol". This is an excellent, robust protocol, and it is efficient when networking conditions permit efficiency, and when they don't, it will keep working when other protocols would collapse or their clients would keel over.
Your concerns about overkill are overblown, TCP is effective in all manor of environments in space and time. (Well okay maybe 1940 - present, in the inner-planets).
People often see or hear stories about how TCP doesn't work "perfectly" in a very specific situation, but TCP has evolved and prospered over the decades.
In detail, it is very complicated because networks are complicated, there are no "cliff notes" to good TCP documentation, which often ended up full sized book trilogies ("Internetworking" and "Illustrated").