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_SNDBUF SO_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
一段时间后,另一端不确认重发数据。
EAFNOTSUPPORT
sin_family 传递套接字地址类型而不是在 AF_INET中的。

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

转载于:https://www.cnblogs.com/fanweisheng/p/11101243.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值