TCP協議詳解及三次握手與四次分手

TCP協議是面向連接、保證高可靠性(數據無丟失、數據無失序、數據無錯誤、數據無重複到達)傳輸層協議。

TCP協議頭部

TCP協議頭部
首部長度:表明TCP首部中32 bit字的數目,如是0101,則說明TCP首部長度是5 * 4 = 20字節。
標識位:
1. ACK : TCP協議規定,只有ACK=1時有效,也規定連接建立後所有發送的報文的ACK必須爲1
2. SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連接請求或連接接受報文。
3. FIN (finis)即完,終結的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,並要求釋放連接。

注意:如果僅僅發送ACK,不包含數據的話。因爲不包含數據,所以大小爲0,不佔用序號

序號:
1. 當發送syn標記時將消耗一個序號;
2. 發送fin標記時將消耗一個序號;
3. 數據是每個字節一個序號;
TCP:SEQ號與ACK號

三次握手過程

注意:因爲一個SYN將佔用一個序號,所以序號要加1。
這裏寫圖片描述

爲什麼要進行三次握手呢(兩次確認)?

這裏寫圖片描述

四次分手的過程

這裏寫圖片描述
當客戶A 沒有東西要發送時就要釋放 A 這邊的連接,A會發送一個報文(沒有數據),其中 FIN 設置爲1, 服務器B收到後會給應用程序一個信,這時A那邊的連接已經關閉,即A不再發送信息(但仍可接收信息)。 A收到B的確認後進入等待狀態,等待B請求釋放連接, B數據發送完成後就向A請求連接釋放,也是用FIN=1 表示, 並且用 ack = u+1(如圖), A收到後回覆一個確認信息,並進入 TIME_WAIT 狀態, 等待 2MSL 時間。

爲什麼要等待2MSL才能返回到CLOSE狀態?

爲了這種情況: B向A發送 FIN = 1 的釋放連接請求了, A迴應確認信息,但是該報文丟失了,B沒有收到ACK, B 超時會重傳,這時A在 WAIT_TIME 還能夠接收到這個請求,這時再回復一個確認就行了。(A收到 FIN = 1 的請求後 WAIT_TIME會重新記時)

等待時間爲什麼是2MSL?

數據包在網絡中是有生存時間的,超過這個時間還未到達目標主機就會被丟棄,並通知源主機。這稱爲報文最大生存時間(MSL,Maximum Segment Lifetime)。TIME_WAIT 要等待 2MSL 纔會進入 CLOSED 狀態。ACK 包到達服務器需要 MSL 時間,服務器重傳 FIN 包也需要 MSL 時間,2MSL 是數據包往返的最大時間,如果 2MSL 後還未收到服務器重傳的 FIN 包,就說明服務器已經收到了 ACK 包。

保活狀態

服務器B存在一個保活狀態,即如果A突然故障死機了,那B那邊的連接資源什麼時候能釋放呢? 就是保活時間到了後,B會發送探測信息, 以決定是否釋放連接。

爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?

答:因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

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