上篇笔记主要介绍了与TIME_WAIT相关的基础知识,本文则从实践出发,说明如何解决文章标题提出的问题。
1. 查看系统网络配置和当前TCP状态
在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的。以x86_64平台Linux kernelversion 2.6.9的机器为例,ipv4网络协议的默认配置可以在/proc/sys/net/ipv4/下查看,其中与TCP协议栈相关的配置项均以tcp_xxx命名,关于这些配置项的含义,请参考这里的文档,此外,还可以查看linux源码树中提供的官方文档(src/linux/Documentation/ip-sysctl.txt)。下面列出我机器上几个需重点关注的配置项及其默认值:
cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000
cat /proc/sys/net/ipv4/tcp_max_syn_backlog 1024
cat /proc/sys/net/ipv4/tcp_syn_retries 5
cat /proc/sys/net/ipv4/tcp_max_tw_buckets 180000
cat /proc/sys/net/ipv4/tcp_tw_recycle 0
cat /proc/sys/net/ipv4/tcp_tw_reuse 0
其中,前3项分别说明了local port的分配范围(默认的可用端口数不到3w)、incomplete connection queue的最大长度以及3次握手时SYN的最大重试次数,这3项配置的含义,有个概念即可。后3项配置的含义则需要理解,因为它们在定位、解决问题过程中要用到,下面进行重点说明。1) tcp_max_tw_buckets
这篇文档 是这样描述的:Maximal number of time wait sockets held by system simultaneously. If this number is exceeded TIME_WAIT socket is immediately destroyed and warning is printed. This limit exists only to prevent simple DoS attacks, you must not lower the limit artificially, but rather increase it (probably, after increasing installed memory), if network conditions require more than default value (180000).
可见,该配置项用来防范简单的DoS攻击 ,在某些情况下,可以适当调大,但绝对不应调小,否则,后果自负。。。