What are the mechanisms required for a reliable UDP layer?


I've been working on writing my own networking engine for my own game development side projects. This requires the options of having unreliable, reliable, and ordered reliable messages. I have not, however, been able to identify all of the mechanisms necessary for reliable and ordered reliable protocols.

What are the required mechanisms for a reliable layer over UDP? Additional details are appreciated.

So far, I gather that these are requirements:

  • Acknowledge received messages with a sequence number.
  • Resend unacknowledged messages after a retransmission time expires.
  • Track round trip times for each destination in order to calculate an appropriate retransmission time.
  • Identify and remove duplicate packets.
  • Handle overflowing sequence numbers looping around.

This has influenced my architecture to have reliable message headers with sequences and timestamps, acknowledge messages that echo a received sequence and timestamp, a system for tracking appropriate retransmission times based on address, and a thread that a) receives messages and queues them for user receipt, b) acknowledges reliable messages, and c) retransmits unacknowledged messages with expired retransmission timers.

NOTE: Reliable UDP is not the same as TCP. Even ordered reliable UDP is not the same as TCP. I am not secretly unaware that I really want TCP. Also, before someone plays the semantics games, yes... reliable UDP is an "oxymoron". This is a layer over UDP that makes for reliable delivery.

You might like to take a look at the answers to this question: What do you use when you need reliable UDP?

I'd add 'flow control' to your list. You want to be able to control the amount of data you're sending on a particular link depending on the round trip time's you're getting or you'll flood the link and just be throwing datagrams away.