一句話總結:保證雙方正常關閉、廢棄存在於路由上的舊資訊。
下面假設a是主動關閉方,b是被動關閉方。
1、time wait什麼時候出現
當a主動關閉傳送fin給b時,進入fin_wait_1,
b接收到fin後發給a乙個ack,進入close_wait
當a接收到b的ack後進入fin_wait_2
b進入close_wait後沒有資料傳送,則傳送fin,進入last_ack
a接收到b的fin後進入time_wait,傳送ack
b接收到a的ack後關閉,a等待2msl後關閉。
2、為何需要timewait這個狀態
(1)a不能保證最後的ack能到達b,如果丟失了,b收不到會重發fin,timewait狀態的存在可以讓a重發ack來在一定程度上保證tcp連線正常關閉。
(2)當乙個tcp連線關閉後,重新又被用到,有了timewait可以在一定程度上丟棄掉之前無用的網路包。通用經驗是將timewait定義為2msl,無法從理論上百分百保證。
3、去掉timewait這個狀態行不行
(1)如果去掉,從1中的流程可以看出,在最後一次握手中,a接收到b的fin後傳送完ack就關閉了,如果b沒有接收到ack,則會重發fin,而此時a已經關閉了,會給b傳送乙個rst,此時b接收到rst後報錯。
(2)如果去掉timewait,假設tcp連線正常關閉了,接著在1msl內又重新用到了該tcp連線,那麼之前存在於路由上的舊網路包可能被重新接收到。
4、如何避免time_wait狀態占用資源
客戶端一般是臨時埠,不太擔心資源問題
服務端由於埠是指定的,處於time_wait時不能使用,會一定程度上造成資源浪費,可以用setsockopt函式中的選項so_reuseaddr設定重用即可。
可以通過核心引數改變time_wait的時間長度甚至關閉不讓其進入time_wait狀態,當然這是不建議的。
tcp 四次揮手 TCP四次揮手
tcp斷開連線的過程 客戶端傳送fin報文,表明客戶端將不在傳送資料。具體過程 把fin標誌位改為1,序號seq u,之前傳送的資料加1,這裡規定即使不攜帶資料序號也要 1。該過程中客戶端通過close系統呼叫從established狀態進入fin wait 1狀態。第二次揮手 服務端收到客戶端發來...
TCP四次揮手中的TIME WAIT狀態存在的理由
1 第一次揮手 client傳送乙個fin,用來關閉client到server的資料傳送,client進入fin wait 1狀態。2 第二次揮手 server收到fin後,傳送乙個ack給client,確認序號為收到序號 1 與syn相同,乙個fin占用乙個序號 server進入close wai...
TCP四次揮手中TIME WAIT的作用及危害
1 為實現tcp連線的可靠釋放 保證最後乙個ack能到達伺服器,如果伺服器沒有收到客戶端的確認報文,它會重新進行第四次揮手,這樣客戶端在2msl內能收到重發的報文,並給出回應,重置2msl計時器 msl是maximum segment lifetime英文的縮寫,中文可以譯為 報文最大生存時間 2 ...