【網絡編程】【TCP】TCP協議介紹,三次握手,四次揮手,TIME_WAIT狀態

       開始工作了,好久沒點開CSDN,發現自己居然有81個關注的,還有很多人評論,抱歉,我基本沒看見(我估計他們應該看不見),其實看見我大部分都不會,恕我知識淺薄。

       工作久了,發現自己的技術知識好像就停滯了,甚至是退步,準備拾起這個賬號開始更新一些知識點,可能是讀技術書學習的,可能是工作中遇到的。是對自己知識的整理,可以一種分享嘛。最近在看《UNIX網絡編程》,就一邊讀一遍做些整理,也參考了網上其他博客。

        言歸正傳,下面是知識點,這篇主要是介紹TCP。

 

一、TCP介紹

        TCP 傳輸控制協議(Transmission Control Protocol)。是個複雜,可靠,面向連接的協議。爲用戶進程提供可靠的全雙工字節流。TCP關心確認,超時,重傳之類的細節。大多是因特網應用程序使用的都是TCP。TCP既可以使用IPv4,也可以使用IPv6.

1 面向連接

       TCP會先建立連接,再誇該連接交換數據,最後終止該鏈接

 

2 可靠的

         當TCP向另一端發送數據時,它會要求對端回一個ACK,如果未收到數據,那麼TCP就會重傳數據並等待更長時間。在數次重傳失敗後,TCP才放棄,一般要花費4~10分鐘時間嘗試發送數據。

        並且TCP會動態計算RTT時間,以便知道等待一個確認需要多少時間。RTT就說客戶端和服務器之間的往返時間。

       TCP還會給每個字節關聯一個序號對發送的數據排序。如果數據未按照順序到達,TCP就會根據需要重新排序。並且在收到重複數據時,丟棄數據。

       對端TCP必須確認收到的數據,伴隨來自對端的ACK的不斷到達,本端TCP至此才 能從套接字發送緩衝區中丟棄已確認的數據。TCP必須爲已發送的數據保留一個副本,直到它被對端確認爲止。

 

3  流量控制

       TCP會告知對端在任何時刻可以從對端接收到多少個字節,這稱爲通告窗口。在任何時刻,該窗口指出接收緩衝區中當前可用的空間量,從而確保發送端發送的數據不會使接收緩衝區溢出。該窗口時刻動態變化:當接收到來自發送端的數據時,窗口大小就減小,但是當接收端應用從緩衝區中讀取數據時,窗口大小就增大。通告窗口大小減小到0是有可能的:當TCP對應某個套接字的接收緩衝區已滿,導致它必須等待應用從該緩衝區讀取數據時,方能從對端再接收數據。

 

4 全雙工

       這意味着在一個給定的連接上應用可以在任何時刻在進出兩個方向上既發送數據又接收數據。因此,TCP必須爲每個數據流方向跟蹤諸如序列號和通告窗口大小等狀態信息。建立一個全雙工連接後,需要的話可以把它轉換成一個單工連接。

 

 

二、TCP連接的建立和終止

1 三路握手

第一次握手:建立連接時,客戶端發送syn包(seq=x)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
 

2 四次揮手

(1)某個應用進程首先調用close,我們稱該端執行主動關閉(active close)。 該端的TCP於是發送一個FIN分節(seq=u),表示數據發送完畢。

(2)接收到這個FIN的對端執行被動關閉( passive close),回確認包(ack=u+1)它的接收也作爲一個文件結束符(end-of-file)傳遞給接收端應用進程,因爲FIN的接收意味着接收端應用進程在相應連接上再無額外數據可接收。

(3)服務器端傳輸完成數據後, 接收到這個文件結束符的應用進程將調用close關閉它的套接字。這導致它的TCP也發送一個FIN(seq=w)。

(4)接收這個最終FIN的客戶端,回確認包(ack=w+1)。

既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節。我們使用限定詞“通常”是因爲:某些情形下步驟1的FIN隨數據一起發送; 另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端, 有可能被合併成一個分節。

 

3 TCP分組交換

