TCP的三次握手和四次揮手

2021-08-17 01:09:12 字數 2674 閱讀 3249

三次握手:

第一次握手:客戶端向伺服器傳送連線請求包,標誌位syn(同步序號)置為 seq = x;

第二次握手:伺服器收到客戶端發過來報文,由 syn = x 知道客戶端要求建立聯機。向客戶端傳送乙個包含syn和ack的tcp報文,

其中伺服器向客戶端傳送連線請求包,標誌位syn(同步序號)置為 y=1;

將確認序號(ack)設定為客戶的序列號加1,即 x+1 ,

第三次握手:客戶端收到伺服器發來的包後檢查確認序號(ack)是否正確,即第一次傳送的序號加1(x+1);

若正確,伺服器再次傳送確認序號(ack) = y+1;

伺服器收到確認序號值 ack=2 則連線建立成功,可以傳送資料了。

四次揮手:

第一次揮手:客戶端給伺服器傳送tcp包,用來關閉客戶端到伺服器的資料傳送。將標誌位fin 置為 x 和ack置為 y;

第二次揮手:伺服器收到fin後,發回乙個ack(標誌位ack=1),確認序號為收到的序號加1,即 x+1 ;

第三次揮手:伺服器關閉與客戶端的連線,傳送乙個fin,標誌位fin和ack置為1,序號為 y;

第四次揮手:客戶端收到伺服器傳送的fin之後,發回ack確認,確認序號為收到的序號加1,即y+1,伺服器收到ack為y+1後關閉。

為什麼是三次握手:

三次握手可以簡單看做是客戶傳送請求,伺服器對客戶的請求進行確認,客戶對伺服器的確認再進行確認。

如果採用兩次握手,假設下面這種情況,客戶向伺服器傳送請求,伺服器沒有對客戶的請求進行確認(因為網路的延遲他可能沒有收到這個請求)。

客戶收不到這個確認於是過一段時間他在向伺服器發起連線請求並順利完成資料傳輸,

但是過了一段時間這個請求到達了伺服器而伺服器誤以為這是乙個新的連線請求,於是對這個請求進行確認並傳送確認給客戶,

但是客戶沒有發起過連線請求因此它不會理會伺服器的確認,伺服器以為這個連線已經建立好了於是一直等待客戶傳送資料,這樣就會造成伺服器的資源浪費。

如果採用三次握手上述情況客戶不會向伺服器的確認進行確認,這樣伺服器收不到確認它就知道客戶沒有要發起請求的連線,於是不會再等待。

三次握手主要是為了防止已失效的連線請求報文突然到達伺服器,造成伺服器的等待和資源的浪費。

為什麼是四次揮手:

在三次握手的過程中,syn和ack是一起傳送的,但是在四次揮手的時候fin和ack卻不是一起傳送的而是分開傳送的,為什麼呢?

那是因為tcp連線是全雙工的,也就是說接收到fin只是說沒有資料再發過來,但是還是可以傳送資料的,也就是接受到乙個fin只是關閉了乙個方向的資料傳輸,

另乙個方向還可以繼續傳送資料。在四次揮手的時候也是這樣前兩次揮手只是確認關閉了乙個方向的資料,加上後面兩次揮手才真正的關閉了整個全雙工連線。

當socket在estabished狀態時,他想主動關閉連線於是向對方傳送fin請求,傳送完fin請求後它處於fin_wait_1狀態,當對方確認ack報文後則處於fin_wait_2狀態。

fin_wait_2表示半連線,也就是有一方要求關閉連線,另一方收到請求但是告訴她我還有一些資料要傳送稍後會關閉。time_wait狀態表示收到對方的fin並傳送出ack。

如果三次揮手可能在關閉後還有乙個方向沒有關閉。

2msl:

2msl即兩倍的msl,tcp的客戶端在第四次揮手後並沒有直接close關閉,而是進入time_wait狀態,也稱為2msl等待狀態,

為什麼要有2msl等待狀態?

當tcp的一端發起主動關閉,在發出最後乙個ack包後,

即第3次揮手完成後傳送了第四次揮手的ack包後就進入了time_wait狀態,

必須在此狀態上停留兩倍的msl時間,

等待2msl時間主要目的是怕最後乙個 ack包對方沒收到,

那麼對方在超時後將重發第三次揮手的fin包,

主動關閉端接到重發的fin包後可以再發乙個ack應答包。

在time_wait狀態 時兩端的埠不能使用,要等到2msl時間結束才可繼續使用。

當連線處於2msl等待階段時任何遲到的報文段都將被丟棄。

rfc 793 中 msl規定為2分鐘,兩倍的msl即為4分鐘, 但是實際應用中一般為30秒,1分鐘或2分鐘不等。

tcp的十種狀態:

1.伺服器的listen狀態(伺服器呼叫listen方法)

2.客戶端的syn_sent狀態(客戶端呼叫connect方法,客戶端傳送完第一次握手後的狀態)

3.伺服器的syn_rcvd狀態(伺服器呼叫accept方法,伺服器傳送完第二次握手後的狀態)

4.三次握手完成,客戶端和伺服器都進入established狀態(客戶端傳送完第三次握手後的狀態,以及伺服器接收完第三次握手後狀態)

5.客戶端的fin_wait_1狀態(客戶端傳送完第一次揮手後的狀態)

6.伺服器的close_wait狀態(伺服器接收到第一次揮手,並傳送完第二次揮手後的狀態)

7.客戶端的fin_wait_2狀態(客戶端接收到第二次揮手後的狀態)

8.伺服器的last_ack狀態(伺服器傳送完第三次揮手後的狀態)

9.客戶端的time_wait狀態(客戶端收到第三次揮手並傳送第四次揮手後的狀態)

10.客戶端和伺服器的closed狀態(伺服器收到第四次揮手後關閉狀態,客戶端2msl過後關閉狀態)

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

TCP三次握手和四次揮手

一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...

TCP三次握手和四次揮手

三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...