根據《unix網路程式設計》卷1,tcp的狀態轉換圖可以得知:執行主動關閉的那端(假設客戶端)經歷了time_wait狀態,該狀態停留在那個狀態的持續時間是最長分節期(maximum segment lifetime,msl)的兩倍,稱為2msl。
time_wait狀態的持續時間在1min~4min之間。msl是任何ip資料報能夠在網際網路上存活的最長時間。每個資料報在最大跳數(255)之內在網路上的時間不會超過msl秒。網路在路由失效後重新找到一條連通的路。在此期間如果發生路由環路,tcp超時未收到確認包會重新傳送該資料分組,該資料分組正確到達,不久路由修復,環路中的資料報也到達目的地,這個分組叫做漫遊的重複分組。
time_wait狀態存在的兩個理由是:
1. 可靠的實現tcp全雙工連線的終止;
2. 允許老的資料分組在網路中消逝。
關於第乙個理由:假設最終的ack丟失了,服務端將重新傳送fin,因此客戶必須維護狀態資訊,以允許它重新傳送那個ack。要是客戶端不維護狀態資訊,響應乙個rst給伺服器,伺服器認為是錯誤。如果tcp打算執行所有必要的工作以徹底終止某個連線上兩個方向的資料流,必須處理連線終止序列4個分節中任何乙個分節丟失的情況。
關於第二個理由:假設新建的連線與前乙個連線ip位址和埠一樣,tcp必須防止來自某個老的連線的資料分組在該連線終止後出現,從而被誤解為新連線的新資料分組,為了做到這一點,tcp將不給處於time_wait狀態的連線發起新的連線。乙個方向上資料報最多msl存活期,另乙個方向應答最多存活msl,通過實施這個規則,就能保證每個成功連線的tcp,來自先前連線的老的資料分組都已經在網路中消逝了。
現實來講,剛終止的./server 重啟啟動時,需要等一會兒,可採用啟用「埠重用」將setsockopt的第四個引數設為1.
int on = 1;
setsockopt(listenfd, sol_socket, so_reuseaddr, &on, sizeof(on));
TCP連線中TIME WAIT連線過多
原文 主題tcp ip socket timewait並不是多餘的 在tcp協議被創造,經歷了大量的實際場景實踐之後 timewait 出現了,因為tcp主 動關閉連線的一方需要timewait狀態,它是我們的朋友。這是 unix網路程式設計 的作者 steven對timewait的態度。tcp要保...
tcp連線中TIME WAIT狀態過多
參考自 作用 1.保證雙方正常種植資料流傳輸 最後乙個 ack丟失了,被動關閉一方會重發它的 fin,主動關閉一方必須維持乙個有效狀態資訊 timewait狀態下維持 以便能夠重發 ack,否則被動一方會認為有錯誤產生 2.保證 在下乙個人使用的ip位址與埠與先前的完全相同的情況下,上乙個殘留的資料...
TCP連線的TIME WAIT狀態
time wait狀態是tcp的11個狀態其中之一,是發生在正常關閉tcp連線的時候發生的。如下圖所示 在這幅圖中我們可以明顯看出,流程是這樣的,顯示主動傳送乙個fin報文,然後接收到乙個ack報文,這樣這一方的連線已經關閉,也就是不能再傳送資料了,進入fin wait2狀態,這個狀態就是為了等待,...