DOKK / manpages / debian 11 / manpages-zh / tcp.7.zh_TW
TCP(7) Linux Programmer's Manual TCP(7)

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).

打開 RFC1323 協議中 TCP 滑移數據窗尺寸調整.
打開 RFC2018 協議中 TCP 選擇性確認.
打開 RFC1323 協議中 TCP 時間戳.
規定強迫關閉套接字前,等待最後結束數據包的秒數。 這確實與 TCP 協議中有關規定相違背。 但這是防止拒絕服務攻擊所要求的。
丟棄數據包前,進行最大 TCP 保持連接偵測. 保持連接僅在 SO_KEEPALIVE 套接字選項被打開時才被髮送.
從不再傳送數據到向連接上發送保持連接信號之間所需的秒數, 默認爲 10800 秒(3 小時)。
在一定時間發送保持連接時間偵測包的數量。爲防止突發信號,此 值不宜設置太高。
使 TCP 緊急指針字段遵循在 RFC973 協議中的嚴格解釋。缺省情況下, 緊急指針字段使用與 BSD 相兼容,指針指向緊急數據後的第一個字節。 在 RFC973 協議中是指向緊急數據後的最後一個字節。打開這一選項 可能造成操作互換性問題。
打開 TCP 同步標籤(syncookie),內核必須打開了 CONFIG_SYN_COOKIES 項進行編譯. 同步標籤(Syncookie)防止一個套接字在有過多試圖連接到 達時的過載。當使用同步標籤(syncookie)時,客戶機可能探測不到 一個超時時間短的過載主機。
每個接口中待發數據隊列 (backlog) 長度。Linux 2.2 中,在 listen(2) 中的定義只說明瞭已建立的套接字中待發數據隊列(backlog)長度。 每個偵測套接字的還未建立的套接字(在 SYN_RECV 狀態中的)的最大隊列長度用這個 sysctl 設置。 當更多的連接請求到達時,Linux 系統將開始丟棄數據包。當同步標籤(syncookie)被設置成打開, 數據包仍能被迴應時,這個值將被忽略。
定義放棄迴應一個 TCP 連接請求前發送重試信號的次數。
定義放棄在已建立通訊狀態下一個 TCP 數據包前重發的次數。
定義在放棄發送初始同步數據包(SYN packet)到遠端主機前重試的次數並返回出 錯消息,此值必須小於255。這僅對出站(outgoing)連接超時有效; 對於進站(incoming)連接重發數由 tcp_retries1 定義。
在重發時試圖發送全尺寸數據包。 用來解決一些堆棧中的 TCP 缺陷(BUG)。

接口選項 SOCKET OPTIONS

設置或取得 TCP 接口選項,調用 getsockopt(2) 進行讀操作或調用 setsockopt(2) 將接口系列選項參數傳送到 SOL_TCP 中去.另外,大多數 SOL_IP 接口 選項對 TCP 接口也適用。更多資料,請參見 ip(7).

關閉 Nagle 算法。這意味着數據包將盡可能快地被髮送而沒有因有網 絡中更多的數據包造成的延時,期待一個整數表示的布爾標誌。
設置或接收最大出站 TCP 數據段尺寸。如果這個選項在建立連接前的 設置,它將改變發送到另一端初始信息包中的 MSS 值。這個值大於 MTU 接口值將被忽略而不起作用。
設置此項將不發送部份幀。所有排隊的部份幀只在此項清除後, 才能發送。在調用 sendfile(2) 前準備數據報頭或對網絡吞吐量進行優化有用處。 此選項不能與 TCP_NODELAY 聯用.

輸入輸出控制字 IOCTLS

這些 ioctl 可以用 ioctl(2) 進行訪問。正確調用句法爲:

int value;
error = ioctl(tcp_socket, ioctl_type, &value);
返回接收緩存中排隊的未讀數據的數量。 變量參數是指向一個整數的指針。
如果用戶程序已經接收了所有緊急數據,此項返回值爲 0。它與 SO_OOBINLINE 聯用。變量參數是對測試結果,指向一個整數的指針。
返回在接口(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

另一端意外關閉了套接字連接或對一個關閉了的套接字進行讀操作。
一段時間後,另一端不確認重發數據。
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

25 Apr 1999 Linux Man Page