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 |