TCP協議詳解


TCP/IP詳解

網絡協議通常分不同層次進行開發,每一層分別負責不同的通信功能
一個協議族,比如TCP/IP,是一組不同層次上多個協議的組合
TCP/IP通常被認為是一個四層組織協議
TCP/IP

  1. 鏈路層,有時也稱作數據鏈路層和網絡接口層,通常包括操作系統中的設備驅動程序和計算機中對應的網絡接口卡
  2. 網絡層,有時也稱作互聯網層,處理分組在網絡中的活動。在TCP/IP協議族中,網絡層協議包括IP協議(網際協議),ICMP協議(Internet互聯網控制報文協議),IGMP協議(Internet組管理協議)
  3. 運輸層主要為兩台主機上的應用程序提供端到端的通信。TCP和UDP
  4. 應用層負責處理特定的應用程序細節
    TCP/IP

TCP:傳輸控制協議

TCP提供一種面向連接的、可靠地字節流服務
TCP通過下列方式來提供可靠性

  • 應用數據被分割成TCP認為最適合發送的數據塊
  • 自適應的超時及重傳
  • 當TCP收到發自TCP連接另一端的數據,它將發送一個確認(這個確認通常會推遲幾分之一秒)
  • TCP將保持它首部和數據的檢驗和
  • TCP報文段是作為IP數據包來傳輸的,因此到達可能會失序。如果必要,TCP將對收到的數據進行重新排序
  • 接收端丟棄重復的數據
  • 提供流量控制

TCP的首部

TCP數據被封裝在一個IP數據報中
IP數據報
TCP首部的數據格式。如果不計任何字段,它通常是20個字節
首部數據格式
一個IP地址和一個端口號也稱為一個socket,socket pair可唯一確定互聯網絡中每個TCP連接的雙方。
序號用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的第一個數據字節。
當建立一個新的連接時,SYN標志變為1。

  • URG 緊急指針有效
  • ACK 確認序號有效
  • PSH 接收方應該盡快將這個報文段交給應用層
  • RST 重建連接
  • SYN 同步序號用來發起一個連接
  • FIN 發端完成發送任務

TCP連接的建立和終止

三次握手
1 請求短發送一個SYN段指明客戶打算連接的服務器端口,以及初始序號(ISN)
2 服務器發回包含服務器的初始序號的SYN報文段作為應答。同時,將確認序號設置為客戶的ISN+1以對客戶的SYN報文段進行確認。一個SYN將占用一個序號
3 客戶必須將確認序號設置為服務器的ISN+1以對服務器的SYN報文段進行確認
三次握手

連接終止
1 進行關閉的一方發送第一個FIN
2 服務器收到FIN,發回一個ACK,確認序號為收到的序號+1。和SYN一樣,一個FIN將占用一個序號。
3 同時TCP服務器還向應用程序傳送一個文件結束符。接着這個服務器就關閉它的連接,導致它的TCP端發送一個FIN。
4 客戶必須發回一個FIN,並將確認序號設置為收到序號+1。

最大報文長度

最大報文長度(MSS)表示TCP傳往另一端的最大數據塊的長度。
MSS讓主機限制另一端發送數據報的長度。加上主機也能控制它發送數據報的長度,這將使以較小MTU連接到一個網絡上的主機避免分段。

TCP的半關閉

TCP提供了連接的一端在結束它的發送后還能接收來自另一端數據的能力,這就是所謂的半關閉。

TCP的狀態變遷圖

狀態變遷圖

2MSL等待狀態

TIME_WAIT狀態也稱為2MSL等待狀態。
對一個具體實現所給定的MSL值,處理的原則是:當TCP執行一個主動關閉,並發回最后一個ACK,該連接必須在TIME_WAIT狀態停留的時間為2倍的MSL。
這種2MSL等待的另一個結果是這個TCP連接在2MSL等待期間,定義這個連接的插口不能再被使用。這個連接只能在2MSL結束后才能再被使用。

平靜時間的概念

TCP在重啟后的MSL秒內不能建立任何連接

FIN_WAIT_2

只有當另一端的進程完成這個關閉,我們這端才會從FIN_WAIT_2狀態進入TIME_WAIT狀態。

復位報文段

TCP首部中的RST是用於復位的。一般來說,無論何時一個報文段發往基准的連接出現錯誤,TCP都會發出一個復位報文段。

  1. 到不存在的端口的連接請求
  2. 異常終止一個連接
  3. 檢測版打開連接

