1、 客戶端傳送fin報文段,進入fin_wait_1狀態。
2、 伺服器端收到fin報文段,傳送ack表示確認,進入close_wait狀態。
3、 客戶端收到ack,進入fin_wait_2狀態。
4、伺服器端傳送fin報文端,進入last_ack狀態。
5、客戶端收到fin報文端,向伺服器傳送ack,同時進入time_wait狀態,啟動time_wait定時器,超時時間設為2msl。
6、伺服器端收到ack,進入closed狀態。
7、客戶端在2msl時間內沒收到對端的任何響應,time_wait超時,進入closed狀態。
1、client端發起中斷連線請求,也就是傳送fin報文。
2、server端接到fin報文後,傳送乙個ack給客戶端。意思是告訴client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的訊息"。
3、當server端確定資料已傳送完成,則向client端傳送fin報文,"告訴client端,好了,我這邊資料發完了,準備好關閉連線了"。
4、client端收到fin報文後,"就知道可以關閉連線了,但是他還是不相信網路,怕server端不知道要關閉,所以傳送ack後進入time_wait狀態,如果server端沒有收到ack則可以重傳。「,server端收到ack後,"就知道可以斷開連線了"。client端等待了2msl後依然沒有收到回覆,則證明server端已正常關閉,那好,我client端也可以關閉連線了。ok,tcp連線就這樣關閉了!
【問題1】為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
答:因為當server端收到client端的syn連線請求報文後,可以直接傳送syn+ack報文。其中ack報文是用來應答的,syn報文是用來同步的。但是關閉連線時,當server端收到fin報文時,很可能並不會立即關閉socket,所以只能先回覆乙個ack報文,告訴client端,"你發的fin報文我收到了"。只有等到我server端所有的報文都傳送完了,我才能傳送fin報文,因此不能一起傳送。故需要四步握手。
【問題2】為什麼time_wait狀態需要經過2msl(最大報文段生存時間)才能返回到close狀態?
答:雖然按道理,四個報文都傳送完畢,我們可以直接進入close狀態了,但是我們必須假象網路是不可靠的,有可以最後乙個ack丟失。所以time_wait狀態就是用來重發可能丟失的ack報文。
tcp 四次揮手 TCP四次揮手
tcp斷開連線的過程 客戶端傳送fin報文,表明客戶端將不在傳送資料。具體過程 把fin標誌位改為1,序號seq u,之前傳送的資料加1,這裡規定即使不攜帶資料序號也要 1。該過程中客戶端通過close系統呼叫從established狀態進入fin wait 1狀態。第二次揮手 服務端收到客戶端發來...
tcp斷開連線四次揮手
tcp斷開連線是經歷了四次揮手的過程 1 客戶端主動斷開連線向服務端傳送 請求標誌位 fin 連線序號 seq 2 服務端收到請求後向客戶端傳送 確認請求標誌位 ack 確認連線序號 ack 3 服務端還會向客戶端傳送 請求標誌位 fin 連線序號 seq 4 客戶端在收到服務端資料後想服務端傳送 ...
TCP三次握手(建立連線) 四次揮手(關閉連線)
順序號 32位 用來標識從tcp源端向tcp目的端傳送的資料字節流,它表示在這個報文段中的第乙個資料位元組的順序號。如果將位元組流看作在兩個應用程式間的單向流動,則tcp用順序號對每個位元組進行計數。序號是32bit的無符號數,序號到達2 32 1後又從0開始。當建立乙個新的連線時,syn標誌為1 ...