Provided by: manpages-zh_1.5.2-1.1_all bug

NAME

       tcp - 传输控制协议 (TCP)

总缆 SYNOPSIS

       #include <sys/socket.h>
       #include <netinet/in.h>
       tcp_socket = socket(PF_INET, SOCK_STREAM, 0);

描述 DESCRIPTION

       本协议是对  RFC973, RFC1122 和 RFC2001 定义的协议 及其 NewReno 和 SACK 扩充部份实现的。 它
       在建立在互联网协议 ip(7) 之上的两个套接字之间提供了可靠的面向数据流的全双工连接。 TCP 协议
       确保了数据按序到达并在数据包丢失时自动重发。  它产生和校验每个数据包的校验和 (checksum) 用
       以捕捉数据传输时错误。TCP 不保留记录的上下限。

       初始的 TCP 接口不包含远端或本地址并且没有规定明确。 在产生一个出站 (outgoing) TCP 连接时使
       用  connect(2) 来与另个套接字建立一个网络接口。 在接收一个入站 (incoming) 连接时,套接字使
       用  bind(2)  先取得本地地址和端口,然后调用  listen(2)  使套接字进入侦听状态。  随后可以用
       accept(2).    接受为每一个入站  (incoming)  连接建立的新套接字。  一个已经经过  acceptconnect 成功调用的套接字表示它已完全明确,可以进行数据传送。  在侦听状态或尚未建立连接的网
       络接口之间数据传送将不能进行。

       Linux  2.2 支持 RFC1323 TCP 高性能扩展。这包括采用大 TCP 数据滑移 窗以支持高延时或高带宽下
       的多连接。为实现这些功能,必须增加接                    收与发送的数据缓存区。它们可以使用
       net.core.wmem_defaultnet.core.rmem_default  sysctl  进行全局设定,或用  SO_SNDBUFSO_RCVBUF     套接字选项对套接字进行单独设定。      套接字缓存区的最大尺寸,受到由全局变量
       net.core.rmem_maxnet.core.wmem_max 两个 sysctl 限制。详细细节,请参见 socket(7).

       TCP  支持紧急数据。紧急数据用来通知接收方,在数据流中有需要尽快处理 的重要信息。发送紧急数
       据,需在 send(2).  中指定 MSG_OOB 选项。当紧急数据接收后,内核发送 SIGURG 信号到读进程或者
       那些用  ioctl  设置了 FIOCSPGRPFIOCSETOWN 套接字的进程或进程组. 当打开了 SO_OOBINLINE
       套接字选项, 那么紧急数据被放入普通数据流中。 (可以用 SIOCATMARK ioctl 来测试),  否则只有设
       置了 sendmsg(2) 中的 MSG_OOB 标志时,数据才能被接收。

地址格式 ADDRESS FORMATS

       TCP  是建立在 IP 之上(参见 ip(7)).  ip(7) 定义定义的地址格式也适用于 TCP.  TCP只支持点对点
       通讯,不支持全局及多址广播。

