Manpages

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 一 段 时 间 后 , 另 一 端 不 确 认 重 发 数 据 。
EAFNOTSUPPORT
sin_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 [AT] netease.com>

[中 文 版 最 新 更 新 ]

2000/10/21

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

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh