TCP四次握手斷開連線

2022-08-27 18:00:11 字數 1480 閱讀 3039

建立連線非常重要,它是資料正確傳輸的前提;斷開連線同樣重要,它讓計算機釋放不再使用的資源。如果連線不能正常斷開,不僅會造成資料傳輸錯誤,還會導致套接字不能關閉,持續占用資源,如果併發量高,伺服器壓力堪憂。

建立連線需要三次握手,斷開連線需要四次握手,可以形象的比喻為下面的對話:

下圖演示了客戶端主動斷開連線的場景:

建立連線後,客戶端和伺服器都處於establised狀態。這時,客戶端發起斷開連線的請求:

1) 客戶端呼叫 close() 函式後,向伺服器傳送 fin 資料報,進入fin_wait_1狀態。fin 是 finish 的縮寫,表示完成任務需要斷開連線。

2) 伺服器收到資料報後,檢測到設定了 fin 標誌位,知道要斷開連線,於是向客戶端傳送「確認包」,進入close_wait狀態。

注意:伺服器收到請求後並不是立即斷開連線,而是先向客戶端傳送「確認包」,告訴它我知道了,我需要準備一下才能斷開連線。

3) 客戶端收到「確認包」後進入fin_wait_2狀態,等待伺服器準備完畢後再次傳送資料報。

4) 等待片刻後,伺服器準備完畢,可以斷開連線,於是再主動向客戶端傳送 fin 包,告訴它我準備好了,斷開連線吧。然後進入last_ack狀態。

5) 客戶端收到伺服器的 fin 包後,再向伺服器傳送 ack 包,告訴它你斷開連線吧。然後進入time_wait狀態。

6) 伺服器收到客戶端的 ack 包後,就斷開連線,關閉套接字,進入closed狀態。

客戶端最後一次傳送 ack包後進入 time_wait 狀態,而不是直接進入 closed 狀態關閉連線,這是為什麼呢?

tcp 是面向連線的傳輸方式,必須保證資料能夠正確到達目標機器,不能丟失或出錯,而網路是不穩定的,隨時可能會毀壞資料,所以機器a每次向機器b傳送資料報後,都要求機器b」確認「,回傳ack包,告訴機器a我收到了,這樣機器a才能知道資料傳送成功了。如果機器b沒有回傳ack包,機器a會重新傳送,直到機器b回傳ack包。

客戶端最後一次向伺服器回傳ack包時,有可能會因為網路問題導致伺服器收不到,伺服器會再次傳送 fin 包,如果這時客戶端完全關閉了連線,那麼伺服器無論如何也收不到ack包了,所以客戶端需要等待片刻、確認對方收到ack包後才能進入closed狀態。那麼,要等待多久呢?

資料報在網路中是有生存時間的,超過這個時間還未到達目標主機就會被丟棄,並通知源主機。這稱為報文最大生存時間(msl,maximum segment lifetime)。time_wait 要等待 2msl 才會進入 closed 狀態。ack 包到達伺服器需要 msl 時間,伺服器重傳 fin 包也需要 msl 時間,2msl 是資料報往返的最大時間,如果 2msl 後還未收到伺服器重傳的 fin 包,就說明伺服器已經收到了 ack 包。

tcp斷開四次握手

1 a 獨奏大哥我給你發蒼井空經典合集都發完了 fin 2 b 恩.都收到了.ack 3 b 那今天就到這嘍,下次要有好的記得分享哦.fin 4 a 恩.好的.ack 這就是tcp四次握手斷開的過程.那可能有人會有疑問.在tcp連線握手時為何 ack是和syn一起傳送.這裡ack卻沒有何fin一起傳...

tcp 三次握手連線,四次握手斷開

tcp握手協議 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線.第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 第二次握手 伺服...

TCP斷開連線的四次握手流程

1.客戶端向服務端傳送乙個fin包m,然後進入fin wait狀態。m為請求序號 正確理解為 fin 1,seq m 2.服務端接收到fin包,傳送乙個ack應答,ack 1,ack m 1給客戶端,然後服務端進入close wait狀態 3.服務端向客戶傳送乙個fin包n,然後進入lask ack...