TCP(7) | Linux Programmer's Manual | TCP(7) |
tcp - 传输控制协议 (TCP)
#include <sys/socket.h>
#include <netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
本协议是对 RFC973, RFC1122 和 RFC2001 定义的协议 及其 NewReno 和 SACK 扩充部份实现的。 它在建立在互联网协议 ip(7) 之上的两个套接字之间提供了可靠的面向数据流的全双工连接。 TCP 协议确保了数据按序到达并在数据包丢失时自动重发。 它产生和校验每个数据包的校验和 (checksum) 用以捕捉数据传输时错误。TCP 不保留记录的上下限。
初始的 TCP 接口不包含远端或本地址并且没有规定明确。 在产生一个出站 (outgoing) TCP 连接时使用 connect(2) 来与另个套接字建立一个网络接口。 在接收一个入站 (incoming) 连接时,套接字使用 bind(2) 先取得本地地址和端口,然后调用 listen(2) 使套接字进入侦听状态。 随后可以用 accept(2). 接受为每一个入站 (incoming) 连接建立的新套接字。 一个已经经过 accept 或 connect 成功调用的套接字表示它已完全明确,可以进行数据传送。 在侦听状态或尚未建立连接的网络接口之间数据传送将不能进行。
Linux 2.2 支持 RFC1323 TCP 高性能扩展。这包括采用大 TCP 数据滑移 窗以支持高延时或高带宽下的多连接。为实现这些功能,必须增加接 收与发送的数据缓存区。它们可以使用 net.core.wmem_default 和 net.core.rmem_default sysctl 进行全局设定,或用 SO_SNDBUF 和 SO_RCVBUF 套接字选项对套接字进行单独设定。 套接字缓存区的最大尺寸,受到由全局变量 net.core.rmem_max 和 net.core.wmem_max 两个 sysctl 限制。详细细节,请参见 socket(7).
TCP 支持紧急数据。紧急数据用来通知接收方,在数据流中有需要尽快处理 的重要信息。发送紧急数据,需在 send(2). 中指定 MSG_OOB 选项。当紧急数据接收后,内核发送 SIGURG 信号到读进程或者那些用 ioctl 设置了 FIOCSPGRP 或 FIOCSETOWN 套接字的进程或进程组. 当打开了 SO_OOBINLINE 套接字选项, 那么紧急数据被放入普通数据流中。 (可以用 SIOCATMARK ioctl 来测试), 否则只有设置了 sendmsg(2) 中的 MSG_OOB 标志时,数据才能被接收。
TCP 是建立在 IP 之上(参见 ip(7)). ip(7) 定义定义的地址格式也适用于 TCP. TCP只支持点对点通讯,不支持全局及多址广播。
可以通过访问 /proc/sys/net/ipv4/* 目录下的文件 或通过 sysctl(2) 接口进行访问这些 sysctl. 此外大多数 IP sysctl 也同样适用于 TCP; 参见 ip(7).
设置或取得 TCP 接口选项,调用 getsockopt(2) 进行读操作或调用 setsockopt(2) 将接口系列选项参数传送到 SOL_TCP 中去.另外,大多数 SOL_IP 接口 选项对 TCP 接口也适用。更多资料,请参见 ip(7).
这些 ioctl 可以用 ioctl(2) 进行访问。正确调用句法为:
int value; error = ioctl(tcp_socket, ioctl_type, &value);
当网络发生错误时,TCP 协议将尝试重新发送数据包, 当重发一定失败次数后,产生超时错 ETIMEDOUT 或报告在此连接上最后出错消息。
有时程序需要更快地侦测到出错状态。这可以通过打开 SOL_IP 级别的 IP_RECVERR 接口选项。当此项打开后,所有入站 (incoming) 错误 被立即送到用户程序中。小心使用该选项-它使 TCP 协议对路由的改 变和其他正常网络状态变化的容错性下降。
当建立一个连接时发生错误引发一个对 SIGPIPE 接口写操作,此操作 仅当 SO_KEEPOPEN 接口选项被设置时才能进行。
TCP 并不具有真正的额外频带(out-of-band)数据; 虽然它可以有紧 急数据。在 Linux 中这意味着如果有其他端发送紧急数据时,旧的紧 急数据将被当作普通数据插入数据流中。(即使 SO_OOBINLINE 值没有被设置).这与基于 BSD 堆栈定义不同.
缺省状态下,Linux 使用与 BSD 兼容的紧急数据指针字段。这与 RFC1122 协议相违背, 但这是与其他堆栈协议相互操作性所要求。它可以用 tcp_stdurg sysctl 加以改变.
任何定义为 ip(7) 出错或普通套接字出错可能返回为 TCP 出错.
不是所有的错误都列入了文档。
没有描述有关透明代理的选项
有关 sysctl 是在 Linux 2.2 中新增的。 IP_RECVERR 是 Linux 2.2 中的新特性。 TCP_CORK 在 2.2 中是新的内容.
socket(7), socket(2), ip(7),
sendmsg(2), recvmsg(2).
RFC793 协议中对 TCP 有关描述.
RFC1122 协议中对 TCP
要求和一份关于 Nagle
算法描述。
RFC2001 协议中一些 TCP
算法。
LetBright <letbright@netease.com>
2000/10/21
http://cmpp.linuxforum.net
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
25 Apr 1999 | Linux Man Page |