一直對這個問題知其然而不知其所以然,這些日子再次碰到,看了很多的資料,徹底解決一下,呵呵,先上個圖,所有理解圍繞著此圖來看,此圖描述了四次揮手的整個過程:
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于網(wǎng)站制作、網(wǎng)站建設、宛城網(wǎng)絡推廣、微信小程序開發(fā)、宛城網(wǎng)絡營銷、宛城企業(yè)策劃、宛城品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供宛城建站搭建服務,24小時服務熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
通過此圖先說明幾個概念:
TIME_WAIT的產(chǎn)生條件:主動關閉方在發(fā)送四次揮手的最后一個ACK會變?yōu)門IME_WAIT狀態(tài),保留次狀態(tài)的時間為兩個MSL(linux里一個MSL為30s,是不可配置的)
TIME_WAIT兩個MSL的作用:可靠安全的關閉TCP連接。比如網(wǎng)絡擁塞,主動方最后一個ACK被動方?jīng)]收到,這時被動方會對FIN開啟TCP重傳,發(fā)送多個FIN包,在這時尚未關閉的TIME_WAIT就會把這些尾巴問題處理掉,不至于對新連接及其它服務產(chǎn)生影響。
TIME_WAIT占用的資源:少量內(nèi)存(查資料大概4K)和一個fd。
TIME_WAIT關閉的危害:1、 網(wǎng)絡情況不好時,如果主動方無TIME_WAIT等待,關閉前個連接后,主動方與被動方又建立起新的TCP連接,這時被動方重傳或延時過來的FIN包過來后會直接影響新的TCP連接;
2、 同樣網(wǎng)絡情況不好并且無TIME_WAIT等待,關閉連接后無新連接,當接收到被動方重傳或延遲的FIN包后,會給被動方回一個RST包,可能會影響被動方其它的服務連接。
TCP: time wait bucket table overflow產(chǎn)生原因及影響:原因是超過了linux系統(tǒng)tw數(shù)量的閥值。危害是超過閥值后﹐系統(tǒng)會把多余的time-wait socket刪除掉,并且顯示警告信息,如果是NAT網(wǎng)絡環(huán)境又存在大量訪問,會產(chǎn)生各種連接不穩(wěn)定斷開的情況。
相關參數(shù)優(yōu)化調(diào)整(當然得根據(jù)服務器的實際情況配置,這里著重講參數(shù)意義):
既然知道了TIME_WAIT的用意了,盡量按照TCP的協(xié)議規(guī)定來調(diào)整,對于tw的reuse、recycle其實是違反TCP協(xié)議規(guī)定的,服務器資源允許、負載不大的條件下,盡量不要打開,當出現(xiàn)TCP: time wait bucket table overflow,盡量調(diào)大下面參數(shù):
tcp_max_tw_buckets = 256000
調(diào)整次參數(shù)的同時,要調(diào)整TIME_WAIT_2到TIME_WAIT的超時時間,默認是60s,優(yōu)化到30s:
net.ipv4.tcp_fin_timeout = 30
其它TCP本身的配合參數(shù)類似與synack重傳次數(shù)、syn重傳次數(shù)等以后介紹,優(yōu)化后也是有所益處的。
下面再說一下linux里TIME_WAIT專有的優(yōu)化參數(shù)reuse、recycle,默認也都是關閉的,這兩個參數(shù)必須在timestamps打開的前提下才能生效使用:
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
機器作為客戶端時起作用,開啟后time_wait在一秒內(nèi)回收
net.ipv4.tcp_tw_recycle = 0 (不要開啟,現(xiàn)在互聯(lián)網(wǎng)NAT結構很多,可能直接無法三次握手)
開啟后在3.5*RTO(RTO時間是根據(jù)RTT時間計算而來)內(nèi)回收TIME_WAIT,并60s內(nèi)同一源ip主機的socket connect請求中的timestamp必須是遞增的,對于服務端,同一個源ip可能會是NAT后很多機器,這些機器timestamp遞增性無可保證,服務器會拒絕非遞增請求連接,直接導致不能三次握手。
自建個人原創(chuàng)站運維網(wǎng)咖社(www.net-add.com),新的博文會在網(wǎng)咖社更新,歡迎瀏覽。