Provided by: manpages-zh_1.6.3.3-2_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