在TCP的三次握手和四次揮手過程中,Client和Server會出現(xiàn)多種狀態(tài)吩案,此間會出現(xiàn)常見的問題
問題一:TIME_WAIT過多
產(chǎn)生原因:主動關(guān)閉方在發(fā)送四次揮手的最后一個ACK會變?yōu)門IME_WAIT狀態(tài)棚赔,保留此狀態(tài)的時間為兩個MSL(linux里一個MSL為30s,是不可配置的)
TIME_WAIT兩個MSL的作用:可靠安全的關(guān)閉TCP連接。比如網(wǎng)絡(luò)擁塞靠益,主動方最后一個ACK被動方?jīng)]收到丧肴,這時被動方會對FIN開啟TCP重傳,發(fā)送多個FIN包胧后,在這時尚未關(guān)閉的TIME_WAIT就會把這些尾巴問題處理掉芋浮,不至于對新連接及其它服務(wù)產(chǎn)生影響。
TCP: time wait bucket table overflow產(chǎn)生原因及影響:原因是超過了linux系統(tǒng)tw數(shù)量的閥值壳快。危害是超過閥值后﹐系統(tǒng)會把多余的time-wait socket 刪除掉纸巷,并且顯示警告信息,如果是NAT網(wǎng)絡(luò)環(huán)境又存在大量訪問眶痰,會產(chǎn)生各種連接不穩(wěn)定斷開的情況瘤旨。
解決辦法:對于tw的reuse、recycle其實是違反TCP協(xié)議規(guī)定的竖伯,服務(wù)器資源允許存哲、負載不大的條件下,盡量不要打開七婴,當(dāng)出現(xiàn)TCP: time wait bucket table overflow祟偷,盡量調(diào)大參數(shù)
net.ipv4.tcp_max_tw_buckets=10000
調(diào)節(jié)至/var/log/message不在報錯為止
問題二:FIN_WAIT2 狀態(tài)的 TCP 鏈接過多
原因:HTTP 服務(wù)中,Server 由于某種原因會主動關(guān)閉連接本姥,例如 KEEPALIVE 超時的情況下肩袍。作為主動關(guān)閉連接的 Server 就會進入 FIN_WAIT2 狀態(tài)。
TCP/IP 協(xié)議棧中婚惫,存在半連接的概念氛赐,F(xiàn)IN_WAIT2 狀態(tài)不算做超時,如果 Client 不關(guān)閉先舷,F(xiàn)IN_WAIT_2 狀態(tài)將保持到系統(tǒng)重啟艰管,越來越多的 FIN_WAIT_2 狀態(tài)會致使內(nèi)核 Crash。
解決辦法:建議調(diào)小 net.ipv4.tcp_fin_timeout 參數(shù)蒋川,減少這個數(shù)值以便加快系統(tǒng)關(guān)閉處于 FIN_WAIT2 狀態(tài)的 TCP 連接
修改內(nèi)核參數(shù):
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 10000