TCP協(xié)議詳解

TCP/IP詳解

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


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


    TCP/IP

TCP:傳輸控制協(xié)議

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

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

TCP的首部

TCP數(shù)據(jù)被封裝在一個IP數(shù)據(jù)報中


IP數(shù)據(jù)報

TCP首部的數(shù)據(jù)格式。如果不計任何字段,它通常是20個字節(jié)


首部數(shù)據(jù)格式

一個IP地址和一個端口號也稱為一個socket,socket pair可唯一確定互聯(lián)網(wǎng)絡中每個TCP連接的雙方。
序號用來標識從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個報文段中的第一個數(shù)據(jù)字節(jié)。

當建立一個新的連接時,SYN標志變?yōu)?。

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

TCP連接的建立和終止

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


三次握手

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

最大報文長度

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

TCP的半關(guān)閉

TCP提供了連接的一端在結(jié)束它的發(fā)送后還能接收來自另一端數(shù)據(jù)的能力,這就是所謂的半關(guān)閉。

TCP的狀態(tài)變遷圖

狀態(tài)變遷圖

2MSL等待狀態(tài)

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

平靜時間的概念

TCP在重啟后的MSL秒內(nèi)不能建立任何連接

FIN_WAIT_2

只有當另一端的進程完成這個關(guān)閉,我們這端才會從FIN_WAIT_2狀態(tài)進入TIME_WAIT狀態(tài)。

復位報文段

TCP首部中的RST是用于復位的。一般來說,無論何時一個報文段發(fā)往基準的連接出現(xiàn)錯誤,TCP都會發(fā)出一個復位報文段。

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

TCP的成塊數(shù)據(jù)流

TCP使用滑動窗口協(xié)議來進行流量控制。該協(xié)議允許發(fā)送方在停止并等待確認前可以連續(xù)發(fā)送多個分組。由于發(fā)送方不必每發(fā)一個分組就停下來等待確認,因此該協(xié)議可以加速數(shù)據(jù)的傳輸。


數(shù)據(jù)塊傳輸

1 發(fā)送方不必發(fā)送一個全窗口大小的數(shù)據(jù)
2 來自接收方的一個報文段確認數(shù)據(jù)并把窗口向右滑動。因為窗口的大小是相對于確認序號的。
3 窗口的大小可以減小,但是窗口的右邊沿卻不能向左滑動。
4 接受方在發(fā)送一個ACK前不必等待窗口被填滿。


滑動窗口

PUSH標志

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

慢啟動

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

寬帶時延乘積

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

擁塞

當數(shù)據(jù)到達一個大的管道并向一個較小的管道發(fā)送時
當多個輸入流到達一個路由器,而路由器的輸出流小于這些輸入流的總和時

TCP的超時與重傳

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

往返時間(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是剛得到的測量結(jié)果與當前的RTT估計器之差
增量g起平均作用,取為0.125
偏差的增益是h,取值為0.25

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

TCP的堅持定時器

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

TCP的?;疃〞r器

如果一個給定的連接在兩個小時之內(nèi)沒有任何動作,則服務器就向客戶發(fā)送一個探查報文段??蛻糁鳈C必須處于以下4個狀態(tài)之一:
1 客戶主機依然正常運行,并從服務器可達??蛻舻腡CP響應正常,而服務器也知道對方是正常工作的。服務器在2個小時以后將?;疃〞r器復位。如果在兩個小時定時器到時間之前有應用程序的通信量通過此連接,則定時器在交換數(shù)據(jù)后的未來2小時再復位
2 客戶主機已經(jīng)崩潰,并且關(guān)閉或者常在重啟。在任何一種情況下,客戶的TCP都沒有響應。服務器將不能夠收到對方的探查,并在75秒后超時。服務器總共發(fā)送10個這樣的探查,每個間隔75秒。如果服務器沒有收到一個響應,它就認為客戶主機已經(jīng)關(guān)閉并終止連接。
3 客戶主機崩潰并已經(jīng)重新啟動。這時服務器將收到一個對其?;钐讲榈捻憫沁@個響應是一個復位,使得服務器終止這個連接。
4 客戶主機正常運行,但是服務器不可達。與狀態(tài)2相同

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 為什么會有TCP/IP協(xié)議 在世界上各地,各種各樣的電腦運行著各自不同的操作系統(tǒng)為大家服務,這些電腦在表達同一種信...
    RaphetS閱讀 280,120評論 12 294
  • 1.這篇文章不是本人原創(chuàng)的,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,340評論 6 174
  • 傳輸層-TCP, TCP頭部結(jié)構(gòu) ,TCP序列號和確認號詳解 TCP主要解決下面的三個問題 1.數(shù)據(jù)的可靠傳輸...
    抓兔子的貓閱讀 4,621評論 1 46
  • 個人認為,Goodboy1881先生的TCP /IP 協(xié)議詳解學習博客系列博客是一部非常精彩的學習筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,184評論 0 8
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,309評論 6 13

友情鏈接更多精彩內(nèi)容