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

COMMENTS