Quick answer: Keep UDP payloads under 1200 bytes. Length-prefix every packet (4-byte size header). For larger messages, split into chunks with a sequence number and reassemble on receive.

Multiplayer game sends a 4 KB world snapshot. Some clients miss every snapshot — their network MTU drops large packets.

The Symptom

Players on certain ISPs see network desync. Smaller messages work fine; large state updates don’t arrive.

The Fix

/// Send chunked, length-prefixed
var buf = buffer_create(2048, buffer_grow, 1);
buffer_write(buf, buffer_u32, message_id);
buffer_write(buf, buffer_u16, payload_size);
buffer_write(buf, buffer_text, payload);

var total = buffer_get_size(buf);
var CHUNK = 1100;   // safe under MTU

if (total <= CHUNK) {
    network_send_udp(socket, ip, port, buf, total);
} else {
    var chunks = ceil(total / CHUNK);
    for (var i = 0; i < chunks; ++i) {
        var chunk_buf = buffer_create(CHUNK + 8, buffer_fixed, 1);
        buffer_write(chunk_buf, buffer_u32, message_id);
        buffer_write(chunk_buf, buffer_u16, i);
        buffer_write(chunk_buf, buffer_u16, chunks);
        // copy slice
        // ...
        network_send_udp(socket, ip, port, chunk_buf, buffer_get_size(chunk_buf));
        buffer_delete(chunk_buf);
    }
}

Header carries message id + chunk index + total chunks. Receiver assembles when all chunks arrive.

Receive and Reassemble

Maintain a Dictionary keyed on message_id holding partial chunks. When all chunks present, concatenate and dispatch. Drop with timeout if some never arrive.

Verifying

Send a 4KB message. Wireshark should show 4 chunks of ~1100 bytes each. Receiver reassembles. Without chunking, a single 4KB UDP packet may not even leave certain networks.

“Length prefix. Chunk under MTU. Reassemble on receive. Big messages arrive.”

Related Issues

For buffer UTF-8, see UTF-8 buffer. For surface lost, see surface lost.

Under MTU. Sequence headers. Reassemble.