【slighttpd】基于lighttpd架构的Server项目实战(5)—TCP的TIME_WAIT状态
轉載地址:https://blog.csdn.net/jiange_zh/article/details/50637549
上一節我們已經開發了一個簡單的echo服務器,在這里我們先不急著繼續下去,先看看一些小細節!
在listener的代碼中,對于監聽套接字,我設置了SO_REUSEADDR這個選項,那么,這個選項有什么用呢?
int reuse = 1; setsocket(listen_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));要明白這個問題,我們先看看tcp關閉連接的四次握手:
可以看到,主動關閉的一端將經歷TIME_WAIT狀態。
TIME_WAIT狀態有兩個存在的理由——
一、可靠地實現TCP全雙工連接的終止:?
假設主動關閉端最后發送的ACK丟失了,對端將重新發送FIN,主動關閉端只有在維護狀態信息的情況下才能重傳最后那個ACK。否則,主動關閉端將會響應一個RST,對端會將此響應標記為錯誤,所以不能進行正常的關閉。
二、允許老的重復分節在網絡中消逝:?
假設我們在兩個主機之間建立了一個TCP連接,之后關閉這個連接,過一會又在相同的IP地址和端口之間建立另一個連接。由于IP地址和端口號與之前相同,所以如果出現上一個連接的老的重復分組,將會影響到新的連接。為解決這個問題,TCP將不會給處于TIME_WAIT狀態的連接發起這個新的連接。
為解決以上問題,TIME_WAIT狀態需要持續一定的時間,所以TIME_WAIT也被稱為2MSL等待狀態,一般持續時間在1分鐘到4分鐘之間。
關于TCP的各個狀態,建立與終止等情況,可以參考下我的另一篇博文:
《TCP/IP詳解 卷1:協議》 讀書筆記 第十八章 TCP連接的建立與終止
因此,服務器端程序啟用SO_REUSEADDR選項的好處是:如果服務端程序由于某種錯誤操作關閉了,我們需要立馬重啟服務程序,但是TIME_WAIT還占用著這些地址端口資源讓你的服務無法開啟。當開啟SOREUSEADDR這個選項之后,就允許地址端口的重復綁定,使得服務快速重啟。
另外,既然提到TIME_WAIT,有另一個問題需要提一下——
高并發TCP服務器中主動關閉的一方最好是客戶端:?
因為對于高并發服務器來說文件描述符資源是十分重要的,如果對于每一個連接都要經歷TIME_WAIT這個2MSL的時長,勢必造成資源不能馬上復用的浪費。對于客戶端,一般很少有并發資源限制,所以客戶端執行主動關閉是比較合適的。
?
總結
以上是生活随笔為你收集整理的【slighttpd】基于lighttpd架构的Server项目实战(5)—TCP的TIME_WAIT状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【slighttpd】基于lighttp
- 下一篇: 芯片巨头们2019年的AI芯片之争会如何