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) 连 接 建 立 的 新 套 接 字 。 一 个 已 经 经 过 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 标 志 时 , 数 据 才 能 被 接 收 。
地 址 格 式 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手 册 页 翻 译 计 划 》 :
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh