當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來控制。