<a href="https://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol" rel="nofollow">https://en.wikipedia.org/wiki/Reliable_User_Datagram_Protoco...</a> is also a good protocol in this space.<p>Its been a decade since I worked with atou (Almost TCP over UDP) but it does work: <a href="http://www.csm.ornl.gov/~dunigan/net100/atou.html" rel="nofollow">http://www.csm.ornl.gov/~dunigan/net100/atou.html</a><p>An excellent read on how to implement reliable UDP by Craig is here: <a href="https://pdfs.semanticscholar.org/1d88/1d58d53ee530a4b4c7427af8953affe8190c.pdf" rel="nofollow">https://pdfs.semanticscholar.org/1d88/1d58d53ee530a4b4c7427a...</a>
I tell people to start with UDT when trying to improve TCP or UDP:<p><a href="http://udt.sourceforge.net/" rel="nofollow">http://udt.sourceforge.net/</a><p>Good chance they already did what you need. On supercomputers with a distributed filesystem (Sector/Sphere) at that. :)
Sadly no mention of SCTP, which, if you don't need to communicate with arbitrary hosts over the Internet, sits in a nice middleground between TCP and UDP.
TCP and UDP aren't the perfect solutions [for everything] and there's no shortage of proposed alternatives to TCP; Besides already mentioned QUIC, there's CurveCP (<a href="https://curvecp.org/" rel="nofollow">https://curvecp.org/</a>), MinimaLT (<a href="https://www.ethos-os.org/" rel="nofollow">https://www.ethos-os.org/</a>), or even more extreme Named Data Networking (<a href="http://named-data.net" rel="nofollow">http://named-data.net</a>).<p>For a background on <i>why</i> TCP is this way, look up "The Design Philosophy of the DARPA Internet Protocols", by David D. Clark, however knowing is little comfort.