1361 Add support for socket options TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL
[illumos-gate.git] / usr / src / man / man7p / tcp.7p
blob5e1a6e8a8f1fefef3c9ec6c94ebc66e7afe28145
1 '\" te
2 .\" Copyright (c) 2006, Sun Microsystems, Inc. All Rights Reserved.
3 .\" Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved.
4 .\" Copyright 1989 AT&T
5 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
6 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
7 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
8 .TH tcp 7P "30 June 2006" "SunOS 5.11" "Protocols"
9 .SH NAME
10 tcp, TCP \- Internet Transmission Control Protocol
11 .SH SYNOPSIS
12 .LP
13 .nf
14 \fB#include <sys/socket.h>\fR
15 .fi
17 .LP
18 .nf
19 \fB#include <netinet/in.h>\fR
20 .fi
22 .LP
23 .nf
24 \fBs = socket(AF_INET, SOCK_STREAM, 0);\fR
25 .fi
27 .LP
28 .nf
29 \fBs = socket(AF_INET6, SOCK_STREAM, 0);\fR
30 .fi
32 .LP
33 .nf
34 \fBt = t_open("/dev/tcp", O_RDWR);\fR
35 .fi
37 .LP
38 .nf
39 \fBt = t_open("/dev/tcp6", O_RDWR);\fR
40 .fi
42 .SH DESCRIPTION
43 .sp
44 .LP
45 \fBTCP\fR is the virtual circuit protocol of the Internet protocol family. It
46 provides reliable, flow-controlled, in order, two-way transmission of data. It
47 is a byte-stream protocol layered above the Internet Protocol (\fBIP\fR), or
48 the Internet Protocol Version 6 (\fBIPv6\fR), the Internet protocol family's
49 internetwork datagram delivery protocol.
50 .sp
51 .LP
52 Programs can access \fBTCP\fR using the socket interface as a \fBSOCK_STREAM\fR
53 socket type, or using the Transport Level Interface (\fBTLI\fR) where it
54 supports the connection-oriented (\fBT_COTS_ORD\fR) service type.
55 .sp
56 .LP
57 \fBTCP\fR uses \fBIP\fR's host-level addressing and adds its own per-host
58 collection of "port addresses." The endpoints of a \fBTCP\fR connection are
59 identified by the combination of an \fBIP\fR or IPv6 address and a \fBTCP\fR
60 port number. Although other protocols, such as the User Datagram Protocol
61 (UDP), may use the same host and port address format, the port space of these
62 protocols is distinct. See \fBinet\fR(7P) and \fBinet6\fR(7P) for details on
63 the common aspects of addressing in the Internet protocol family.
64 .sp
65 .LP
66 Sockets utilizing \fBTCP\fR are either "active" or "passive." Active sockets
67 initiate connections to passive sockets. Both types of sockets must have their
68 local \fBIP\fR or IPv6 address and \fBTCP\fR port number bound with the
69 \fBbind\fR(3SOCKET) system call after the socket is created. By default,
70 \fBTCP\fR sockets are active. A passive socket is created by calling the
71 \fBlisten\fR(3SOCKET) system call after binding the socket with \fBbind()\fR.
72 This establishes a queueing parameter for the passive socket. After this,
73 connections to the passive socket can be received with the
74 \fBaccept\fR(3SOCKET) system call. Active sockets use the
75 \fBconnect\fR(3SOCKET) call after binding to initiate connections.
76 .sp
77 .LP
78 By using the special value \fBINADDR_ANY\fR with \fBIP\fR, or the unspecified
79 address (all zeroes) with IPv6, the local \fBIP\fR address can be left
80 unspecified in the \fBbind()\fR call by either active or passive \fBTCP\fR
81 sockets. This feature is usually used if the local address is either unknown or
82 irrelevant. If left unspecified, the local \fBIP\fR or IPv6 address will be
83 bound at connection time to the address of the network interface used to
84 service the connection.
85 .sp
86 .LP
87 Note that no two TCP sockets can be bound to the same port unless the bound IP
88 addresses are different.  IPv4 \fBINADDR_ANY\fR and IPv6 unspecified addresses
89 compare as equal to any IPv4 or IPv6 address. For example, if a socket is bound
90 to \fBINADDR_ANY\fR or unspecified address and port X, no other socket can bind
91 to port X, regardless of the binding address. This special consideration of
92 \fBINADDR_ANY\fR and unspecified address can be changed using the socket option
93 \fBSO_REUSEADDR\fR. If \fBSO_REUSEADDR\fR is set on a socket doing a bind, IPv4
94 \fBINADDR_ANY\fR and IPv6 unspecified address do not compare as equal to any IP
95 address. This means that as long as the two sockets are not both bound to
96 \fBINADDR_ANY\fR/unspecified address or the same IP address, the two sockets
97 can be bound to the same port.
98 .sp
99 .LP
100  If an application does not want to allow another socket  using the
101 \fBSO_REUSEADDR\fR option to bind to a port its socket is bound to, the
102 application can set the socket level option \fBSO_EXCLBIND\fR on a socket. The
103 option values of 0 and 1 mean enabling and disabling the option respectively.
104 Once this option is enabled on a socket, no other socket can be bound to the
105 same port.
108 Once a connection has been established, data can be exchanged using the
109 \fBread\fR(2) and \fBwrite\fR(2) system calls.
112 Under most circumstances, \fBTCP\fR sends data when it is presented. When
113 outstanding data has not yet been acknowledged, \fBTCP\fR gathers small amounts
114 of output to be sent in a single packet once an acknowledgement has been
115 received. For a small number of clients, such as window systems that send a
116 stream of mouse events which receive no replies, this packetization may cause
117 significant delays. To circumvent this problem, \fBTCP\fR provides a
118 socket-level boolean option, \fBTCP_NODELAY.\fR \fBTCP_NODELAY\fR is defined in
119 \fB<netinet/tcp.h>\fR, and is set with \fBsetsockopt\fR(3SOCKET) and tested
120 with \fBgetsockopt\fR(3SOCKET). The option level for the \fBsetsockopt()\fR
121 call is the protocol number for \fBTCP,\fR available from
122 \fBgetprotobyname\fR(3SOCKET).
125 For some applications, it may be desirable for TCP not to send out data unless
126 a full TCP segment can be sent. To enable this behavior, an application can use
127 the \fBTCP_CORK\fR socket option. When \fBTCP_CORK\fR is set with a non-zero
128 value, TCP sends out a full TCP segment only. When \fBTCP_CORK\fR is set to
129 zero after it has been enabled, all buffered data is sent out (as permitted by
130 the peer's receive window and the current congestion window). \fBTCP_CORK\fR is
131 defined in <\fBnetinet/tcp.h\fR>,  and is set with \fBsetsockopt\fR(3SOCKET)
132 and tested with \fBgetsockopt\fR(3SOCKET). The option level for the
133 \fBsetsockopt()\fR call is the protocol  number  for TCP, available from
134 \fBgetprotobyname\fR(3SOCKET).
137 The SO_RCVBUF socket level option can be used to control the window that TCP
138 advertises to the peer. IP level options may also be used with TCP. See
139 \fBip\fR(7P) and \fBip6\fR(7P).
142 Another socket level option, \fBSO_RCVBUF,\fR can be used to control the window
143 that \fBTCP\fR advertises to the peer. \fBIP\fR level options may also be used
144 with \fBTCP.\fR See \fBip\fR(7P) and \fBip6\fR(7P).
147 \fBTCP\fR provides an urgent data mechanism, which may be invoked using the
148 out-of-band provisions of \fBsend\fR(3SOCKET). The caller may mark one byte as
149 "urgent" with the \fBMSG_OOB\fR flag to \fBsend\fR(3SOCKET). This sets an
150 "urgent pointer" pointing to this byte in the \fBTCP\fR stream. The receiver on
151 the other side of the stream is notified of the urgent data by a \fBSIGURG\fR
152 signal. The \fBSIOCATMARK\fR \fBioctl\fR(2) request returns a value indicating
153 whether the stream is at the urgent mark. Because the system never returns data
154 across the urgent mark in a single \fBread\fR(2) call, it is possible to
155 advance to the urgent data in a simple loop which reads data, testing the
156 socket with the \fBSIOCATMARK\fR \fBioctl()\fR request, until it reaches the
157 mark.
160 Incoming connection requests that include an \fBIP\fR source route option are
161 noted, and the reverse source route is used in responding.
164 A checksum over all data helps \fBTCP\fR implement reliability. Using a
165 window-based flow control mechanism that makes use of positive
166 acknowledgements, sequence numbers, and a retransmission strategy, \fBTCP\fR
167 can usually recover when datagrams are damaged, delayed, duplicated or
168 delivered out of order by the underlying communication medium.
171 If the local \fBTCP\fR receives no acknowledgements from its peer for a period
172 of time, (for example, if the remote machine crashes), the connection is closed
173 and an error is returned.
176 TCP follows the congestion control algorithm described in \fIRFC 2581\fR, and
177 also supports the initial congestion window (cwnd) changes in \fIRFC 3390\fR.
178 The initial cwnd calculation can be overridden by the socket option
179 TCP_INIT_CWND. An application can use this option to set the initial cwnd to a
180 specified number of TCP segments. This applies to the cases when the connection
181 first starts and restarts after an idle period.  The process must have the
182 PRIV_SYS_NET_CONFIG privilege if it wants to specify a number greater than that
183 calculated by \fIRFC 3390\fR.
186 SunOS supports \fBTCP\fR Extensions for High Performance (\fIRFC 1323\fR) which
187 includes the window scale and time stamp options, and Protection Against Wrap
188 Around Sequence Numbers (PAWS). SunOS also supports Selective Acknowledgment
189 (SACK) capabilities (RFC 2018) and Explicit Congestion Notification (ECN)
190 mechanism (\fIRFC 3168\fR).
193 Turn on the window scale option in one of the following ways:
194 .RS +4
196 .ie t \(bu
197 .el o
198 An application can set \fBSO_SNDBUF\fR or \fBSO_RCVBUF\fR size in the
199 \fBsetsockopt()\fR option to be larger than 64K. This must be done \fIbefore\fR
200 the program calls \fBlisten()\fR or \fBconnect()\fR, because the window scale
201 option is negotiated when the connection is established. Once the connection
202 has been made, it is too late to increase the send or receive window beyond the
203 default \fBTCP\fR limit of 64K.
205 .RS +4
207 .ie t \(bu
208 .el o
209 For all applications, use \fBndd\fR(1M) to modify the configuration parameter
210 \fBtcp_wscale_always\fR. If \fBtcp_wscale_always\fR is set to \fB1\fR, the
211 window scale option will always be set when connecting to a remote system. If
212 \fBtcp_wscale_always\fR is \fB0,\fR the window scale option will be set only if
213 the user has requested a send or receive window larger than 64K. The default
214 value of \fBtcp_wscale_always\fR is \fB1\fR.
216 .RS +4
218 .ie t \(bu
219 .el o
220 Regardless of the value of \fBtcp_wscale_always\fR, the window scale option
221 will always be included in a connect acknowledgement if the connecting system
222 has used the option.
226 Turn on \fBSACK\fR capabilities in the following way:
227 .RS +4
229 .ie t \(bu
230 .el o
231 Use \fBndd\fR to modify the configuration parameter \fBtcp_sack_permitted\fR.
232 If \fBtcp_sack_permitted\fR is set to \fB0\fR, \fBTCP\fR will not accept
233 \fBSACK\fR or send out \fBSACK\fR information. If \fBtcp_sack_permitted\fR is
234 set to \fB1\fR, \fBTCP\fR will not initiate a connection with \fBSACK\fR
235 permitted option in the \fBSYN\fR segment, but will respond with \fBSACK\fR
236 permitted option in the \fBSYN|ACK\fR segment if an incoming connection request
237 has the \fBSACK \fR permitted option. This means that \fBTCP\fR will only
238 accept \fBSACK\fR information if the other side of the connection also accepts
239 \fBSACK\fR information. If \fBtcp_sack_permitted\fR is set to \fB2\fR, it will
240 both initiate and accept connections with \fBSACK\fR information. The default
241 for \fBtcp_sack_permitted\fR is \fB2\fR (active enabled).
245 Turn on \fBTCP ECN\fR mechanism in the following way:
246 .RS +4
248 .ie t \(bu
249 .el o
250 Use \fBndd\fR to modify the configuration parameter \fBtcp_ecn_permitted\fR. If
251 \fBtcp_ecn_permitted\fR is set to \fB0\fR, \fBTCP\fR will not negotiate with a
252 peer that supports \fBECN\fR mechanism. If \fBtcp_ecn_permitted\fR is set to
253 \fB1\fR when initiating a connection, TCP will not tell a peer that it supports
254 ECN mechanism. However, it will tell a peer that it supports \fBECN\fR
255 mechanism when accepting a new incoming connection request if the peer
256 indicates that it supports \fBECN\fR mechanism in the SYN segment. If
257 tcp_ecn_permitted is set to 2, in addition to negotiating with a peer on ECN
258 mechanism when accepting connections, TCP will indicate in the outgoing SYN
259 segment that it supports \fBECN\fR mechanism when \fBTCP\fR makes active
260 outgoing connections. The default for \fBtcp_ecn_permitted\fR is 1.
264 Turn on the time stamp option in the following way:
265 .RS +4
267 .ie t \(bu
268 .el o
269 Use \fBndd\fR to modify the configuration parameter \fBtcp_tstamp_always\fR. If
270 \fBtcp_tstamp_always\fR is \fB1\fR, the time stamp option will always be set
271 when connecting to a remote machine. If \fBtcp_tstamp_always\fR is \fB0\fR, the
272 timestamp option will not be set when connecting to a remote system. The
273 default for \fBtcp_tstamp_always\fR is \fB0\fR.
275 .RS +4
277 .ie t \(bu
278 .el o
279 Regardless of the value of \fBtcp_tstamp_always\fR, the time stamp option will
280 always be included in a connect acknowledgement (and all succeeding packets) if
281 the connecting system has used the time stamp option.
285 Use the following procedure to turn on the time stamp option only when the
286 window scale option is in effect:
287 .RS +4
289 .ie t \(bu
290 .el o
291 Use \fBndd\fR to modify the configuration parameter \fBtcp_tstamp_if_wscale\fR.
292 Setting \fBtcp_tstamp_if_wscale\fR to \fB1\fR will cause the time stamp option
293 to be set when connecting to a remote system, if the window scale option has
294 been set. If \fBtcp_tstamp_if_wscale\fR is \fB0\fR, the time stamp option will
295 not be set when connecting to a remote system. The default for
296 \fBtcp_tstamp_if_wscale\fR is \fB1\fR.
300 Protection Against Wrap Around Sequence Numbers (PAWS) is always used when the
301 time stamp option is set.
304 SunOS also supports multiple methods of generating initial sequence numbers.
305 One of these methods is the improved technique suggested in \fBRFC\fR 1948. We
306 \fBHIGHLY\fR recommend that you set sequence number generation parameters as
307 close to boot time as possible. This prevents sequence number problems on
308 connections that use the same connection-ID as ones that used a different
309 sequence number generation. The \fBsvc:/network/initial:default\fR service
310 configures the initial sequence number generation.  The service reads the value
311 contained in the configuration file \fB/etc/default/inetinit\fR to determine
312 which method to use.
315 The \fB/etc/default/inetinit\fR file is an unstable interface, and may change
316 in future releases.
319 \fBTCP\fR may be configured to report some information on connections that
320 terminate by means of an \fBRST\fR packet. By default, no logging is done. If
321 the \fBndd\fR(1M) parameter \fItcp_trace\fR is set to 1, then trace data is
322 collected for all new connections established after that time.
325 The trace data consists of the \fBTCP\fR headers and \fBIP\fR source and
326 destination addresses of the last few packets sent in each direction before RST
327 occurred. Those packets are logged in a series of \fBstrlog\fR(9F) calls. This
328 trace facility has a very low overhead, and so is superior to such utilities as
329 \fBsnoop\fR(1M) for non-intrusive debugging for connections terminating by
330 means of an \fBRST\fR.
333 SunOS supports the keep-alive mechanism described in \fIRFC 1122\fR. It is
334 enabled using the socket option SO_KEEPALIVE. When enabled, the first
335 keep-alive probe is sent out after a TCP is idle for two hours If the peer does
336 not respond to the probe within eight minutes, the TCP connection is aborted.
337 You can alter the interval for sending out the first probe using the socket
338 option TCP_KEEPALIVE_THRESHOLD. The option value is an unsigned integer in
339 milliseconds. The system default is controlled by the TCP ndd parameter
340 tcp_keepalive_interval. The minimum value is ten seconds. The maximum is ten
341 days, while the default is two hours. If you receive no response to the probe,
342 you can use the TCP_KEEPALIVE_ABORT_THRESHOLD socket option to change the time
343 threshold for aborting a TCP connection. The option value is an unsigned
344 integer in milliseconds. The value zero indicates that TCP should never time
345 out and abort the connection when probing. The system default is controlled by
346 the TCP ndd parameter tcp_keepalive_abort_interval. The default is eight
347 minutes.
350 socket options TCP_KEEPIDLE, TCP_KEEPCNT and TCP_KEEPINTVL are also supported
351 for compatibility with other Unix Flavors. TCP_KEEPIDLE option specifies the
352 interval in seconds for sending out the first keep-alive probe. TCP_KEEPCNT
353 specifies the number of keep-alive probes to be sent before aborting the
354 connection in the event of no response from peer. TCP_KEEPINTVL specifies the
355 interval in seconds between successive keep-alive probes.
356 .SH SEE ALSO
359 \fBsvcs\fR(1), \fBndd\fR(1M), \fBioctl\fR(2), \fBread\fR(2), \fBsvcadm\fR(1M),
360 \fBwrite\fR(2), \fBaccept\fR(3SOCKET), \fBbind\fR(3SOCKET),
361 \fBconnect\fR(3SOCKET), \fBgetprotobyname\fR(3SOCKET),
362 \fBgetsockopt\fR(3SOCKET), \fBlisten\fR(3SOCKET), \fBsend\fR(3SOCKET),
363 \fBsmf\fR(5), \fBinet\fR(7P), \fBinet6\fR(7P), \fBip\fR(7P), \fBip6\fR(7P)
366 Ramakrishnan, K., Floyd, S., Black, D., RFC 3168, \fIThe Addition of Explicit
367 Congestion Notification (ECN) to IP\fR, September 2001.
370 Mathias, M. and Hahdavi, J. Pittsburgh Supercomputing Center; Ford, S. Lawrence
371 Berkeley National Laboratory; Romanow, A. Sun Microsystems, Inc. \fIRFC 2018,
372 TCP Selective Acknowledgement Options\fR, October 1996.
375 Bellovin, S., \fIRFC 1948, Defending Against Sequence Number Attacks\fR, May
376 1996.
379 Jacobson, V., Braden, R., and Borman, D., \fIRFC 1323, TCP Extensions for High
380 Performance\fR, May 1992.
383 Postel, Jon, \fIRFC 793, Transmission Control Protocol - DARPA Internet Program
384 Protocol Specification\fR, Network Information Center, SRI International, Menlo
385 Park, CA., September 1981.
386 .SH DIAGNOSTICS
389 A socket operation may fail if:
391 .ne 2
394 \fB\fBEISCONN\fR\fR
396 .RS 17n
398 A \fBconnect()\fR operation was attempted on a socket on which a
399 \fBconnect()\fR operation had already been performed.
403 .ne 2
406 \fB\fBETIMEDOUT\fR\fR
408 .RS 17n
410 A connection was dropped due to excessive retransmissions.
414 .ne 2
417 \fB\fBECONNRESET\fR\fR
419 .RS 17n
421 The remote peer forced the connection to be closed (usually because the remote
422 machine has lost state information about the connection due to a crash).
426 .ne 2
429 \fB\fBECONNREFUSED\fR\fR
431 .RS 17n
433 The remote peer actively refused connection establishment (usually because no
434 process is listening to the port).
438 .ne 2
441 \fB\fBEADDRINUSE\fR\fR
443 .RS 17n
445 A \fBbind()\fR operation was attempted on a socket with a network address/port
446 pair that has already been bound to another socket.
450 .ne 2
453 \fB\fBEADDRNOTAVAIL\fR\fR
455 .RS 17n
457 A \fBbind()\fR operation was attempted on a socket with a network address for
458 which no network interface exists.
462 .ne 2
465 \fB\fBEACCES\fR\fR
467 .RS 17n
469 A \fBbind()\fR operation was attempted with a "reserved" port number and the
470 effective user \fBID\fR of the process was not the privileged user.
474 .ne 2
477 \fB\fBENOBUFS\fR\fR
479 .RS 17n
481 The system ran out of memory for internal data structures.
484 .SH NOTES
487 The \fBtcp\fR service is managed by the service management facility,
488 \fBsmf\fR(5), under the service identifier:
490 .in +2
492 svc:/network/initial:default
494 .in -2
499 Administrative actions on this service, such as enabling, disabling, or
500 requesting restart, can be performed using \fBsvcadm\fR(1M). The service's
501 status can be queried using the \fBsvcs\fR(1) command.