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