It's currently impossible to reliably implement an application layer protocol with UDP sockets in Linux. Applications can retrieve the PMTU from IP_RECVERR control messages but are unable to account for the variable size of IP and UDP headers beyond hard-coding a large enough guess. Relevant section of RFC 1122 4.1.4 UDP/APPLICATION LAYER INTERFACE The application interface to UDP MUST provide the full services of the IP/transport interface described in Section 3.4 of this document. Thus, an application using UDP needs the functions of the GET_SRCADDR(), GET_MAXSIZES(), ADVISE_DELIVPROB(), and RECV_ICMP() calls described in Section 3.4. For example, GET_MAXSIZES() can be used to learn the effective maximum UDP maximum datagram size for a particular {interface,remote host,TOS} triplet. In particular, GET_MAXSIZES() appears to be missing.