Provided by: manpages-zh_1.6.4.0-1_all
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@netease.com>
[中文版最新更新]
2000/10/21
《中國linux論壇man手冊頁翻譯計劃》:
http://cmpp.linuxforum.net
跋
本頁面中文版由中文 man 手冊頁計劃提供。 中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh