首先簡單介紹一下time_wait是個什麼鬼:
在tcp/ip協議中,我們都知道有三次握手四次揮手的過程,先來乙個簡單的圖:
各個狀態和基本的過程想必了解過tcp/ip協議的人都清楚,本次介紹的主題只有time_wait狀態。(ps:本文統一將主動斷開連線方稱a,被動斷開連線方稱b)
1,time_wait狀態是什麼結點產生的?
在a傳送fin被b接收到,b會傳送ack緊接著傳送fin以後,a接收到另一方發過來的fin訊號,就會將自身的狀態設定為time_wait狀態,並返回乙個ack。
2,為什麼需要有乙個time_wait狀態?
主要有兩個原因:⑴ 可靠地實現tcl全雙工連線的終止;⑵允許老的重複分節在網路中消逝。
3,分別解釋一下上述兩種具體的實現過程?
⑴ a傳送最後一次ack後,會處於time_wait狀態下,此時並沒有斷開連線,若最後一次ack沒有正常傳送給b,則b檢測超時後會再次傳送確認的fin,此時a處於time_wait狀態就能正常接收並再次傳送確認ack,以確保伺服器能正常斷開連線。time_wait(2msl)時間超時後,a端就會自動關閉埠。
⑵ 假設已經有a與b建立了鏈結,此時a主動斷開連線後,這時候發出的乙個ack,如果沒有time_wait(2msl)時間,直接斷開連線後立即啟用乙個新的網路連線,如果有乙個來自上個連線的資料報,會直接對當前連線連線造成影響,所以必須進行乙個2msl的等待時間。
msl時間是乙個資料報在網路中最大的存活時間。如果超過這個時間,就會在網路傳輸中消失。一般這個時間在window環境下就是2分鐘,所以2msl就是4分鐘,這個具體的時間根據環境不同有所減少。而之所以是2msl,主要原因在兩個埠之間進行傳輸,從傳輸到b埠再從b埠傳回來,至少需要2個包,所以規定的時間為2msl。
5,若是在time_wait時間內,還是由於一些原因(路由異常,資料處理延遲,等待超時),造成最後乙個ack沒能正常到達,伺服器會怎麼樣?
首先,若伺服器多次發fin得不到回應,根據專案不同,必然是有響應的超時異常處理,但一般情況下不會很少出現這種極端情況,所以哪怕在a端已經關閉,b端傳送乙個fin之後,a端也會反饋乙個rst分節,這個資料報會在b端被識別成異常錯誤。
6,如果在time_wait狀態ack資料丟失,那a與b如果再次進行資料確認?
tcp協議提供一種超時重傳機制,主要根據tcp提供的定時器進行控制,而這種情況下的重傳,時間為rrt(資料往返時間),由於路由器和網路流量均會變化,所以rrt時間也是經常變動的。這個時間長短的變動同樣是tcp進行監控修改的。具體演算法請參考tcp/ip詳解:卷一。
7,time_wait狀態必須等待2msl時間嗎?
當然不是,某些特殊情況a端需要進行大量並且快速的建立連線-斷開連線的操作,所以我們有時候不能接受2-4分鐘左右的重新等待時間,這時候可以通過設定tcp的配置檔案 /etc/sysctl.conf 來改變time_wait狀態的時間,具體修改內容如下:
編輯檔案,加入以下內容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然後執行/sbin/sysctl -p讓引數生效。
net.ipv4.tcp_syncookies = 1表示開啟syn cookies。當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊,預設為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1表示開啟重用。允許將time-wait sockets重新用於新的tcp連線,預設為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1表示開啟tcp連線中time-wait sockets的快速**,預設為0,表示關閉。
net.ipv4.tcp_fin_timeout修改系統預設的timeout時間
修改之後,再用命令檢視time_wait連線數netstat -ant |grep 「time_wait」 |wc –l
在沒有nat情況下還需要設定net.ipv4.tcp_timestamps = 1才能生效。
8,若設定了上述時間,我們如何確保time_wait的兩個作用?
若要設定快速重用的屬性,前提也必須設定net.ipv4.tcp_timestamps = 1,tcp就會為資料報新增兩個」位元組時間字段」,第乙個4位元組記錄傳送該資料報的時間,第二個4位元組字段用來儲存最近一次接受對方傳送到資料的時間。有了時間段,我們就可以通過計算時間,來防止延遲的資料到達。但確保雙關性可能會出現問題,但就算a段快速關閉,資料丟失下b段重發fin,會回覆乙個rst包,表達是異常。
上述大部分都是通過tcp/ip協議與部落格了解,部分是通過與朋友討論總結,若出現錯誤,請大神們指點
如何帶好乙個團隊
任何工作的出色完成,都不可能缺少團隊的合作,好的團隊是你完成出色的任務的前提。所以建立好的團隊,乙個團結,具有實力的,潛力,創造力和應變能力的團隊,是你成功的前提。就團隊的建立,提供以下建議 1 你的團隊,你的原則。你的團隊你必須對其有自己的原則 自己對員工的行為標準 工作標準 謹記這個團隊是屬於你...
關於做好乙個專案
1 分析需求 我們少有創新,大多算更新,所以所有的需求都有原型,以及延伸的雛形,找到它,試圖理解它背後的邏輯,然後再考慮技術實現 2 設計原型 來自於經驗的積累,流程圖會幫你從混亂的需求中清醒,即使是草圖 3 團隊協作 了解每個人擅長做什麼,出現狀況的時候,作為旁觀者,你要做的是幫他理清思路,wha...
如何運營好乙個社群?
乙個社群有大有小,社群就是將相同興趣愛好或者說價值觀的人群聚集在一起,形成乙個較為緊密的社會關係的集合。要建設社群,先要明確群社群運營的三個方法 有態度的內容 圈層化互動 共享中互利。第一,有態度的內容指內容必須有價值,才能把人聚合在一起的,人不是因為認識在一起,而是因為興趣 因為認同感才在一起的 ...