生活随笔
收集整理的這篇文章主要介紹了
网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在進行TCP高并發服務器開發時,有些規則仿佛是約定俗成的,很多朋友會依據這些規則去做,比如高并發TCP服務器中進行主動關閉的一方最好是客戶端、服務器端程序最好啟用SO_REUSEADDR選項,但是很多人卻不知所以然,我們為什么要這么做呢?
先上圖
可以看到執行主動關閉端和被動關閉端的各個階段的狀態,今天咱的重點就是TIME_WAIT狀態,可以看出TIME_WAIT狀態是執行主動關閉的那一端產生的。
TIME_WAIT狀態有兩個存在的理由
可靠地實現TCP全雙工連接的終止;
允許老的重復分節在網絡中消逝;
第一個理由參考上圖。 假設主動關閉端最終發送的ACK丟失了。對端將重新發送FIN,主動關閉端只有在維護狀態信息的情況下才可以重新發送最終的那個ACK。如果不維護這個狀態信息,主動關閉端將會響應一個RST,對端會將此響應標記為錯誤,所以不能進行正常的關閉。
第二個理由假設我們在ip A:端口B主機和ip C:端口D主機之間建立一個TCP連接。我們關閉這個連接,過一段時間在相同的IP地址和端口之間建立另一個連接。由于他們的IP地址和端口號都相同,所以如果上一個連接的老的重復分組再出現會影響新的連接。為了做到這一點,TCP將不會給處于TIME_WAIT狀態的連接發起這個新的連接。這個持續時間如果大于MSL(IP數據報在因特網中的最大生存時間)
如果要滿足以上實現,TIME_WAIT狀態必須要有一定的持續時間,所以TIME_WAIT也被稱為2MSL等待狀態,一般持續時間在1分鐘到4分鐘之間。
高并發TCP服務器中進行主動關閉的一方最好是客戶端:因為對于高并發服務器來說文件描述符資源是很重要的資源,如果對于每一個連接都要經歷TIME_WAIT這個2MSL的時長,勢必造成資源不能立馬復用的浪費。雖然對于客戶端來說TIME_WAIT狀態會占用端口和句柄資源,但是客戶端一般很少有并發資源限制,所以客戶端執行主動關閉是比較合適的。
服務器端程序最好啟用SO_REUSEADDR選項:我們想這樣做一種情況,如果生產環境中服務端程序由于某種錯誤操作關閉了,我們肯定是要立馬重啟服務程序,但是TIME_WAIT還在占用著這些地址端口資源讓你的服務起不來,那你著不著急。SOREUSEADDR這個選項正是允許地址端口的重復綁定。
參考書籍:
《UNIX網絡編程 卷1》《TCP/IP詳解 卷1:協議》
總結
以上是生活随笔為你收集整理的网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。