TIME_WAIT狀態、危害、如何避免危害


1.什么是TIME_WAIT狀態?

圖片來源見水印

在TCP連接中四次揮手關閉連接時,主動關閉連接的一方(上圖中時Client)會在發送最后一條ACK報文后維持一段時長2MSL(MSL指的是數據包在網絡中的最大生存時間)的等待時間后才會真正關閉連接到CLOSED狀態,該時間段內主動關閉方的狀態為TIME_WAIT。即在TIME_WAIT狀態時,定義這個連接的四元組(源/目的IP、源/目的端口)不能被使用。

2.為什么需要TIME_WAIT狀態?

為實現TCP連接的可靠釋放

1. 若主動斷開連接方(上圖中Client)最后一次ACK報文丟失了,會觸發被動方(上圖中Server)的超時重傳機制,Server再次向Client發送FIN+ACK報文,如果Client在發送完最后一次ACK后立即斷開連接(沒有TIME_WAIT狀態),則Server會收到RST=1的報文響應,表示連接建立異常,而此時並非異常,只是正常的關閉連接過程,進而導致Server端不能正常關閉連接。因此,Client必須維護2MSL的等待時間,確保在Server端第二次發送的FIN+ACK被Client正常接收,收到后Client立即發送ACK給Server,並重新啟動2MSL計時器。(因為極端情況涉及兩次報文傳輸(Client向Server的ACK,Server向Client的FIN+ACK),所以等待時間為2MSL)

2. 為使舊的重復數據包在網絡中因過期而消失

    可能存在一些數據包在傳輸過程中出現異常而導致嚴重推遲,而在它到來之前發送方已經重發了該報文,並完成其任務。如果在被推遲的報文未抵達前接收方斷開了連接,隨后又建立了一個與之前相同IP、Port的連接,而之前被推遲的報文在這時恰好到達,而此時此新連接非彼連接,從而會發生數據錯亂,進而導致無法預知的情況。因此必須維持一段等待時間,使遲到的報文在網絡中完全消失,並且在等待時間內,因為連接並未關閉,所以不能建立相同四元組的新連接,就不會出現數據錯亂。

 

保活計時器

  盡管維護了TIME_WAIT狀態,雙方也並非一定能正確關閉連接

  情況一:若被動關閉連接的一方沒有收到對方的最后一條ACK,而重發FIN+ACK,而FIN+ACK也丟失了,並且在TIME_WAIT等待時間內,一直丟包,導致等待時間過后一方關閉連接,而被動關閉的一方因始終沒有收到最后一個ACK而無法關閉連接。

  情況二:兩台主機建立連接成功后,一方因故障斷網/斷電,而另一方並不知情會一直白白等下去,顯然這並不合理。

  當發生以上兩種情況時,就會用到保活計時器。服務器每收到一次客戶的數據,就會重新設置保活計時器,若直到計時器時間內沒有收到客戶端的數據,服務器就發送一個探測報文段,以后每隔一段時間發送一次,如連續發送n個探測報文讓沒有收到客戶的響應,服務器就認為客戶端出現了故障,會主動關閉該連接。

注意:進程退出時,進程所擁有的文件描述符(包含socket)都會被釋放,文件會被關閉,也就是會執行close,對於TCP連接來說就是進程會主動關閉連接。機器關機相同(OS會先關閉所有服務再關機)。

3.TIME_WAIT狀態造成的危害

在高並發短連接的TCP服務器上,當服務器處理完請求后主動請求關閉連接,這樣服務器上會有大量的連接處於TIME_WAIT狀態,服務器維護每一個連接需要一個socket,也就是每個連接會占用一個文件描述符,而文件描述符的使用是有上限的,如果持續高並發,會導致一些連接失敗。

還有一種情況,假設假設假設,今天雙十一,這是一台Tmall的服務器,因為一些原因,服務器進程掛掉了,退出了,由於是服務器主動關閉連接,因此會有TIME_WAIT狀態存在,也就意味着服務器進程想立即重啟,但是起不來,因為端口(可能是80)還被之前處於TIME_WAIT的連接占用着,如果TIME_WAIT狀態維持60秒,60秒服務器都起不來,雙十一,嘖嘖。

4.如何避免?

可設置套接字選項為SO_REUSEADDR,該選項的意思是,告訴操作系統,如果端口忙,但占用該端口TCP連接處於TIME_WAIT狀態,並且套接字選項為SO_REUSEADDR,則該端口可被重用。如果TCP連接處於其他狀態,依然返回端口被占用。該選項對服務程序重啟非常有用。

 

參考:https://blog.csdn.net/yusiguyuan/article/details/38984759

   https://www.cnblogs.com/dadonggg/p/8778318.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM