Linux上的TIME_WAIT和tcp_fin_timeout


當Linux服務器的TIME_WAIT過多時,
通常會想到去修改參數降低TIME_WAIT時長,
以減少TIME_WAIT數量,但Linux並沒有提供這樣的接口,
除非重新編譯內核。


Linux默認的TIME_WAIT時長一般是60秒(等於2MSL),
定義在內核的include/net/tcp.h文件中:
#define TCP_TIMEWAIT_LEN (60*HZ)
/* how long to wait to destroy TIME-WAIT state,
 * about 60 seconds
 */
#define TCP_FIN_TIMEOUTTCP_TIMEWAIT_LEN
/* BSD style FIN_WAIT2 deadlock breaker.
 * It used to be 3min, new value is 60sec,
 * to combine FIN-WAIT-2 timeout with
 * TIME-WAIT timer.
 */


注意tcp_fin_timeout不是TIME_WAIT時間(吳功宜審校的W.Richard Stevens和Kevin R.Fall所著《TCP/IP詳解 卷1:協議》中文第二版第13.5.2節稱net.ipv4.tcp_fin_timeout為2MSL值):
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
tcp_fin_timeout實為FIN_WAIT_2狀態的時長,
Linux沒有提供修改TIME_WAIT時長接口,除非修改宏的定義重新編譯內核。
但Windows可以修改注冊表中的TcpTimedWaitDelay值來控制TIME_WAIT時長。


RTO:超時重傳(Retransmission Timeout)
MSL:包最大存活時長(Maximun Segment Lifetime)


TIME_WAIT是一個常見經常的問題,相關內容(/etc/sysctl.conf或/proc/sys/net/ipv4):
1) net.ipv4.tcp_timestamps
   為1表示開啟TCP時間戳,用來計算往返時間RTT(Round-Trip Time)和防止序列號回繞
2) net.ipv4.tcp_tw_reuse
   為1表示允許將TIME-WAIT的句柄重新用於新的TCP連接
3) net.ipv4.tcp_tw_recycle
   為1表示開啟TCP連接中TIME-WAIT的快速回收,NAT環境可能導致DROP掉SYN包(回復RST)
4) net.ipv4.tcp_fin_timeout
   FIN_WAIT_2狀態的超時時長
5) net.ipv4.tcp_syncookies
   為1時SYN Cookies,當SYN等待隊列溢出時啟用cookies來處理,可防范少量SYN攻擊
6) net.ipv4.tcp_max_tw_buckets
   保持TIME_WAIT套接字的最大個數,超過這個數字TIME_WAIT套接字將立刻被清除並打印警告信息
7) net.ipv4.ip_local_port_range
8) net.ipv4.tcp_max_syn_backlog
   端口最大backlog內核限制,防止占用過大內核內存
9) net.ipv4.tcp_syn_retries
   對一個新建連接,內核要發送多少個SYN連接請求才決定放棄,不應該大於255
10) net.ipv4.tcp_retries1
   放棄回應一個TCP連接請求前﹐需要進行多少次重試,RFC規定最低的數值是3,這也是默認值
11) net.ipv4.tcp_retries2
   在丟棄激活(已建立通訊狀況)的TCP連接之前﹐需要進行多少次重試,默認值為15
12) net.ipv4.tcp_synack_retries
   TCP三次握手的SYN/ACK階段重試次數,缺省5


13) net.ipv4.tcp_max_orphans
   不屬於任何進程(已經從進程上下文中刪除)的sockets最大個數,超過這個值會被立即RESET,並同時顯示警告信息
14) net.ipv4.tcp_orphan_retries
   孤兒sockets廢棄前重試的次數,缺省值是7
15) net.ipv4.tcp_mem
   內核分配給TCP連接的內存,單位是page:
   第一個數字表示TCP使用的page少於此值時,內核不進行任何處理(干預),
   第二個數字表示TCP使用的page超過此值時,內核進入“memory pressure”壓力模式,
   第三個數字表示TCP使用的page超過些值時,報“Out of socket memory”錯誤,TCP 連接將被拒絕
16) net.ipv4.tcp_rmem
   為每個TCP連接分配的讀緩沖區內存大小,單位是byte
17) net.ipv4.tcp_wmem
   為每個TCP連接分配的寫緩沖區內存大小,單位是byte:
   第一個數字表示,為TCP連接分配的最小內存,
   第二個數字表示,為TCP連接分配的缺省內存,
   第三個數字表示,為TCP連接分配的最大內存(net.core.wmem_max可覆蓋該值)
18) net.ipv4.tcp_keepalive_time
   當keepalive起用的時候,TCP發送keepalive消息的頻度,單位為秒,缺省是7200秒(即2小時)
19) net.ipv4.tcp_keepalive_intvl
   keepalive探測包的發送間隔    
20) net.ipv4.tcp_keepalive_probes
   如果對方不予應答,探測包的發送次數


代碼中可通過SO_LINGER來控制。


免責聲明!

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



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