TCP的成塊數據流

TCP使用滑動窗口協議來進行流量控制。該協議允許發送方在停止並等待確認前可以連續發送多個分組。由於發送方不必每發一個分組就停下來等待確認,因此該協議可以加速數據的傳輸。
數據塊傳輸
1 發送方不必發送一個全窗口大小的數據
2 來自接收方的一個報文段確認數據並把窗口向右滑動。因為窗口的大小是相對於確認序號的。
3 窗口的大小可以減小,但是窗口的右邊沿卻不能向左滑動。
4 接受方在發送一個ACK前不必等待窗口被填滿。
滑動窗口

PUSH標志

使用API通知TCP設置正在接收數據的PUSH標志或得到該數據是否被設置PUSH標志的信息是不可能的。

慢啟動

慢啟動為發送方的TCP增加了一個窗口:擁塞窗口,記為cwnd。
當與另一個網絡的主機建立TCP連接時,擁塞窗口被初始化為1個報文段。沒收到一個ACK,擁塞窗口就增加一個報文段。
發送方取擁塞窗口與通告窗口中的最小值作為發送上限。
擁塞窗口是發送方使用的流量控制,而通告窗口則是接收方使用的流量控制。

寬帶時延乘積

通道容量: capatity(bit)=bandwidth(b/s)*round-trip time(s)

擁塞

當數據到達一個大的管道並向一個較小的管道發送時
當多個輸入流到達一個路由器,而路由器的輸出流小於這些輸入流的總和時

TCP的超時與重傳

TCP通過在發送時設置一個定時器來解決數據和確認丟失的問題。如果當定時器溢出時還沒有收到確認,它就重傳該數據。
對每個連接,TCP管理4個不同的定時器:
1 重傳定時器使用於當希望收到另一端的確認。
2 堅持(persist)定時器使窗口大小信息保持不斷流動,即使另一端關閉了其接收窗口。
3 保活(keepalive)定時器可以檢測到一個空閑連接的另一端何時崩潰或重啟。
4 2MSL定時器測量一個連接處於TIME_WAIT狀態的時間。

往返時間(RTT)

$$ R\leftarrow \alpha R+\left( 1-d\right)M $$
$$ Err=M-A $$
$$ A\leftarrow A+gErr $$
$$ D\leftarrow D+h\left(|Err| -D\right) $$
$$ RTO = A+4D $$

M表示測量得到的RTT
\(\alpha\)是一個推薦值為0.9的平滑因子
A是被平滑的RTT
D是被平滑的均值方差
Err是剛得到的測量結果與當前的RTT估計器之差
增量g起平均作用,取為0.125
偏差的增益是h,取值為0.25

具體計算實例參考TCP-IP詳解卷一第21章

TCP的堅持定時器

ACK的傳輸並不可靠,TCP不對ACK報文段進行確認,TCP只確認那些包含有數據的ACK報文段。
如果一個確認丟失了,則雙方就有可能因為等待對方而是連接終止:接收方等待接收數據,而發送方在等待允許它繼續發送數據的窗口更新。為防止這種死鎖情況的發生,發送方使用一個堅持定時器來周期性的向接收方查詢,以便發現窗口是否已增大。這些從發送方發出的報文段稱為窗口探查。

TCP的保活定時器

如果一個給定的連接在兩個小時之內沒有任何動作,則服務器就向客戶發送一個探查報文段。客戶主機必須處於以下4個狀態之一:
1 客戶主機依然正常運行,並從服務器可達。客戶的TCP響應正常,而服務器也知道對方是正常工作的。服務器在2個小時以后將保活定時器復位。如果在兩個小時定時器到時間之前有應用程序的通信量通過此連接,則定時器在交換數據后的未來2小時再復位
2 客戶主機已經崩潰,並且關閉或者常在重啟。在任何一種情況下,客戶的TCP都沒有響應。服務器將不能夠收到對方的探查,並在75秒后超時。服務器總共發送10個這樣的探查,每個間隔75秒。如果服務器沒有收到一個響應,它就認為客戶主機已經關閉並終止連接。
3 客戶主機崩潰並已經重新啟動。這時服務器將收到一個對其保活探查的響應,但是這個響應是一個復位,使得服務器終止這個連接。
4 客戶主機正常運行,但是服務器不可達。與狀態2相同


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM