TCP(7) | Linux Programmer's Manual | TCP(7) |
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 接口選項,調用 getsockopt(2) 進行讀操作或調用 setsockopt(2) 將接口系列選項參數傳送到 SOL_TCP 中去.另外,大多數 SOL_IP 接口 選項對 TCP 接口也適用。更多資料,請參見 ip(7).
這些 ioctl 可以用 ioctl(2) 進行訪問。正確調用句法爲:
int value; error = ioctl(tcp_socket, ioctl_type, &value);
當網絡發生錯誤時,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 加以改變.
任何定義爲 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 <letbright@netease.com>
2000/10/21
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
25 Apr 1999 | Linux Man Page |