三次握手、四次揮手和2MSL

建立連接-三次握手

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


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


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


完成三次握手,客戶端與服務器開始傳送數據。以上稱爲三次握手。 


wKiom1XRq9aBYiBIAAFbSqrASQ4353.jpg


  1. 145.254.160.237向65.208.228.223發送seq,同時SYN標誌位設置爲1;

  2. 65.208.228.223接收到請求報文,回覆seq和ack(ack=seq+1),同時SYN和ACK標誌位設置爲1;

  3. 請求端接收到確認報文報,回覆ACK進行確認,同時seq=seq+1和ack; 


初始化序列號:與操作系統有關,操作系統開機時通過某個算法將序列號上漲,在某一時刻進行三次握手,握手建立成功之後,初始化系列號增長跟傳輸字節數有關係。不在通過原來的算法增長。


 

四次揮手:


由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉[1] 。

  1. TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送。

  2. 服務器收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN一樣,一個FIN將佔用一個序號。

  3. 服務器關閉客戶端的連接,發送一個FIN給客戶端。

  4. 客戶端發回ACK報文確認,並將確認序號設置爲收到序號加1。

wKiom1XR1MHTdiOnAACUjKTqHCw651.jpg


TIME_WAIT狀態也成爲2MSL等待狀態。每個TCP實現必須選擇一個報文段最大生存時間MSL(Maximum Segment Lifetime)。它是任何報文段被丟棄前在網絡內的最長時間。

RFC中之處MSL爲2分鐘,然後現實中常用值是30秒,1分鐘或者2分鐘。

對於一個具體實現所給定的MSL值,處理原則是:當TCP執行一個主動關閉,併發回最後一個ACK,該鏈接必須在TIME_WAIT狀態停留的時間爲2倍的MSL。這樣可讓TCP再次發送最後的ACK以防止這個ACK丟失。

這種2MSL等待的另一個結果就是這個TCP連接在2MSL等待時間,這個連接的socket不能再被使用,只能在2MSL結束之後才能再被使用。

 

在連接處於2MSL等待時,任何遲到的報文段將被丟棄,因爲處於2MSL等待的,有該插口對(socket pair)定義的鏈接在這段時間內不能再被使用。


最大報文長度

當建立一個連接時,每一方都有用於通告它期望接收的MSS選項(MSS只能出現在SYN報文段中)。如果一方不接收來自另一方的MSS值,則MSS就定爲默認的536字節。

一般來說,如果沒有分段發生,MSS還是越大越好。報文段越大允許每個報文段傳送的數據就越多,相對IP和TCP首部有更高的網絡利用率。當TCP發送一個SYN時,或者因爲一個本地應用進程想發起一個連接,或者是因爲另一端的主機收到了一個連接請求,它能將MSS值設置爲外出口的MTU長度減去IP首部和TCP首部,對於一個以太網,MSS值可達到1460字節。


TCP 提供面向連接、可靠的字節流服務

面向連接意味着兩個使用TCP的應用在彼此交換數據前先建立一個TCP連接

TCP通過下列方式提供可靠性:

1.應用數據被分割成TCP認爲最合適發送的數據塊(一般情況下,TCP的包不會超過1500,因爲TCP會在三次握手時候協商最大傳輸單元)

2.當TCP發送一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。(發一個包,等待確認,如果不對這個包進行確認,會在一定時間內進行重發)

3.當TCP收到發自TCP連接另一端的數據,它將發送一個確認,這個確認不是立即發送,通常將推遲幾分之一秒。(收到包之後,不會立即確認,會等待幾分之一秒之後)

4.TCP將保持它首部和數據的校驗和(計算校驗和時需要加入僞首部進行驗證校驗和)

5.既然TCP報文段作爲IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。

6.既然IP數據報發生重複,TCP的接收端必須丟棄重複的數據。()

7.TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。這將防止較快主機致使較慢主機的緩衝區溢出。(緩存溢出或者緩存不夠,會通知發起方,發起方就不會再繼續發送)


每個TCP段都包含源端口和目的端口號,用於尋找發端和接受端應用進程。這兩個值加上IP首部中的源IP地址和目的IP地址唯一確定一個TCP連接。

一個IP地址和一個端口號也成爲一個插口(socket),插口對(socketpair)(包含客戶IP地址、客戶端口號、服務器IP地址和服務器端口號的四元組)可唯一確定互聯網絡中每個TCP連接的雙方

序號用來標識從TCP發送端向TCP發送端發送的數據字節流,它標識在這個報文段中的第一個數字字節。如果將字節流看做在兩個應用程序間的單向流動,則TCP用序號對每個字節進行計數。序號是32bit的無符號數,序號到達23^2-1後從0開始。SYN標誌消耗了一個序號,算一個字節,同樣FIN也算一個字節,其他ACK,RST均不算。

確認序號應當是上次已經成功收到數據字節序號加1.只有ACK標誌爲1時確認序號字段纔有效。

發送ACK無需任何代價,因爲32bit的確認序號字段和ACK標誌一樣,總是TCP首部的一部分。因此,我們看到一旦一個連接建立起來,這個字段總是被設置,ACK標誌也總是被設置爲1.

TCP爲應用層提供全雙工服務。這意味數據能在兩個方向上獨立地進行傳輸。因此,連接的每一端必須保持每個方向上的傳輸數據序號。

TCP首部最多有60字節的首部,沒有任何選項字段,正常長度都是20字節。

TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小爲字節數,起始於確認序號字段指明的值,這個值是接收端正期望接收的字節。窗口大小是一個16bit字段,因而窗口大小最大爲65535字節。

檢驗和覆蓋整個的TCP報文段:TCP首部和TCP數據。這是一個強制性的字段,一定是由發起段計算和存儲,並有接收端進行驗證。TCP檢驗和的計算和UDP的計算相似。

只有當URG標誌置爲1時緊急指針纔有效。緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。

最常見的可選字段是最長報文大小,又稱爲MSS(Maximum SegmentSize)。每個鏈接方通常都在通信的第一個報文段(爲建立連接而設置SYN標誌的那個段)中指明這個選項。它表明本端所能接收最大長度的報文段。

TCP報文段的數據部分是可選的。在一個連接建立和一個連接終止時,雙方交換的報文段僅有TCP首部。如果一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超市的許多情況中,也會發送不帶任何數據的報文段。


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