關於Time Wait的幾個問題

2021-07-23 02:35:50 字數 1442 閱讀 1109

time_wait是個常問的問題,tcp網路程式設計中最不容易理解的也是它的time_wait狀態,這也說明了tcp/ip四次揮手中time_wait狀態的重要性。 

下面通過4個問題來描述它

1.time_wait狀態是什麼

2.為什麼會有time_wait狀態

3.哪一方會有time_wait狀態

4.如何避免time_wait狀態占用資源

簡單來說:time_wait狀態是四次揮手中伺服器向客戶端傳送fin終止連線後進入的狀態。

下圖為tcp四次揮手過程 

可以看到time_wait狀態存在於客戶端收到伺服器fin並返回ack包時的狀態 

當處於time_wait狀態時,我們無法建立新的連線,因為埠被占用。

time_wait存在的原因有兩點 

1.可靠的終止tcp連線。 

2.保證讓遲來的tcp報文段有足夠的時間被識別並丟棄。

1.可靠的終止tcp連線,若處於time_wait的客戶端傳送給伺服器確認報文段丟失的話,伺服器將在此重新傳送fin報文段,那麼客戶端必須處於乙個可接收的狀態就是time_wait而不是close狀態。 

2.保證遲來的tcp報文段有足夠的時間被識別並丟棄,linux 中乙個tcp埠不能開啟兩次或兩次以上,當客戶端處於time_wait狀態時我們將無法使用此埠建立新連線,如果不存在time_wait狀態,新連線可能會收到舊連線的資料。time_wait持續的時間是2msl,保證舊的資料可以丟棄,因為網路中的資料最大存在msl(maxinum segment lifetime)

time_wait狀態是一般有客戶端的狀態。而且會占用埠 

有時產生在伺服器端,因為伺服器主動斷開連線或者發生異常

如果是客戶端,我們一般不用擔心,因為客戶端一般選用臨時埠,再次建立連線會新分配乙個埠。除非指定客戶端使用某埠,不過一般不需要這麼做。

如果是伺服器主動關閉連線後異常終止,則因為它總是使用用乙個知名伺服器端口號,所以連線的time_wait狀態將導致它不能重啟,不過我們可以通過socket的選項so_reuseaddr來強制程序立即使用處於time_wait狀態的連線占用的埠。 

通過socksetopt設定後,即使sock處於time_wait狀態,與之繫結的socket位址也可以立即被重用。

此外也可以通過修改核心引數/proc/sys/net/ipv4/tcp_tw/recycle來快速**被關閉的socket,從而是tcp連線根本不進入time_wait狀態,進而允許應用程式立即重用本地的socket位址。

關於網路的幾個問題

q1 請你分別划划osi的七層網路結構圖,和tcp ip的五層結構圖?1 osi每層功能及特點 a 物理層 為資料鏈路層提供物理連線,在其上序列傳送位元流,即所傳送資料的單位是位元。此外,該層中還具有確定連線裝置的電氣特性和物理特性等功能。b 資料鏈路層 負責在網路節點間的線路上通過檢測 流量控制和...

關於EOF的幾個問題

1 如何輸入eof ctrl z in win or ctrl d in linux 2 阻塞式以及非阻塞式 輸入緩衝是行緩衝。當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車鍵後,cin.get 就會檢測輸入緩衝區中是否有了可讀的資料。cin.get 還會對鍵盤...

關於JWT的幾個問題

最近剛用上shrio做許可權控制,然後接觸到了jwt json web token jwt 是目前最流行的跨域身份驗證解決方案。說白了就是,比如我現在用vue寫乙個單頁面,有一些頁面是需要身份驗證的,如果你從login頁面進入,寫乙個頁面 需要使用者資訊 它是拿不到前乙個頁面狀態的,他無法去識別我們...