UDP provides an unreliable data transfer service—that is, when a process sends a message into a UDP socket, UDP provides no guarantee that the message will ever reach the receiving process. Furthermore, messages that do arrive at the receiving process may arrive out of order. UDP does not include a congestion-control mechanism, so the sending side of UDP can pump data into the layer below (the network layer) at any rate it pleases. (Note, however, that the actual end-to-end throughput may be less than this rate due to the limited transmission capacity of intervening links or due to congestion). Because real-time applications can often tolerate some lose but require a minimal rate to be effective, developers of real-time applications sometimes choose to run their applications over UDP, thereby circumventing TCP’s congestion-control mechanism and packet overheads. On the other hand, because many firewalls are configured to block (most type of) UDP traffic, designers have increasingly chosen to run multimedia and real-time applications over TCP [Sripanidkulchai 2004].