Linux Time_wait網絡狀態 調優


Time_wait狀態

  • 表示收到了對方的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狀態 。

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參數調優

1、添加到/etc/sysctl.conf

# 表示開啟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

2、生效內核參數。

sysctl -p /etc/sysctl.conf

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM