Timewait 和 TCP 連接的關(guān)系:
主動關(guān)閉的一端向服務(wù)端發(fā)送第 1 次揮手的請求,被動方返回了一個 ACK 的包凭语,可以看到被動關(guān)閉端再一次發(fā)送完 FIN 和 ACK 包以后葱她,主動關(guān)閉端就會會先發(fā)送一個 ACK 響應(yīng)回去,然后進(jìn)入 TIME_WAIT 狀態(tài)似扔。
我們看到在它進(jìn)入 TIME_WAIT 狀態(tài)之前吨些,理論上 4 次揮手已經(jīng)完成了,為什么 TIME_WAIT 還需要保留一段時間炒辉?
這是因為 TCP的協(xié)議標(biāo)準(zhǔn)豪墅,需要保證4 次揮手過程中最后一次連接發(fā)送的穩(wěn)定性,如果ACK包發(fā)送不成功黔寇,就需要再次發(fā)送 ACK 包偶器。
大量的 Timewait 產(chǎn)生會造成文件句柄、內(nèi)存和端口的占用缝裤,由于系統(tǒng)會把過多的 time-wait socket 刪除屏轰、回收,在網(wǎng)絡(luò)條件不好的情況下憋飞,就可能會導(dǎo)致數(shù)據(jù)包重復(fù)的進(jìn)行發(fā)送亭枷。
如何對 TimeWait 進(jìn)行優(yōu)化
了解了 Timewait 的影響(結(jié)論:通常不會直接造成服務(wù)連接的影響,但是會造成一些資源上及新建連接風(fēng)險)搀崭,為了避免過多的 Timewait 產(chǎn)生叨粘,我們需要考慮去進(jìn)行一些優(yōu)化。在單機(jī)系統(tǒng)上做性能優(yōu)化的話瘤睹,我們需要考慮兩點:
第 1 點就是考慮把Timewait 隊列加大升敲。在操作系統(tǒng)資源、硬件資源能滿足的情況下轰传,我們可以把 tcp_max_tw_buckets 的值數(shù)調(diào)高驴党,它的緩沖值也就越大。這個數(shù)字是我們可以進(jìn)行操作系統(tǒng)內(nèi)核優(yōu)化的获茬。
第 2 點即我們需要嘗試修改操作系統(tǒng)內(nèi)核優(yōu)化的內(nèi)容港庄,也就是調(diào)整 TIME_WAIT 超出時間,如果它的操作時間能夠更快地讓操作系統(tǒng)進(jìn)行回收恕曲,那么它就可以更快地釋放資源鹏氧。當(dāng)然這個時間也不能調(diào)的太小,要不然 Timewait 的作用的意義就很小了佩谣。所以我建議操作系統(tǒng)內(nèi)核的參數(shù) tcp_fin_timeout 這個值調(diào)到 30把还,這就是一個比較合理的優(yōu)化空間。
參考鏈接:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=42#/detail/pc?id=1563