Provided by: manpages-zh_1.6.4.0-1_all bug

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
              一段時間後,另一端不確認重發資料。

       EAFNOTSUPPORTsin_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