Provided by:
manpages-zh_1.5-1_all 
NAME
tcp - 傳輸控制協議 (TCP)
`l SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
yz DESCRIPTION
本協議是對 RFC973, RFC1122 和 RFC2001 定義的協議 及其 NewReno 和 SACK
擴充部份實現的。 它在建立在網際網路協議 ip(7) 之上的兩-
荇M接字之間提供了可靠的惘V數據流的全雙工連接。 TCP
協議確保了數據按序到達並在數據包丟失時自動奏o。 它產生和校驗每-
蚍琤]的校驗和 (checksum) 用以捕捉數據傳輸時錯誤。TCP
不保留記錄的上下。
初始的 TCP 接口不包含遠端或本地址並且沒有規定明確。 在產生一茈X站
(outgoing) TCP 連接時使用 connect(2) 來與另荇M接字建立一蚨蘢翿竣f。
在接收一茪J站 (incoming) 連接時,套接字使用 bind(2)
先取得本地地址和端口,然後調用 listen(2) 使套接字進入偵聽狀態。
隨後可以用 accept(2). 接受為每一茪J站 (incoming) 連接建立的新套接字。
一茪w經經過 accept 或 connect
成功調用的套接字表示它已完全明確,可以進行數據傳送。
在偵聽狀態或尚未建立連接的網路接口之間數據傳送將不能進行。
Linux 2.2 支持 RFC1323 TCP 高性能擴展。這包括採用大 TCP 數據滑移
窗以支持高延時或高帶寬下的多連接。為實現這些功能,必須增加接
收與發送的數據緩存區。它怚i以使用 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 支持緊急數據。緊急數據用來通知接收方,在數據流中有需n盡快處理 的-
n信息。發送緊急數據,需在 send(2). 中指定 MSG_OOB
選項。當緊急數據接收後,核心發送 SIGURG 信號到讀進程或者那些用 ioctl
設置了 FIOCSPGRP 或 FIOCSETOWN 套接字的進程或進程組. 當打開了
SO_OOBINLINE 套接字選項, 那麼緊急數據被放入普通數據流中。 (可以用
SIOCATMARK ioctl 來測試), 否則只有設置了 sendmsg(2) 中的 MSG_OOB
標誌時,數據才能被接收。
a} ADDRESS FORMATS
TCP 是建立在 IP 之上(參見 ip(7)). ip(7) 定義定義的地址格式也適用於
TCP. TCP只支持點對點通訊,不支持全局及多址廣播。
t 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
規定強〡鶶洫M接字前,等待最後結束數據包的秒數。 這確實與 TCP
協議中有關規定相違I。 但這是防止拒絕服務攻擊所n求的。
tcp_keepalive_probes
丟棄數據包前,進行最大 TCP 保持連接偵測. 保持連接僅在
SO_KEEPALIVE 套接字選項被打開時才被發送.
tcp_keepalive_time
從不再傳送數據到向連接上發送保持連接信號之間所需的秒數, 預設為
10800 秒(3 小時)。
tcp_max_ka_probes
在一定時間發送保持連接時間偵測包的數量。為防止突發信號,此
ㄘy設置太高。
tcp_stdurg
使 TCP 緊急指針字段遵循在 RFC973 協議中的嚴格解釋。預設情況下,
緊急指針字段使用與 BSD 相相容,指針指向緊急數據後的第一茼r節。
在 RFC973 協議中是指向緊急數據後的最後一茼r節。打開這一選項
可能造成操作互換性問題。
tcp_syncookies
打開 TCP 同步標簽(syncookie),核心必須打開了 CONFIG_SYN_COOKIES
項進行編譯. 同步標簽(Syncookie)防止一荇M接字在有過多試圖連接到
達時的過載。當使用同步標簽(syncookie)時,客戶機可能探測不到 一-
荈W時時間短的過載主機。
tcp_max_syn_backlog
每荓竣f中待發數據隊列 (backlog) 長度。Linux 2.2 中,在 listen(2)
中的定義只說明了已建立的套接字中待發數據隊列(backlog)長度。 每-
荌輕套接字的還未建立的套接字(在 SYN_RECV
狀態中的)的最大隊列長度用這 sysctl 設置。
當更多的連接請求到達時,Linux
系統將開始丟棄數據包。當同步標簽(syncookie)被設置成打開,
數據包仍能被回應時,這蚧將被忽略。
tcp_retries1
定義放棄回應一 TCP 連接請求前發送姜晛H號的次數。
tcp_retries2
定義放棄在已建立通訊狀態下一 TCP 數據包前奏o的次數。
tcp_syn_retries
定義在放棄發送初始同步數據包(SYN packet)到遠端主機前-
姜晡漲蜈礙藀^出 錯消息,此-
眸楔p於255。這僅對出站(outgoing)連接超時有效;
對於進站(incoming)連接奏o數由 tcp_retries1 定義。
tcp_retrans_collapse
在奏o時試圖發送全尺寸數據包。 用來解決一些堆棧中的 TCP
缺陷(BUG)。
f SOCKET OPTIONS
設置或取得 TCP 接口選項,調用 getsockopt(2) 進行讀操作或調用
setsockopt(2) 將接口系列選項參數傳送到 SOL_TCP 中去.另外,大多數 SOL_IP
接口 選項對 TCP 接口也適用。更多資料,請參見 ip(7).
TCP_NODELAY
關閉 Nagle 算法。這意味著數據包將盡可能快地被發送而沒有因有網
絡中更多的數據包造成的延時,期待一蚞蒱磳靰漸牯蜈郅x。
TCP_MAXSEG
設置或接收最大出站 TCP 數據段尺寸。如果這蚇龠策b建立連接前的
設置,它將改變發送到另一端初始信息包中的 MSS C這蚧大於 MTU
接口N被忽略而不起作用。
TCP_CORK
設置此項將不發送部份幀。所有排隊的部份幀只在此項清除後,
才能發送。在調用 sendfile(2)
前準備數據報頭或對網路吞吐量進行優化有用處。 此選項不能與
TCP_NODELAY 聯用.
JXr IOCTLS
這些 ioctl 可以用 ioctl(2) 進行訪問。正確調用句法為:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
FIONREAD
返回接收緩存中排隊的未讀數據的數量。 變量參數是指向一-
蚞蒱澈針。
SIOCATMARK
如果使用者程式已經接收了所有緊急數據,此項返回 0。它與
SO_OOBINLINE 聯用。變量參數是對測試結果,指向一蚞蒱澈針。
TIOCOUTQ
返回在接口(socket)發送隊列中待發送數據數, 該指針返回是一-
蚞蒱。
XBz ERROR HANDLING
當網路發生錯誤時,TCP 協議將嘗試奐s發送數據包, 當-
奏o一定失敗次數後,產生超時錯 ETIMEDOUT 或報告在此連接上最後出錯消息。
有時程式需n更快地偵測到出錯狀態。這可以通過打開 SOL_IP 級別的
IP_RECVERR 接口選項。當此項打開後,所有入站 (incoming) 錯誤
被立即送到使用者程式中。小心使用該選項-它使 TCP 協議對路由的改
變和其他正常網路狀態變化的容錯性下陛C
` NOTES
當建立一茬s接時發生錯誤引發一蚢 SIGPIPE 接口寫操作,此操作 僅當
SO_KEEPOPEN 接口選項被設置時才能進行。
TCP 並不具有真正的額外頻帶(out-of-band)數據; 雖然它可以有緊 急數據。在
Linux 中這意味著如果有其他端發送緊急數據時,舊的緊
急數據將被當作普通數據插入數據流中。(即使 SO_OOBINLINE
S有被設置).這與基於 BSD 堆棧定義不同.
預設狀態下,Linux 使用與 BSD 相容的緊急數據指針字段。這與 RFC1122
協議相違I, 但這是與其他堆棧協議相互操作性所n求。它可以用 tcp_stdurg
sysctl 加以改變.
w~ ERRORS
EPIPE 另一端意外關閉了套接字連接或對一蚚鶶洶F的套接字進行讀操作。
ETIMEDOUT
一段時間後,另一端不確認奏o數據。
EAFNOTSUPPORT
在 sin_family 傳遞套接字地址類型而不是在 AF_INET中的。
任何定義為 ip(7) 出錯或普通套接字出錯可能返回為 TCP 出錯.
B BUGS
不是所有的錯誤都列入了文件。
沒有描z有關透明代理的選項
VERSIONS
有關 sysctl 是在 Linux 2.2 中新增的。 IP_RECVERR 是 Linux 2.2
中的新特性。 TCP_CORK 在 2.2 中是新的內容.
S SEE ALSO
socket(7), socket(2), ip(7), sendmsg(2), recvmsg(2).
RFC793 協議中對 TCP 有關描z.
RFC1122 協議中對 TCP n求和一份關於 Nagle 算法描z。
RFC2001 協議中一些 TCP 算法。
[]
LetBright <letbright@netease.com>
[]
2000/10/21
mlinuxan:
http://cmpp.linuxforum.net