摘要: 三次握手,四次揮手
意思是tcp建立連接時需要三次交互來完成,A發起連接
A --- SYN --> B
A -- SYN + ACK --- B (1)
A --- ACK --> B
而關閉tcp連接需要四次交互,A發起關閉
A --- FIN --> B
A -- ACK --- B (1)
A -- FIN --- B
A --- ACK --> B (2)
這里在(1)時B開始處于CLOSE_WAIT狀態,一直到收到ACK后B才轉為CLOSED ,而A就處于TIME_WAIT狀態,一直到2MSL(Max Segament Lifetime)才轉為CLOSED
為什么需要2MSL才真正轉為CLOSED?是因為需要緩沖時間萬一B丟失ACK重發FIN的話還可以回復ACK,還有就是2MSL后“迷失”在網絡上的包全部失效
大量的 TIME_WAIT 和 CLOSE_WAIT 會造成服務器的連接資源被浪費甚至占滿后導致服務器服務拒絕,怎么解決?
解決TIME_WAIT
net.ipv4.tcp_tw_recycle = 1 #開啟快速回收,默認0
net.ipv4.tcp_tw_reuse = 1 #開啟重用,默認0
net.ipv4.tcp_fin_timeout = 30 # 減小fin_timeout,默認60,單位s
系統參數的配置可以解決time_wait,但是close_wait就沒那么簡單了
解決CLOSE_WAIT
一般都是服務端的代碼問題。
絕大多數都是客戶端發起關閉,這樣可知HTTP服務器應該會有很多TIME_WAIT,不過當http使用keep-alive后服務端會主動斷連。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章:- 常用類之TCP連接類-socket編程
- TCP/IP 中的二進制反碼求和算法
- 基于TCP異步Socket模型的介紹
- 使用批處理重置TCP_IP協議
- TCP Wrappers防火墻介紹與封鎖IP地址的方法
- tcp socket客戶端和服務端示例分享
- TCPIP是什么
- TCP版backshell的VBS腳本代碼
- TCP三次握手及原理
- tcp、udp、ip協議分析_動力節點Java學院整理