網路連線狀態(11種)非常重要這裡既包含三次握手中的也包括四次斷開中的,所以要熟悉。
四次斷開過程
客戶端:傳送fin給伺服器表示主動請求斷開連線,然後自己進入fin_wait1階段,等待伺服器響應
伺服器:收到客戶端的fin請求,傳送ack給客戶端表示自己同意斷開連線,伺服器告訴上層【應用程式】有乙個連線要請求斷開並且進入close_wait階段,等待應用程式做好關閉準備,其實就是把還沒有傳送完的資料傳送完畢。
客戶端:收到ack以後進入fin_wait2狀態等待伺服器傳送fin。
伺服器:當應用程式做好關閉連線的準備後則傳送fin給客戶端,並且伺服器進入last_ack階段,等待客戶端最後確認。
客戶端:收到伺服器的fin以後傳送ack表示確認,此時客戶端進入time_wait階段,它並不是等什麼確認而是等一段時間保證ack可以有足夠的時間被伺服器收到,這個時間為1-4分鐘。之後連線關閉。
伺服器:收到客戶端的ack以後關閉連線。
任何tcp實現必須選擇乙個msl值,有兩種規範一種是乙個msl是2分鐘,另外一種是30秒,所以這就意味著time_wait狀態的持續時間為1-4分鐘。msl也是ip資料報在網際網路上能存活的最長時間。另外我們追蹤乙個ip包的時候會有跳數概念,最大跳數255,所以即便到達最大跳數也不能超過乙個msl時間。
那為什麼等2個msl而不是1個或者3個呢?
ip資料報的最大存活時長是1個msl,如果1個msl內客戶端傳送的ack丟了那麼伺服器肯定會重發最後乙個fin,而最後乙個fin這個資料報的最大存活時間也是1個msl,所以客戶端如果在2msl時間內又收到伺服器發來的fin,就表示之前客戶端傳送的ack確實丟了,這時候客戶端會再次傳送ack。所以設定為1個太短,3個沒必要。
客戶端傳送最後的ack以後,如果伺服器端收不到那麼伺服器會重發fin,所以在1乙個msl時間內是為了確保客戶端可以收到伺服器重發的fin(如果有必要)
如果在1msl內伺服器沒有重發fin,表示伺服器已經收到客戶端最後的ack,那麼也就表示雙方都正常關閉了連線
在time_wati階段,主動關閉的一方不能重新建立乙個和之前一樣的連線,這是為了避免造成屬於上乙個連線的資料被歸屬到這次新連線,所以經過2msl之後屬於之前連線的資料報能到的也就到了不能到的也就被丟棄了,同時對於伺服器來說它的應答資料也最多存活1msl。
其實任何一方都可以主動關閉,只是我們在實際過程中雙方通訊肯定有一方作為客戶端角色一方作為伺服器角色存在,所以這裡只是乙個角色並不是說伺服器不能主動關閉。在這裡你需要牢記的是主動關閉和被動關閉的一方各自都會有什麼狀態。
tcp斷開四次握手
1 a 獨奏大哥我給你發蒼井空經典合集都發完了 fin 2 b 恩.都收到了.ack 3 b 那今天就到這嘍,下次要有好的記得分享哦.fin 4 a 恩.好的.ack 這就是tcp四次握手斷開的過程.那可能有人會有疑問.在tcp連線握手時為何 ack是和syn一起傳送.這裡ack卻沒有何fin一起傳...
三次握手,四次斷開
三次握手,四次斷開 tcp是一種面向連線的單播協議,在傳送資料前,通訊雙方必須在彼此間建立一條連線。所謂的 連線 其實是客戶端和伺服器的記憶體裡儲存的乙份關於對方的資訊,如ip位址 埠號等。ack 確認,使得確認號有效。syn 用於初如化乙個連線的序列號。fin 該報文段的傳送方已經結束向對方傳送資...
tcp斷開連線四次揮手
tcp斷開連線是經歷了四次揮手的過程 1 客戶端主動斷開連線向服務端傳送 請求標誌位 fin 連線序號 seq 2 服務端收到請求後向客戶端傳送 確認請求標誌位 ack 確認連線序號 ack 3 服務端還會向客戶端傳送 請求標誌位 fin 連線序號 seq 4 客戶端在收到服務端資料後想服務端傳送 ...