Provided by: manpages-zh_1.5.2-1.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