tcp - 傳輸控制協議 (TCP)
#include <sys/socket.h>
#include <netinet/in.h>
tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
本協議是對 RFC973, RFC1122 和 RFC2001
定義的協議 及其 NewReno 和
SACK 擴充部份實現的。
它在建立在網際網路協議
ip(7)
之上的兩個套接字之間提供了可靠的面向資料流的全雙工連線。
TCP
協議確保了資料按序到達並在資料包丟失時自動重發。
它產生和校驗每個資料包的校驗和
(checksum)
用以捕捉資料傳輸時錯誤。TCP
不保留記錄的上下限。
初始的 TCP
介面不包含遠端或本地址並且沒有規定明確。
在產生一個出站 (outgoing) TCP
連線時使用
connect(2)
來與另個套接字建立一個網路介面。
在接收一個入站 (incoming)
連線時,套接字使用
bind(2)
先取得本地地址和埠,然後呼叫
listen(2)
使套接字進入偵聽狀態。
隨後可以用
accept(2).
接受為每一個入站 (incoming)
連線建立的新套接字。
一個已經經過
accept 或
connect
成功呼叫的套接字表示它已完全明確,可以進行資料傳送。
在偵聽狀態或尚未建立連線的網路介面之間資料傳送將不能進行。
Linux 2.2 支援 RFC1323 TCP
高效能擴充套件。這包括採用大
TCP 資料滑移
窗以支援高延時或高頻寬下的多連線。為實現這些功能,必須增加接
收與傳送的資料快取區。它們可以使用
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
支援緊急資料。緊急資料用來通知接收方,在資料流中有需要儘快處理
的重要資訊。傳送緊急資料,需在
send(2). 中指定
MSG_OOB
選項。當緊急資料接收後,核心傳送
SIGURG
訊號到讀程序或者那些用
ioctl 設定了
FIOCSPGRP 或
FIOCSETOWN
套接字的程序或程序組.
當打開了
SO_OOBINLINE
套接字選項,
那麼緊急資料被放入普通資料流中。
(可以用
SIOCATMARK ioctl 來測試),
否則只有設定了
sendmsg(2)
中的
MSG_OOB
標誌時,資料才能被接收。
TCP 是建立在 IP 之上(參見
ip(7)).
ip(7)
定義定義的地址格式也適用於
TCP.
TCP只支援點對點通訊,不支援全域性及多址廣播。
可以透過訪問
/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)。
設定或取得 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
聯用.
這些 ioctl 可以用
ioctl(2)
進行訪問。正確呼叫句法為:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
- FIONREAD
- 返回接收快取中排隊的未讀資料的數量。
變數引數是指向一個整數的指標。
- SIOCATMARK
- 如果使用者程式已經接收了所有緊急資料,此項返回值為
0。它與 SO_OOBINLINE
聯用。變數引數是對測試結果,指向一個整數的指標。
- TIOCOUTQ
- 返回在介面(socket)傳送佇列中待發送資料數,
該指標返回是一個整數數值。
當網路發生錯誤時,TCP
協議將嘗試重新發送資料包,
當重發一定失敗次數後,產生超時錯
ETIMEDOUT
或報告在此連線上最後出錯訊息。
有時程式需要更快地偵測到出錯狀態。這可以透過開啟
SOL_IP 級別的
IP_RECVERR
介面選項。當此項開啟後,所有入站
(incoming) 錯誤
被立即送到使用者程式中。小心使用該選項-它使
TCP 協議對路由的改
變和其他正常網路狀態變化的容錯性下降。
當建立一個連線時發生錯誤引發一個對
SIGPIPE
介面寫操作,此操作
僅當
SO_KEEPOPEN
介面選項被設定時才能進行。
TCP
並不具有真正的額外頻帶(out-of-band)資料;
雖然它可以有緊
急資料。在 Linux
中這意味著如果有其他端傳送緊急資料時,舊的緊
急資料將被當作普通資料插入資料流中。(即使
SO_OOBINLINE
值沒有被設定).這與基於
BSD 堆疊定義不同.
預設狀態下,Linux 使用與
BSD
相容的緊急資料指標欄位。這與
RFC1122 協議相違背,
但這是與其他堆疊協議相互操作性所要求。它可以用
tcp_stdurg sysctl 加以改變.
- EPIPE
- 另一端意外關閉了套接字連線或對一個關閉了的套接字進行讀操作。
- ETIMEDOUT
- 一段時間後,另一端不確認重發資料。
- EAFNOTSUPPORT
- 在 sin_family
傳遞套接字地址型別而不是在
AF_INET中的。
任何定義為
ip(7)
出錯或普通套接字出錯可能返回為
TCP 出錯.
不是所有的錯誤都列入了文件。
沒有描述有關透明代理的選項
有關 sysctl 是在 Linux 2.2
中新增的。
IP_RECVERR 是 Linux 2.2
中的新特性。
TCP_CORK 在 2.2
中是新的內容.
socket(7),
socket(2),
ip(7),
sendmsg(2),
recvmsg(2).
RFC793 協議中對 TCP 有關描述.
RFC1122 協議中對 TCP
要求和一份關於 Nagle
演算法描述。
RFC2001 協議中一些 TCP
演算法。
LetBright <[email protected]>
2000/10/21
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh