Time_wait狀態java
Time_wait做用服務器
1)可靠地實現TCP全雙工鏈接的終止
TCP協議在關閉鏈接的四次握手過程當中,最終的ACK是由主動關閉鏈接的一端(後面統稱A端)發出的,若是這個ACK丟失,對方(後面統稱B端)將重發出最終的FIN,所以A端必須維護狀態信息(TIME_WAIT)容許它重發最終的ACK。若是A端不維持TIME_WAIT狀態,而是處於CLOSED 狀態,那麼A端將響應RST分節,B端收到後將此分節解釋成一個錯誤(在java中會拋出connection reset的SocketException)。
於是,要實現TCP全雙工鏈接的正常終止,必須處理終止過程當中四個分節任何一個分節的丟失狀況,主動關閉鏈接的A端必須維持TIME_WAIT狀態 。cookie
2)容許老的重複分節在網絡中消逝
TCP分節可能因爲路由器異常而「迷途」,在迷途期間,TCP發送端可能因確認超時而重發這個分節,迷途的分節在路由器修復後也會被送到最終目的地,這個遲到的迷途分節到達時可能會引發問題。在關閉「前一個鏈接」以後,立刻又從新創建起一個相同的IP和端口之間的「新鏈接」,「前一個鏈接」的迷途重複分組在「前一個鏈接」終止後到達,而被「新鏈接」收到了。爲了不這個狀況,TCP協議不容許處於TIME_WAIT狀態的鏈接啓動一個新的可用鏈接,由於TIME_WAIT狀態持續2MSL,就能夠保證當成功創建一個新TCP鏈接的時候,來自舊鏈接重複分組已經在網絡中消逝。網絡
2MSL併發
Time_wait參數調優tcp
一、添加到/etc/sysctl.confui
# 表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用Cookie來處理,可防範少許的SYN攻擊。該參數默認爲0,表示關閉。 net.ipv4.tcp_syncookies=1 # 表示開啓重用,即容許將TIME-WAIT套接字從新用於新的TCP鏈接。該參數默認爲0,表示關閉。 net.ipv4.tcp_tw_reuse=1 # 表示開啓TCP鏈接中TIME-WAIT套接字的快速回收,該參數默認爲0,表示關閉。 net.ipv4.tcp_tw_recycle=1 # 表示若是套接字由本端要求關閉,那麼這個參數將決定它保持在FIN-WAIT-2狀態的時間。 net.ipv4.tcp_fin_timeout=30 # 表示當Keepalived啓用時,TCP發送Keepalived消息的頻度改成20分鐘,默認值是2小時。 net.ipv4.tcp_keepalive_time=1200 # 表示系統同時保持TIME_WAIT套接字的最大數量,若是超過這個數字,TIME_WAIT套接字將馬上被清除並打印警告信息,默認值爲180 000,此處改成5000。對於Apache、Nginx等服務器,前面介紹的幾個參數已經能夠很好地減小TIME_WAIT套接字的數量,可是對於Squid來講,效果卻不大,有了此參數就能夠控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。 net.ipv4.tcp_max_tw_buckets=5000
二、生效內核參數。spa
sysctl -p /etc/sysctl.conf