When an application calls send on a UDP socket, the operating system wraps the data in an 8-byte UDP header, hands it to the IP layer, and the packet goes out on the wire. There is no SYN/SYN-ACK/ACK handshake like TCP does before sending data, so the very first packet already carries real payload. This is why a DNS lookup over UDP can complete in a single round trip.
The receiver's OS looks at the destination port to figure out which socket should get the datagram, verifies the checksum, and delivers the payload to whatever process is listening. If the checksum fails, the datagram is silently dropped. There is no signal sent back to the sender about loss, duplication, or reordering.
UDP also does not do flow control or congestion control. TCP slows down when the network is congested or when the receiver is overwhelmed. UDP just keeps sending at whatever rate the application chooses, which is great for predictable real-time media but can flood a network if used carelessly. Modern protocols built on UDP, like QUIC, add their own congestion control on top.
One practical limit: a single UDP datagram larger than the network path's MTU (typically around 1500 bytes on Ethernet) gets fragmented at the IP layer, and if any fragment is lost the whole datagram is lost. Most designs keep datagrams under roughly 1400 bytes to avoid fragmentation.