系统控制 SYSCTLS

       可以通过访问 /proc/sys/net/ipv4/* 目录下的文件 或通过 sysctl(2)  接口进行访问这些  sysctl.
       此外大多数 IP sysctl 也同样适用于 TCP; 参见 ip(7).

       tcp_window_scaling
              打开 RFC1323 协议中 TCP 滑移数据窗尺寸调整.

       tcp_sack
              打开 RFC2018 协议中 TCP 选择性确认.

       tcp_timestamps
              打开 RFC1323 协议中 TCP 时间戳.

       tcp_fin_timeout
              规定强迫关闭套接字前,等待最后结束数据包的秒数。  这确实与  TCP  协议中有关规定相违
              背。 但这是防止拒绝服务攻击所要求的。

       tcp_keepalive_probes
              丢弃数据包前,进行最大 TCP 保持连接侦测. 保持连接仅在 SO_KEEPALIVE 套接字选项被打开
              时才被发送.

       tcp_keepalive_time
              从不再传送数据到向连接上发送保持连接信号之间所需的秒数, 默认为 10800 秒(3 小时)。

       tcp_max_ka_probes
              在一定时间发送保持连接时间侦测包的数量。为防止突发信号,此 值不宜设置太高。

       tcp_stdurg
              使  TCP 紧急指针字段遵循在 RFC973 协议中的严格解释。缺省情况下, 紧急指针字段使用与
              BSD 相兼容,指针指向紧急数据后的第一个字节。 在 RFC973 协议中是指向紧急数据后的最后
              一个字节。打开这一选项 可能造成操作互换性问题。

       tcp_syncookies
              打开  TCP 同步标签(syncookie),内核必须打开了 CONFIG_SYN_COOKIES 项进行编译. 同步标
              签(Syncookie)防止一个套接字在有过多试图连接到              达时的过载。当使用同步标
              签(syncookie)时,客户机可能探测不到 一个超时时间短的过载主机。

       tcp_max_syn_backlog
              每个接口中待发数据队列 (backlog) 长度。Linux 2.2 中,在 listen(2) 中的定义只说明了已
              建立的套接字中待发数据队列(backlog)长度。       每个侦测套接字的还未建立的套接字(在
              SYN_RECV  状态中的)的最大队列长度用这个 sysctl 设置。 当更多的连接请求到达时,Linux
              系统将开始丢弃数据包。当同步标签(syncookie)被设置成打开,  数据包仍能被回应时,这个
              值将被忽略。

       tcp_retries1
              定义放弃回应一个 TCP 连接请求前发送重试信号的次数。

       tcp_retries2
              定义放弃在已建立通讯状态下一个 TCP 数据包前重发的次数。

       tcp_syn_retries
              定义在放弃发送初始同步数据包(SYN packet)到远端主机前重试的次数并返回出 错消息,此值
              必须小于255。这仅对出站(outgoing)连接超时有效;      对于进站(incoming)连接重发数由
              tcp_retries1 定义。

       tcp_retrans_collapse
              在重发时试图发送全尺寸数据包。 用来解决一些堆栈中的 TCP 缺陷(BUG)。

接口选项 SOCKET OPTIONS

       设置或取得  TCP 接口选项,调用 getsockopt(2) 进行读操作或调用 setsockopt(2) 将接口系列选项
       参数传送到 SOL_TCP 中去.另外,大多数 SOL_IP 接口 选项对  TCP  接口也适用。更多资料,请参见
       ip(7).

       TCP_NODELAY
              关闭  Nagle 算法。这意味着数据包将尽可能快地被发送而没有因有网 络中更多的数据包造成
              的延时,期待一个整数表示的布尔标志。

       TCP_MAXSEG
              设置或接收最大出站 TCP 数据段尺寸。如果这个选项在建立连接前的  设置,它将改变发送到
              另一端初始信息包中的 MSS 值。这个值大于 MTU 接口值将被忽略而不起作用。

       TCP_CORK
              设置此项将不发送部份帧。所有排队的部份帧只在此项清除后,           才能发送。在调用
              sendfile(2) 前准备数据报头或对网络吞吐量进行优化有用处。  此选项不能与  TCP_NODELAY
              联用.

输入输出控制字 IOCTLS

       这些 ioctl 可以用 ioctl(2) 进行访问。正确调用句法为:

              int value;
              error = ioctl(tcp_socket, ioctl_type, &value);

       FIONREAD
              返回接收缓存中排队的未读数据的数量。 变量参数是指向一个整数的指针。

       SIOCATMARK
              如果用户程序已经接收了所有紧急数据,此项返回值为  0。它与 SO_OOBINLINE 联用。变量参
              数是对测试结果,指向一个整数的指针。

       TIOCOUTQ
              返回在接口(socket)发送队列中待发送数据数, 该指针返回是一个整数数值。

出错处理 ERROR HANDLING

       当网络发生错误时,TCP     协议将尝试重新发送数据包,      当重发一定失败次数后,产生超时错
       ETIMEDOUT 或报告在此连接上最后出错消息。

       有时程序需要更快地侦测到出错状态。这可以通过打开 SOL_IP 级别的 IP_RECVERR 接口选项。当此项
       打开后,所有入站 (incoming) 错误 被立即送到用户程序中。小心使用该选项-它使 TCP  协议对路由
       的改 变和其他正常网络状态变化的容错性下降。

附注 NOTES

       当建立一个连接时发生错误引发一个对  SIGPIPE 接口写操作,此操作 仅当 SO_KEEPOPEN 接口选项被
       设置时才能进行。

       TCP 并不具有真正的额外频带(out-of-band)数据; 虽然它可以有紧 急数据。在 Linux  中这意味着如
       果有其他端发送紧急数据时,旧的紧 急数据将被当作普通数据插入数据流中。(即使 SO_OOBINLINE 值
       没有被设置).这与基于 BSD 堆栈定义不同.

       缺省状态下,Linux 使用与 BSD 兼容的紧急数据指针字段。这与 RFC1122 协议相违背, 但这是与其他
       堆栈协议相互操作性所要求。它可以用 tcp_stdurg sysctl 加以改变.

已知错误 ERRORS

       EPIPE  另一端意外关闭了套接字连接或对一个关闭了的套接字进行读操作。

       ETIMEDOUT
              一段时间后,另一端不确认重发数据。

       EAFNOTSUPPORTsin_family 传递套接字地址类型而不是在 AF_INET中的。

       任何定义为 ip(7) 出错或普通套接字出错可能返回为 TCP 出错.

不足之处 BUGS

       不是所有的错误都列入了文档。

       没有描述有关透明代理的选项

版本 VERSIONS

       有关 sysctl 是在 Linux 2.2 中新增的。 IP_RECVERR 是 Linux 2.2 中的新特性。 TCP_CORK 在 2.2
       中是新的内容.

又见 SEE ALSO

       socket(7), socket(2), ip(7), sendmsg(2), recvmsg(2).
       RFC793 协议中对 TCP 有关描述.
       RFC1122 协议中对 TCP 要求和一份关于 Nagle 算法描述。
       RFC2001 协议中一些 TCP 算法。

[中文版维护人]

       LetBright <letbright@netease.com>

[中文版最新更新]

       2000/10/21

《中国linux论坛man手册页翻译计划》:

       http://cmpp.linuxforum.net