這個和之前是類似的值得注意的是在連接時,會發送MSS數據,這個是最大分節大小(maximum segment size)。就是它在本連接的每個TCP分節中願意接受的最大數據量。而且MSS選項可以避免數據包分片。

 

4 TCP狀態圖

 

 

 

三、TIME_ WAIT狀態

       毫無疑問,TCP中有關網絡編程最不容易理解的是它的TIME WAIT狀態。在上圖中我們看到執行主動關閉的那端經歷了這個狀態。該端點停留在這個狀態的持續時間是最長分節生命期(maximum segment liftime, MSL)的兩倍,有時候稱之爲2MSL。

 

1 TIME_ WAIT狀態有兩個存在的理由:

(1)可靠地實現TCP全雙工連接的終止;

(2)允許老的重複分節在網絡中消逝。

第一個理由可以通過查看圖2-5並假設最終的ACK丟失了來解釋。服務器將重新發送它的最終那個FIN,因此客戶必須維護狀態信息,以允許它重新發送最終那個ACK。要是客戶不維護狀態信息,它將響應以一個RST (另外一種類型的TCP分節),該分節將被服務器解釋成一個 錯誤。如果TCP打算執行所有必要的工作以徹底終止某個連接上兩個方向的數據流(即全雙工關閉), 那麼它必須正確處理連接終止序列4個分節中任何一個分節丟失的情況。本例子也說明了爲什麼執行主動關閉的那一端是處於TIME WAIT狀態的那一端: 因爲可能不得不重傳最終那個ACK的就是那一端。

爲理解存在TIME_ WAIT狀態的第二個理由,我們假設在12.106.32.254的1500端口和206.168.112.219的21端口之間有一個TCP連接。我們關閉這個連接,過一段時間後在相同的IP地址和端口之間建立另一個連接。後一個連接稱爲前一個連接的化身( incarnation),因爲它們的IP地址和端口號都相同。TCP必須防止來自某個連接的老的重複分組在該連接已終止後再現,從而被誤解成屬於同一連接的某個新的化身。爲做到這一點, TCP將不給處於TIME WAIT狀態的連接發起新的化身。既然TIME_ WAIT狀態的持續時間是MSL的2倍,這就足以讓某個方向上的分組最多存活MSL秒即被丟棄,另一個方向上的應答最多存活MSL秒也被丟棄。通過實施這個規則,我們就能保證每成功建立一個TCP連接時,來自該連接先前化身的老的重複分組都已在網絡中消逝了。

意思就說:若無TIME. WAIT壯態,如果客戶端還有消息在路上(比較慢),這時同IP和端口間又有了新的連接,那路上的未到達的消息很可能認爲是新連接的消息。

 

 

四、TCP協議

1 序列號seq:佔4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的編號由本地隨機產生;給字節編上序號後,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個字節的數據編號。

2 確認號ack:佔4個字節,期待收到對方下一個報文段的第一個數據字節的序號;序列號表示報文段攜帶數據的第一個字節的編號;而確認號指的是期望接收到下一個字節的編號;因此當前報文段最後一個字節的編號+1即爲確認號。

3 確認ACK:佔1位,僅當ACK=1時,確認號字段纔有效。ACK=0時,確認號無效

4 同步SYN:連接建立時用於同步序號。當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個連接請求,或連接接受報文。SYN這個標誌位只有在TCP建產連接時纔會被置1,握手完成後SYN標誌位被置0。

5 終止FIN:用來釋放一個連接。FIN=1表示:此報文段的發送方的數據已經發送完畢,並要求釋放運輸連接

PS:ACK、SYN和FIN這些大寫的單詞表示標誌位,其值要麼是1,要麼是0;ack、seq小寫的單詞表示序號。

字段 含義
URG  緊急指針是否有效。爲1,表示某一位需要被優先處理
ACK  確認號是否有效,一般置爲1。
PSH  提示接收端應用程序立即從TCP緩衝區把數據讀走。
RST 對方要求重新建立連接,復位。
SYN  請求建立連接,並在其序列號的字段進行序列號的初始值設定。建立連接,設置爲1
FIN  希望斷開連接。


   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章