Linux Time_wait網絡狀態 調優

Time_wait狀態java

  • 表示收到了對方的FIN報文,併發送出了ACK報文,就等2MSL後便可回到CLOSED可用狀態了。
  • 若是FIN_WAIT_1狀態下,收到了對方同時帶FIN標誌和ACK標誌的報文時,能夠直接進入到TIME_WAIT狀態,而無須通過FIN_WAIT_2狀態。

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併發

  • MSL是Maximum Segment Lifetime英文的縮寫,中文能夠譯爲「報文最大生存時間」。
  • 他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。
  • RFC 793中規定MSL爲2分鐘,實際應用中經常使用的是30秒,1分鐘和2分鐘等。

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
相關文章
相關標籤/搜索