7.12 Summary
Socket options run the gamut from the very
general (SO_ERROR) to the very specific (IP header
options). The most commonly used options that we might encounter
are SO_KEEPALIVE, SO_RCVBUF, SO_SNDBUF,
and SO_REUSEADDR. The latter should always be set for a
TCP server before it calls bind (Figure 11.12). The
SO_BROADCAST option and the 10 multicast socket options
are only for applications that broadcast or multicast,
respectively.
The SO_KEEPALIVE socket option is set
by many TCP servers and automatically terminates a half-open
connection. The nice feature of this option is that it is handled
by the TCP layer, without requiring an application-level inactivity
timer; its downside is that it cannot tell the difference between a
crashed client host and a temporary loss of connectivity to the
client. SCTP provides 17 socket options that are used by the
application to control the transport. SCTP_NODELAY and
SCTP_MAXSEG are similar to TCP_NODELAY and
TCP_MAXSEG and perform equivalent functions. The other 15
options give the application finer control of the SCTP stack; we
will discuss the use of many of these socket options in Chapter 23.
The SO_LINGER socket option gives us
more control over when close returns and also lets us
force an RST to be sent instead of TCP's four-packet connection
termination sequence. We must be careful sending RSTs, because this
avoids TCP's TIME_WAIT state. Much of the time, this socket option
does not provide the information that we need, in which case, an
application-level ACK is required.
Every TCP and SCTP socket has a send buffer and
a receive buffer, and every UDP socket has a receive buffer. The
SO_SNDBUF and SO_RCVBUF socket options let us
change the sizes of these buffers. The most common use of these
options is for bulk data transfer across long fat pipes: TCP
connections with either a high bandwidth or a long delay, often
using the RFC 1323 extensions. UDP sockets, on the other hand,
might want to increase the size of the receive buffer to allow the
kernel to queue more datagrams if the application is busy.
|