c++socketsudpmina

UDP transfer is too fast, Apache Mina doesn't handle it


We decided to use UDP to send a lot of data like coordinates between:

My datagrams are only 512 Bytes max to avoid as possible the fragmentation during the transfer.

Each datagram has a header I added (with an ID inside), so that I can monitor :

The problem is that we are sending the datagrams too fast. We receive like the first ones and then have a big loss, and then get some, and big loss again. The sequence of ID datagram received is something like [1], [2], [250], [251].....

The problem is happening in local too (using localhost, 1 network card only) I do not care about losing datagrams, but here it is not about simple loss due to network (which I can deal with)

So my questions here are:

Nowadays, when we want to transfer a ~4KB coordinates info, we have to add sleep time so that we are waiting 5 minutes or more to get it to finish, it's a big issue for us knowing that we should send every minute at least 10MB coordinates informations.


Solution

  • If you want reliable transport, you should use TCP. This will let you send almost as fast as the slower of the network and the client, with no losses.

    If you want a highly optimized low-latency transport, which does not need to be reliable, you need UDP. This will let you send exactly as fast as the network can handle, but you can also send faster, or faster than the client can read, and then you'll lose packets.

    If you want reliable highly optimized low-latency transport with fine-grained control, you're going to end up implementing a custom subset of TCP on top of UDP. It doesn't sound like you could or should do this.

    ... how can I get the best settings, or socket settings

    Typically by experimentation.

    If the reason you're losing packets is because the client is slow, you need to make the client faster. Larger receive buffers only buy a fixed amount of headroom (say to soak up bursts), but if you're systematically slower any sanely-sized buffer will fill up eventually.

    Note however that this only cures excessive or avoidable drops. The various network stack layers (even without leaving a single box) are allowed to drop packets even if your client can keep up, so you still can't treat it as reliable without custom retransmit logic (and we're back to implementing TCP).

    ... way to send as much as I can without being to much?

    You need some kind of ack/nack/back-pressure/throttling/congestion/whatever message from the receiver back to the source. This is exactly the kind of thing TCP gives you for free, and which is relatively tricky to implement well yourself.

    Is it possible to reach something like 1MB/s ...

    I just saw 8MB/s using scp over loopback, so I would say yes. That uses TCP and apparently chose AES128 to encrypt and decrypt the file on the fly - it should be trivial to get equivalent performance if you're just sending plaintext.