22.4 When to Use UDP Instead of
TCP
In Sections 2.3 and
2.4, we described
the major differences between UDP and TCP. Given that TCP is
reliable while UDP is not, the question arises: When should we use
UDP instead of TCP, and why? We first list the advantages of
UDP:
-
As we show in Figure 20.1, UDP
supports broadcasting and multicasting. Indeed, UDP must be used if the application uses
broadcasting or multicasting. We discussed these two addressing
modes in Chapters 20 and 21.
-
UDP has no connection setup or teardown. With
regard to Figure 2.5, UDP
requires only two packets to exchange a request and a reply
(assuming the size of each is less than the minimum MTU between the
two end-systems). TCP requires about 10 packets, assuming that a
new TCP connection is established for each request-reply
exchange.
Also important in this number-of-packet analysis
is the number of packet round trips required to obtain the reply.
This becomes important if the latency exceeds the bandwidth, as
described in Appendix A of TCPv3. That text shows that the minimum
transaction time for a UDP
request-reply is RTT + server processing time (SPT). With TCP,
however, if a new TCP connection is used for the request-reply, the
minimum transaction time is 2 x RTT + SPT, one RTT greater than the
UDP time.
It should be obvious with regard to the second
point that if a TCP connection is used for multiple request-reply
exchanges, then the cost of the connection's establishment and
teardown is amortized across all the requests and replies, and this
is normally a better design than using a new connection for each
request-reply. Nevertheless, there are applications that use a new
TCP connection for each request-reply (e.g., the older versions of
HTTP), and there are applications in which the client and server
exchange one request-reply (e.g., the DNS) and then might not talk
to each other for hours or days.
We now list the features of TCP that are not
provided by UDP, which means that an application must provide these
features itself, if they are necessary to the application. We use
the qualifier "necessary" because not all features are needed by
all applications. For example, dropped segments might not need to
be retransmitted for a real-time audio application, if the receiver
can interpolate the missing data. Also, for simple request-reply
transactions, windowed flow control might not be needed if the two
ends agree ahead of time on the size of the largest request and
reply.
-
Positive acknowledgments, retransmission of lost
packets, duplicate detection, and sequencing of packets reordered
by the network鈥擳CP acknowledges all data, allowing lost packets to
be detected. The implementation of these two features requires that
every TCP data segment contain a sequence number that can then be
acknowledged. It also requires that TCP estimate a retransmission
timeout value for the connection and that this value be updated
continually as network traffic between the two end-systems
changes.
-
Windowed flow control鈥擜 receiving TCP tells the
sender how much buffer space it has allocated for receiving data,
and the sender cannot exceed this. That is, the amount of
unacknowledged data at the sender can never exceed the receiver's
advertised window.
-
Slow start and congestion avoidance鈥擳his is a
form of flow control imposed by the sender to determine the current
network capacity and to handle periods of congestion. All current
TCPs must support these two features and we know from experience
(before these algorithms were implemented in the late 1980s) that
protocols that do not "back off" in the face of congestion just
make the congestion worse (e.g., [Jacobson 1988]).
In summary, we can state the following
recommendations:
-
UDP must be
used for broadcast or multicast applications. Any form of desired
error control must be added to the clients and servers, but
applications often use broadcasting or multicasting when some
(assumed small) amount of error is acceptable (such as lost packets
for audio or video). Multicast applications requiring reliable
delivery have been built (e.g., multicast file transfer), but we
must decide whether the performance gain in using multicasting
(sending one packet to N destinations versus sending N copies of the packet across N TCP connections) outweighs the added
complexity required within the application to provide reliable
communications.
-
UDP can be used
for simple request-reply applications, but error detection must
then be built into the application. Minimally, this involves
acknowledgments, timeouts, and retransmission. Flow control is
often not an issue for reasonably sized requests and responses. We
will provide an example of these features in a UDP application in
Section 22.5. The
factors to consider here are how often the client and server
communicate (Could a TCP connection be left up between the two?)
and how much data is exchanged (if multiple packets are normally
required, then the cost of the TCP connection's establishment and
teardown becomes less of a factor).
-
UDP should not
be used for bulk data transfer (e.g., file transfer). The reason is
that windowed flow control, congestion avoidance, and slow-start
must all be built into the application, along with the features
from the previous bullet point, which means we are reinventing TCP
within the application. We should let the vendors focus on better
TCP performance and concentrate our efforts on the application
itself.
There are exceptions to these rules, especially
in existing applications. TFTP, for example, uses UDP for bulk data
transfer. UDP was chosen for TFTP because it is simpler to
implement than TCP in bootstrap code (800 lines of C code for UDP
versus 4500 lines for TCP in TCPv2, for example), and because TFTP
is used only to bootstrap systems on a LAN, not for bulk data
transfer across WANs. But this requires that TFTP include its own
sequence number field for acknowledgments, along with a timeout and
retransmission capability.
NFS is another exception to the rule: It also
uses UDP for bulk data transfer (although some might claim it is
really a request-reply application, albeit using large requests and
replies). This is partly historical, because in the mid-1980s when
it was designed, UDP implementations were faster than TCP, and NFS
was used only on LANs, where packet loss is often orders of
magnitude less than on WANs. But as NFS started being used across
WANs in the early 1990s, and as TCP implementations passed UDP in
terms of bulk data transfer performance, NFS version 3 was designed
to support TCP, and most vendors are now providing NFS over both
UDP and TCP. Similar reasoning (UDP being faster than TCP in the
mid-1980s along with a predominance of LANs over WANs) led the
precursor of the DCE RPC package (the Apollo NCS package) to also
choose UDP over TCP, although current implementations support both
UDP and TCP.
We might be tempted to say that UDP usage is
decreasing compared to TCP, with good TCP implementations being as
fast as the network today, and with fewer application designers
wanting to reinvent TCP within their UDP application. But the
predicted increase in multimedia applications over the next decade
will see an increase in UDP usage, since multimedia usually implies
multicasting, which requires UDP.
|