三次握手、四次揮手和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;socket

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

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


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


 

四次揮手:3d


因爲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首部。若是一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超市的許多狀況中,也會發送不帶任何數據的報文段。

相關文章
相關標籤/搜索