tcp - Internet Transmission Control Protocol (TCP)
#include <sys/socket.h>
#include <netinet/in.h>
The following is the socket call for AF_INET sockets: s =
socket(AF_INET, SOCK_STREAM, 0);
The following is the socket call for AF_INET6 sockets: s =
socket(AF_INET6, SOCK_STREAM, 0);
The TCP protocol provides reliable, flow-controlled, twoway
transmission of data. It is a byte-stream protocol
used to support the SOCK_STREAM abstraction. The TCP protocol
uses the standard Internet address format and, in
addition, provides a per-host collection of port
addresses. Thus, each address is composed of an Internet
address specifying the host and network, with a specific
TCP port on the host identifying the peer entity.
Sockets utilizing the TCP are either active or passive.
Active sockets initiate connections to passive sockets.
By default, TCP sockets are created active; to create a
passive socket the listen() function must be used after
binding the socket with the bind() function. Only passive
sockets may use the accept() function to accept incoming
connections. Only active sockets may use the connect()
function to initiate connections.
Passive sockets may underspecify their location to match
incoming connection requests from multiple networks. This
technique, termed wildcard addressing, allows a single
server to provide service to clients on multiple networks.
To create a socket that listens on all networks, the
Internet address INADDR_ANY (for AF_INET sockets) or
in6addr_any (for AF_INET6 sockets) must be bound. The TCP
port may still be specified at this time; if the port is
not specified the system will assign one. Once a connection
has been established, the socket's address is fixed
by the peer entity's location. The address assigned to
the socket is the address associated with the network
interface through which packets are being transmitted and
received. Normally this address corresponds to the peer
entity's network.
TCP supports the following socket options: When the
SO_KEEPALIVE option is enabled, TCP probes a connection
that has been idle for some amount of time. If the remote
system does not respond to a keepalive probe, TCP retransmits
the probe a certain number of times before a connection
is considered to be broken. The default value for
this keepalive probe retransmit limit is 8. The TCP_KEEPCNT
option can be used to affect this value for a given
socket, and specifies the maximum number of keepalive
probes to be sent. This option takes an int value, with a
range of 1 to tcp_keepcnt. For more information on
tcp_keepcnt see the information on the inet subsystem
configuration attributes in the System Configuration and
Tuning guide. When the SO_KEEPALIVE option is enabled,
TCP probes a connection that has been idle for some amount
of time. The default value for this idle period is 2
hours. The TCP_KEEPIDLE option can be used to affect this
value for a given socket, and specifies the number of seconds
of idle time between keepalive probes. This option
takes an int value, with a range of 1 to N (where N is
tcp_keepidle divided by PR_SLOWHZ). For more information
on tcp_keepidle see the information on the inet subsystem
configuration attributes in the System Configuration and
Tuning guide. PR_SLOWHZ is defined in the <sys/protosw.h>
header file. If a TCP connection cannot be established
within some amount of time, TCP will time out the connect
attempt. The default value for this initial connection
establishment timeout is 75 seconds. The TCP_KEEPINIT
option can be used to affect this initial timeout period
for a given socket, and specifies the number of seconds to
wait before the connect attempt is timed out. For passive
connections, the TCP_KEEPINIT option value is inherited
from the listening socket. This option takes an int
value, with a range of 1 to N (where N is tcp_keepinit
divided by PR_SLOWHZ). For more information on
tcp_keepinit see the information on the inet subsystem
configuration attributes in the System Configuration and
Tuning guide. PR_SLOWHZ is defined in the <sys/protosw.h>
header file. When the SO_KEEPALIVE option is enabled, TCP
probes a connection that has been idle for some amount of
time. If the remote system does not respond to a keepalive
probe, TCP retransmits the probe after some amount of
time. The default value for this retransmit interval is 75
seconds. The TCP_KEEPINTVL option can be used to affect
this value for a given socket, and specifies the number of
seconds to wait before retransmitting a keepalive probe.
This option takes an int value, with a range of 1 to N
(where N is tcp_keepintvl divided by PR_SLOWHZ). For more
information on tcp_keepintvl see the information on the
inet subsystem configuration attributes in the System Configuration
and Tuning guide. PR_SLOWHZ is defined in the
<sys/protosw.h> header file. The maximum size of a TCP
segment is based on the network MTU for destinations on
local networks or on a default MTU of 576 bytes for destinations
on nonlocal networks. The default behavior can be
altered by setting the TCP_MAXSEG option to an integer
value from 1 to 65,535. However, TCP will not use a maximum
segment size smaller than 32 or larger than the local
network MTU. Setting the TCP_MAXSEG option to a value of
zero results in default behavior. The TCP_MAXSEG option
can only be set prior to calling listen or connect on the
socket. For passive connections, the TCP_MAXSEG option
value is inherited from the listening socket. This option
takes an int value, with a range of 0 to 65535. Under
most circumstances, TCP sends data when it is presented;
when outstanding data has not yet been acknowledged, it
gathers small amounts of output to be sent in a single
packet once an acknowledgement is received. For a small
number of clients, such as window systems that send a
stream of mouse events which receive no replies, this
gathering of output can cause significant delays. Therefore,
TCP provides a Boolean option, TCP_NODELAY (from the
netinet/tcp.h header file), to defeat this algorithm.
This option takes an int value. When this option is
enabled, the sender places a timestamp in each data segment.
The receiver, if configured to accept them, sends
these timestamps back in ACK segments. This provides the
sender with a mechanism with which to measure round-trip
time. TCP provides a Boolean option, TCP_TSOPTENA (from
the netinet/tcp.h header file) to enable or disable this
option. This option takes an int value. When the PAWS
(Protect Against Wrapped Sequence numbers) option is
enabled, the receiver rejects any old duplicate segments
that are received. This option is used on synchronized
TCP connections only. TCP provides a Boolean option,
TCP_PAWS (from the netinet/tcp.h header file) to enable or
disable this option. This option takes an int value. In
order to use this option, you must also enable the
TCP_TSOPTENA option. When the Selective Acknowledgment
(SACK) option is enabled, the data receiver can inform the
sender about all segments that have arrived successfully.
In this way, the sender need retransmit only those segments
that have actually been lost. This option is useful
in cases where multiple segments are dropped. TCP provides
a Boolean option, TCP_SACKENA (from the
netinet/tcp.h header file) to enable or disable this
option. This option takes an int value.
These options can be retrieved with the getsockopt() function
and set with the setsockopt() function.
The option level for the setsockopt() and getsockopt()
functions is the protocol number for TCP, available from
the getprotobyname() function.
Options at the IP transport level may be used with TCP;
see ip(7). Incoming connection requests that are sourcerouted
are noted, and the reverse source route is used in
responding.
If a socket operation fails, errno may be set to one of
the following values: The option_len parameter provided to
the setsockopt() or getsockopt() function is less than
sizeof(int) or the option_value parameter provided to the
setsockopt() function is outside the valid range for the
option. The socket to be connected already has a connection.
The system ran out of memory for an internal data
structure. Setting the TCP_MAXSEG option is not supported
after connect() or listen(). A connection was dropped due
to excessive retransmissions. The remote peer forced the
connection to be closed. The remote peer actively refuses
connection establishment (usually because no process is
listening to the port). An attempt is made to create a
socket with a port which has already been allocated. An
attempt is made to create a socket with a network address
for which no network interface exists.
Functions: getsockopt(2), socket(2)
Network Information: netintro(7), inet(7), ip(7)
tcp(7)
[ Back ] |