LINUX TCP套接字详细配置

提升服务器的负载能力,是一个永恒的话题。在一台服务器CPU和内存资源额定有限的状况下,最大的压榨服务器的性能,是最终的目的。要提升 Linux系统下的负载能力,能够先启用Apache的Worker模式,来提升单位时间内的并发量。可是即便这么作了,当网站发展起来以后,链接数过多 的问题就会日益明显。在节省成本的状况下,能够考虑修改Linux的内核TCP/IP参数,来最大的压榨服务器的性能。固然,若是经过修改内核参数也没法 解决的负载问题,也只能考虑升级服务器了,这是硬件所限,没有办法的事。html

Linux系统下,TCP/IP链接断开后,会以TIME_WAIT状态保留必定的时间,而后才会释放端口。当并发请求过多的时候,就会产生大量的 TIME_WAIT状态的链接,没法及时断开的话,会占用大量的端口资源和服务器资源(由于关闭后进程才会退出)。这个时候咱们能够考虑优化TCP/IP 的内核参数,来及时将TIME_WAIT状态的端口清理掉。
本文介绍的方法只对拥有大量TIME_WAIT状态的链接致使系统资源消耗有效,不是这个缘由的状况下,效果可能不明显。那么,到哪儿去查 TIME_WAIT状态的链接呢?那就是使用netstat命令。咱们能够输入一个复核命令,去查看当前TCP/IP链接的状态和对应的个数:linux

#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’web

这个命令会显示出相似下面的结果:算法

LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122apache

咱们只用关心TIME_WAIT的个数,在这里能够看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量 只有65535个,占用一个少一个,会严重的影响到后继的新链接。这种状况下,咱们就有必要调整下Linux的TCP/IP内核参数,让系统更快的释放 TIME_WAIT链接。vim

咱们用vim打开配置文件:缓存

#vim /etc/sysctl.conf安全

而后,在这个文件中,加入下面的几行内容:服务器

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30cookie

最后输入下面的命令,让内核参数生效:

#/sbin/sysctl -p

简单的说明下,上面的参数的含义:

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少许SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。容许将TIME-WAIT sockets从新用于新的TCP链接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP链接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间。

在通过这样的调整以后,除了会进一步提高服务器的负载能力以外,还可以防护必定程度的DDoS、CC和SYN攻击,是个一箭双雕的作法。

此外,若是你的链接数自己就不少,咱们能够再优化一下TCP/IP的可以使用端口范围,进一步提高服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:

net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

这几个参数,建议只在流量很是大的服务器上开启,会有显著的效果。通常的流量小的服务器上,没有必要去设置这几个参数。这几个参数的含义以下:

net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改成20分钟。
net.ipv4.ip_local_port_range = 10000 65000 表示用于向外链接的端口范围。缺省状况下很小:32768到61000,改成10000到65000。(注意:这里不要将最低值设的过低,不然可能会占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,能够容纳更多等待链接的网络链接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT的最大数量,若是超过这个数字,TIME_WAIT将马上被清除并打印警告信息。默 认为180000,改成5000。对于Apache、Nginx等服务器,上几行的参数能够很好地减小TIME_WAIT套接字数量,可是对于 Squid,效果却不大。此项参数能够控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死。

通过这样的配置以后,你的服务器的TCP/IP并发能力又会上一个新台阶。

 

们这里应用的是CentOS5.3,并内核使用的是2.6.18-128.el5PAE #1 SMP 。修改部分TCP ,有的是为了提升性能与负载,可是存在下降稳定性的风险。有的则是安全方面的配置,则有可能牺牲了性能。

1.TCP keepalive TCP链接保鲜设置

echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes

keepalive是TCP保鲜定时器。当网络两端创建了TCP链接以后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP链接情况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。若是没有收到对方的回答(ack包),则会在tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,若是一直没有收到对方的ack,一共会尝试tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。若是尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP链接。

2. syn cookies设置

echo 0 > /proc/sys/net/ipv4/tcp_syncookies

在CentOS5.3中,该选项默认值是1,即启用syn cookies功能。咱们建议先关闭,直到肯定受到syn flood攻击的时候再开启syn cookies功能,有效地防止syn flood攻击。也能够经过iptables规则拒绝syn flood攻击。

3.TCP  链接创建设置

echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 2 > /proc/sys/net/ipv4/tcp_syn_retries
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries

tcp_max_syn_backlog  SYN队列的长度,时常称之为未创建链接队列。系统内核维护着这样的一个队列,用于容纳状态为SYN_RESC的TCP链接(half-open connection),即那些依然还没有获得客户端确认(ack)的TCP链接请求。加大该值,能够容纳更多的等待链接的网络链接数。

tcp_syn_retries  新建TCP链接请求,须要发送一个SYN包,该值决定内核须要尝试发送多少次syn链接请求才决定放弃创建链接。默认值是5. 对于高负责且通讯良好的物理网络而言,调整为2

tcp_synack_retries  对于远端SYN链接请求,内核会发送SYN+ACK数据包来确认收到了上一个SYN链接请求包,而后等待远端的确认(ack数据包)。该值则指定了内核会向远端发送tcp_synack_retires次SYN+ACK数据包。默认设定值是5,能够调整为2

4. TCP 链接断开相关设置

echo 30 >  /proc/sys/net/ipv4/tcp_fin_timeout
echo 15000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 >  /proc/sys/net/ipv4/tcp_tw_recycle

tcp_fin_timeout 对于由本端主动断开链接的TCP链接,本端会主动发送一个FIN数据报,在收到远端ACK后,且并无收到远端FIN包以前,该TCP链接的状态是FIN_WAIT_2状态,此时当远端关闭了应用,网络不可达(拔网张),程序不可断僵死等等,本端会一直保留状态为FIN_WAIT_2状态的TCP链接,该值tcp_fin_timeout则指定了状态为FIN_WAIT_2的TCP链接保存多长时间,一个FIN_WAIT_2的TCP链接最多占1.5k内存。系统默认值是60秒,能够将此值调整为30秒,甚至10秒。

tcp_max_tw_buckets 系统同时处理TIME_WAIT sockets数目。若是一旦TIME_WAIT tcp链接数超过了这个数目,系统会强制清除而且显示警告消息。设立该限制,主要是防止那些简单的DoS攻击,加大该值有可能消耗更多的内存资源。若是TIME_WAIT socket过多,则有可能耗尽内存资源。默认值是18w,能够将此值设置为5000~30000
tcp_tw_resue 是否可使用TIME_WAIT tcp链接用于创建新的tcp链接。

tcp_tw_recycle 是否开启快带回收TIME_WAIT tcp链接的功能。

5. tcp 内存资源使用相参数设定

echo 16777216 > /proc/sys/net/core/rmem_max
echo 16777216 > /proc/sys/net/core/wmem_max
cat /proc/sys/net/ipv4/tcp_mem
echo “4096 65536 16777216″ > /proc/sys/net/ipv4/tcp_rmem
echo “4096 87380 16777216″ > /proc/sys/net/ipv4/tcp_wmem

rmem_max 定义了接收窗口可使用的最大值,能够根据BDP值进行调节。
wmem_max 定义了发送窗口可使用的最大值,能够根据BDP什值进行调整。
tcp_mem [low, pressure, high] TCP用这三个值来跟踪内存使用状况,来限定资源占用。一般状况下,在系统boot之时,内核会根据可用内存总数计算出这些值。若是出现了Out of socket memory,则能够试着修改这个参数。
1)low: 当TCP使用了低于该值的内存页面数时,TCP不会考滤释放内存。
2)pressure: 当TCP使用了超过该值的内存页面数量,TCP试图稳定其对内存的占用,进入pressure模式,直到内存消耗达于low值,退出该模式。
3)hight:容许全部tcp sockets用于排队缓冲数据报的内存页数。
tcp_rmem [min, default, max]
1)min 为每一个TCP链接(tcp socket)预留用于接收缓冲的内存数量,即便在内存出现紧张状况下TCP socket都至少会有这么多数量的内存用于接收缓冲。
2)default 为TCP socket预留用于接收缓冲的内存数量,默认状况下该值影响其它协议使用的 rmem_default的值,因此有可能被rmem_default覆盖。
3)max 该值为每一个tcp链接(tcp socket)用于接收缓冲的内存最大值。该值不会影响wmem_max的值,设置了选项参数 SO_SNDBUF则不受该值影响。
tcp_wmem [min, default, max] 如上(tcp_rmen)只不过用于发送缓存。

注:
1)能够经过sysctl -w 或者写入/etc/sysctl.conf永久保存
2)性能调优仅在于须要的时候进行调整,调整之后须要采集数据与基准测试数据进行比较。建议,不须要盲从地调整这些参数。

 

 

CLOSE_WAIT,TCP的癌症,TCP的朋友。
CLOSE_WAIT状态的生成缘由
首先咱们知道,若是咱们的服务器程序APACHE处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!
由于若是是CLIENT端主动断掉当前链接的话,那么双方关闭这个TCP链接共须要四个packet:
      Client —>  FIN  —>  Server
      Client <—  ACK  <—  Server
这时候Client端处于FIN_WAIT_2状态;而Server 程序处于CLOSE_WAIT状态。
      Client <—  FIN  <—  Server
这时Server 发送FIN给Client,Server 就置为LAST_ACK状态。
       Client —>  ACK  —>  Server
Client回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。
Server 程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明尚未发FIN给Client,那么多是在关闭链接以前还有许多数据要发送或者其余事要作,致使没有发这个FIN packet。
一般来讲,一个CLOSE_WAIT会维持至少2个小时的时间。若是有个流氓特意写了个程序,给你形成一堆的CLOSE_WAIT,消耗
你的资源,那么一般是等不到释放那一刻,系统就已经解决崩溃了。
只能经过修改一下TCP/IP的参数,来缩短这个时间:修改tcp_keepalive_*系列参数有助于解决这个问题。
proc/sys/net/ipv4/下各项的意义
/proc/sys/net/ipv4/icmp_timeexceed_rate
这个在traceroute时致使著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。
/proc/sys/net/ipv4/igmp_max_memberships
主机上最多有多少个igmp (多播)套接字进行监听。
/proc/sys/net/ipv4/inet_peer_gc_maxtime
求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies.
/proc/sys/net/ipv4/inet_peer_gc_mintime
每一遍碎片收集之间的最小时间间隔。当内存压力比较大的时候,调整这个间隔颇有效。以jiffies计。
/proc/sys/net/ipv4/inet_peer_maxttl
entries的最大生存期。在pool没有内存压力的状况下(好比,pool中entries的数量不多的时候),未使用的entries通过一段时间就会过时。以jiffies计。
/proc/sys/net/ipv4/inet_peer_minttl
entries的最小生存期。应该不小于汇聚端分片的生存期。当pool的大小不大于inet_peer_threshold时,这个最小生存期必须予以保证。以jiffies计。
/proc/sys/net/ipv4/inet_peer_threshold
The approximate size of the INET peer storage. Starting from this threshold entries will be thrown aggressively. This threshold also determines entries’ time-to-live and time intervals between garbage collection passes. More entries, less time-to-live, less GC interval.
/proc/sys/net/ipv4/ip_autoconfig
这个文件里面写着一个数字,表示主机是否经过RARP、BOOTP、DHCP或者其它机制取得其IP配置。不然就是0。
/proc/sys/net/ipv4/ip_default_ttl
数据包的生存期。设置为64是安全的。若是你的网络规模巨大就提升这个值。不要由于好玩而这么作??那样会产生有害的路由环路。实际上,在不少状况下你要考虑可否减少这个值。
/proc/sys/net/ipv4/ip_dynaddr/proc/sys/net/ipv4/icmp_destunreach_rate
若是你有一个动态地址的自动拨号接口,就得设置它。当你的自动拨号接口激活的时候,本地全部没有收到答复的TCP套接字会从新绑定到正确的地址上。这能够解决引起拨号的套接字自己没法工做,重试一次却能够的问题。
/proc/sys/net/ipv4/ip_forward
内核是否转发数据包。缺省禁止。
/proc/sys/net/ipv4/ip_local_port_range
用于向外链接的端口范围。缺省状况下其实很小:1024到4999。
/proc/sys/net/ipv4/ip_no_pmtu_disc
若是你想禁止“沿途MTU发现”就设置它。“沿途MTU发现”是一种技术,能够在传输路径上检测出最大可能的MTU值。参见Cookbook一章中关于“沿途MTU发现”的内容。
/proc/sys/net/ipv4/ipfrag_high_thresh
用 于IP分片汇聚的最大内存用量。分配了这么多字节的内存后,一旦用尽,分片处理程序就会丢弃分片。When ipfrag_high_thresh bytes of memory is allocated for this purpose, the fragment handler will toss packets until ipfrag_low_thresh is reached.
/proc/sys/net/ipv4/ip_nonlocal_bind
若是你但愿你的应用程序可以绑定到不属于本地网卡的地址上时,设置这个选项。若是你的机器没有专线链接(甚至是动态链接)时很是有用,即便你的链接断开,你的服务也能够启动并绑定在一个指定的地址上。
/proc/sys/net/ipv4/ipfrag_low_thresh
用于IP分片汇聚的最小内存用量。
/proc/sys/net/ipv4/ipfrag_time
IP分片在内存中的保留时间(秒数)。
/proc/sys/net/ipv4/tcp_abort_on_overflow
一个布尔类型的标志,控制着当有不少的链接请求时内核的行为。启用的话,若是服务超载,内核将主动地发送RST包。
/proc/sys/net/ipv4/tcp_fin_timeout
如 果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端能够出错并永远不关闭链接,甚至意外当机。缺省值是60秒。2.2 内核的一般值是180秒,你能够按这个设置,但要记住的是,即便你的机器是一个轻载的WEB服务器,也有由于大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,由于它最多只能吃掉1.5K内存,可是它们的生存期长些。参见tcp_max_orphans。
/proc/sys/net/ipv4/tcp_keepalive_time
当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。
/proc/sys/net/ipv4/tcp_keepalive_intvl
当探测没有确认时,从新发送探测的频度。缺省是75秒。
/proc/sys/net/ipv4/tcp_keepalive_probes
在认定链接失效以前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl以后决定了,一个链接发送了keepalive以后能够有多少时间没有回应。
/proc/sys/net/ipv4/tcp_max_orphans
系 统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。若是超过这个数字,孤儿链接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单 的DoS攻击,你绝对不能过度依靠它或者人为地减少这个值,更应该增长这个值(若是增长了内存以后)。This limit exists only to prevent simple DoS attacks, you _must_ not rely on this or lower the limit artificially, but rather increase it (probably, after increasing installed memory), if network conditions require more than default value, and tune network services to linger and kill such states more aggressively. 让我再次提醒你:每一个孤儿套接字最多可以吃掉你64K不可交换的内存。
/proc/sys/net/ipv4/tcp_orphan_retries
本端试图关闭TCP链接以前重试多少次。缺省值是7,至关于50秒~16分钟(取决于RTO)。若是你的机器是一个重载的WEB服务器,你应该考虑减低这个值,由于这样的套接字会消耗不少重要的资源。参见tcp_max_orphans。
/proc/sys/net/ipv4/tcp_max_syn_backlog
记 录的那些还没有收到客户端确认信息的链接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。若是服务器不堪重负,试 试提升这个值。注意!若是你设置这个值大于1024,最好同时调整include/net/tcp.h中的TCP_SYNQ_HSIZE,以保证 TCP_SYNQ_HSIZE*16 ≤tcp_max_syn_backlo,而后从新编译内核。
/proc/sys/net/ipv4/tcp_max_tw_buckets
系 统同时保持timewait套接字的最大数量。若是超过这个数字,time-wait套接字将马上被清除并打印警告信息。这个限制仅仅是为了防止简单的 DoS攻击,你绝对不能过度依靠它或者人为地减少这个值,若是网络实际须要大于缺省值,更应该增长这个值(若是增长了内存以后)。
/proc/sys/net/ipv4/tcp_retrans_collapse
为兼容某些糟糕的打印机设置的“将错就错”选项。再次发送时,把数据包增大一些,来避免某些TCP协议栈的BUG。
/proc/sys/net/ipv4/tcp_retries1
在认定出错并向网络层提交错误报告以前,重试多少次。缺省设置为RFC规定的最小值:3,至关于3秒~8分钟(取决于RIO)。
/proc/sys/net/ipv4/tcp_retries2
在杀死一个活动的TCP链接以前重试多少次。RFC 1122规定这个限制应该长于100秒。这个值过小了。缺省值是15,至关于13~30分钟(取决于RIO)。
/proc/sys/net/ipv4/tcp_rfc1337
这个开关能够启动对于在RFC1337中描述的“tcp的time-wait暗杀危机”问题的修复。启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST包。却省为0。
/proc/sys/net/ipv4/tcp_sack
特别针对丢失的数据包使用选择性ACK,这样有助于快速恢复。
/proc/sys/net/ipv4/tcp_stdurg
使用TCP紧急指针的主机需求解释。由于绝大多数主机采用BSD解释,因此若是你在Linux上打开它,可能会影响它与其它机器的正常通信。缺省是FALSE。
/proc/sys/net/ipv4/tcp_syn_retries
在内核放弃创建链接以前发送SYN包的数量。
/proc/sys/net/ipv4/tcp_synack_retries
为了打开对端的链接,内核须要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃链接以前发送SYN ACK包的数量。
/proc/sys/net/ipv4/tcp_timestamps
时间戳能够避免序列号的卷绕。一个1Gbps的链路确定会遇到之前用过的序列号。时间戳可以让内核接受这种“异常”的数据包。
/proc/sys/net/ipv4/tcp_tw_recycle
可以更快地回收TIME-WAIT套接字。缺省值是1。除非有技术专家的建议和要求,不然不该修改。
/proc/sys/net/ipv4/tcp_window_scaling
通常来讲TCP/IP容许窗口尺寸达到65535字节。对于速度确实很高的网络而言这个值可能仍是过小。这个选项容许设置上G字节的窗口大小,有利于在带宽*延迟很大的环境中使用。
一旦内核认为它没法发包,就会丢弃这个包,并向发包的主机发送ICMP通知。
/proc/sys/net/ipv4/icmp_echo_ignore_all
根本不要响应echo包。请不要设置为缺省,它可能在你正被利用成为DoS攻击的跳板时可能有用。
/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [Useful]
若是你ping子网的子网地址,全部的机器都应该予以回应。这可能成为很是好用的拒绝服务攻击工具。设置为1来忽略这些子网广播消息。
/proc/sys/net/ipv4/icmp_echoreply_rate
设置了向任意主机回应echo请求的比率。
/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
设置它以后,能够忽略由网络中的那些声称回应地址是广播地址的主机生成的ICMP错误。
/proc/sys/net/ipv4/icmp_paramprob_rate
一个相对不很明确的ICMP消息,用来回应IP头或TCP头损坏的异常数据包。你能够经过这个文件控制消息的发送比率。
================================================================

http://skylove.study-area.org/blog/2006/07/linuxip_29.html

tcp_syn_retries :INTEGER默认值是5对于一个新建链接,内核要发送多少个 SYN 链接请求才决定放弃。不该该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通讯良好的网络而言,这个值偏高,可修改成2.这个值仅 仅是针对对外的链接,对进来的链接,是由tcp_retries1 决定的)tcp_synack_retries :INTEGER默认值是5对于远端的链接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN链接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃链接以前所送出的 SYN ACK 数目。不该该大于255,默认值是5,对应于180秒左右时间。(能够根据上面的 tcp_syn_retries 来决定这个值)tcp_keepalive_time :INTEGER默认值是7200(2小时)当keepalive打开的状况下,TCP发送keepalive消息的频率。(因为目前网络攻击等因素,形成了利用这个进行的攻击很频繁,曾经也有cu 的朋友提到过,说若是2边创建了链接,而后不发送任何数据或者rst/fin消息,那么持续的时间是否是就是2小时,空链接攻击? tcp_keepalive_time就是预防此情形的.我我的在作nat服务的时候的修改值为1800秒)tcp_keepalive_probes:INTEGER默认值是9TCP发送keepalive探测以肯定该链接已经断开的次数。(注意:保持链接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不须要修改,固然根据情形也能够适当地缩短此值.设置为5比较合适)tcp_keepalive_intvl:INTEGER默认值为75探测消息发送的频率,乘以tcp_keepalive_probes就获得对于从开始探测以来没有响应的链接杀除的时间。默认值为75秒,也就是没有活动 的链接将在大约11分钟之后将被丢弃。(对于普通应用来讲,这个值有一些偏大,能够根据须要改小.特别是web类服务器须要改小该值,15是个比较合适的 值)tcp_retries1 :INTEGER默认值是3放弃回应一个TCP链接请求前?须要进行多少次重试。RFC 规定最低的数值是3?这也是默认值?根据RTO的值大约在3秒 – 8分钟之间。(注意:这个值同时还决定进入的syn链接)tcp_retries2 :INTEGER默认值为15在丢弃激活(已创建通信情况)的TCP链接以前?须要进行多少次重试。默认值为15,根据RTO的值来决定,至关于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,能够适当地改小,个人网络内修改成了5)tcp_orphan_retries :INTEGER默认值是7在近端丢弃TCP链接以前?要进行多少次重试。默认值是7个?至关于 50秒 – 16分钟?视 RTO 而定。若是您的系统是负载很大的web服务器?那么也许须要下降该值?这类 sockets 可能会耗费大量的资源。另外参的考 tcp_max_orphans 。(事实上作NAT的时候,下降该值也是好处显著的,我本人的网络环境中下降该值为3)tcp_fin_timeout :INTEGER默认值是 60对于本端断开的socket链接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开链接或一直不结束链接或不可预料的进程死亡。默认值为 60 秒。过去在2.2版本的内核中是 180 秒。您能够设置该值?但须要注意?若是您的机器为负载很重的web服务器?您可能要冒内存被大量无效数据报填满的风险?FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1 ?由于它们最多只吃 1.5K 的内存?可是它们存在时间更长。另外参考 tcp_max_orphans。(事实上作NAT的时候,下降该值也是好处显著的,我本人的网络环境中下降该值为30)tcp_max_tw_buckets :INTEGER默认值是180000系 统在同时所处理的最大 timewait sockets 数目。若是超过此数的话?time-wait socket 会被当即砍除而且显示警告信息。之因此要设定这个限制?纯粹为了抵御那些简单的 DoS 攻击?千万不要人为的下降这个限制?不过?若是网络条件须要比默认值更多?则能够提升它(或许还要增长内存)。(事实上作NAT的时候最好能够适当地增长 该值)tcp_tw_recycle :BOOLEAN默认值是0打开快速 TIME-WAIT sockets 回收。除非获得技术专家的建议或要求?请不要随意修改这个值。(作NAT的时候,建议打开它)tcp_tw_reuse:BOOLEAN默认值是0该文件表示是否容许从新应用处于TIME-WAIT状态的socket用于新的TCP链接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形很是有帮助)tcp_max_orphans :INTEGER缺省值是8192系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量?那么不属于任何进程的链接会被当即reset,并同时显示警告信息。之因此要设定这个限制?纯粹为了抵御那些 简单的 DoS 攻击?千万不要依赖这个或是人为的下降这个限制(这个值Redhat AS版本中设置为32768,可是不少防火墙修改的时候,建议该值修改成2000)tcp_abort_on_overflow :BOOLEAN缺省值是0当守护进程太忙而不能接受新的链接,就象对方发送reset消息,默认值是false。这意味着当溢出的缘由是由于一个偶然的猝发,那么链接将恢复状态。 只有在你确信守护进程真的不能完成链接请求时才打开该选项,该选项会影响客户的使用。(对待已经满载的sendmail,apache这类服务的时候,这 个能够很快让客户端终止链接,能够给予服务程序处理已有链接的缓冲机会,因此不少防火墙上推荐打开它)tcp_syncookies :BOOLEAN默认值是0只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生做用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。注意:该选项千万不能用于那些没有收到攻击的高负载服务器,若是在日志中出现synflood消息,可是调查发现没有收到synflood攻击,而是合法用户的链接负载太高的缘由,你应该调整其它参数来提升服务器性能。参考:tcp_max_syn_backlogtcp_synack_retriestcp_abort_on_overflowsyncookie严重的违背TCP协议,不容许使用TCP扩展,可能对某些服务致使严重的性能影响(如SMTP转发)。(注意,该实现与BSD上面使用 的tcp proxy同样,是违反了RFC中关于tcp链接的三次握手实现的,可是对于防护syn-flood的确颇有用.)tcp_stdurg :BOOLEAN默认值为0使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释,所以若是您在 Linux 打开它?或会致使不能和它们正确沟通。tcp_max_syn_backlog :INTEGER对于那些依然还未得到客户端确认的链接请求?须要保存在队列中最大数目。对于超过 128Mb 内存的系统?默认值是 1024 ?低于 128Mb 的则为 128。若是服务器常常出现过载?能够尝试增长这个数字。警告?假如您将此值设为大于 1024?最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE ?以保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ?而且编进核心以内。(SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开链接到目标系统,最终致使目标系统Socket队列资源耗 尽而没法接受新的链接。为了应付这种攻击,现代Unix系统中广泛采用多链接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完 全链接应用(Connect()和Accept() ),是用另外一个队列单独存放半打开链接。这种双队列处理方式和其余一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,可以比较有 效的缓解小规模的SYN Flood攻击(事实证实<1000p/s)加大SYN队列长度能够容纳更多等待链接的网络链接数,因此对Server来讲能够考虑增大该值.)tcp_window_scaling :INTEGER缺省值为1该 文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip一般使用的窗口最大可达到 65535 字节,对于高速网络,该值可能过小,这时候若是启用了该功能,可使tcp/ip滑动窗口大小增大数个数量级,从而提升数据传输的能力(RFC 1323)。(对普通地百M网络而言,关闭会下降开销,因此若是不是高速网络,能够考虑设置为0)tcp_timestamps :BOOLEAN缺省值为1Timestamps 用在其它一些东西中?能够防范那些伪造的 sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是因为上次产生的)。Timestamp 会让它知道这是个 ‘旧封包’。(该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。)tcp_sack :BOOLEAN缺省值为1使 用 Selective ACK?它能够用来查找特定的遗失的数据报— 所以有助于快速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这能够经过有选择地应答乱序接收到的报文来提升性能(这样可让发送者只发送丢失的报文段)。(对于广域网通讯来讲这个 选项应该启用,可是这会增长对 CPU 的占用。)tcp_fack :BOOLEAN缺省值为1打开FACK拥塞避免和快速重传功能。(注意,当tcp_sack设置为0的时候,这个值即便设置为1也无效)tcp_dsack :BOOLEAN缺省值为1容许TCP发送”两个彻底相同”的SACK。tcp_ecn :BOOLEAN缺省值为0打开TCP的直接拥塞通告功能。tcp_reordering :INTEGER默认值是3TCP流中重排序的数据报最大数量 。 (通常有看到推荐把这个数值略微调整大一些,好比5)tcp_retrans_collapse :BOOLEAN缺省值为1对于某些有bug的打印机提供针对其bug的兼容性。(通常不须要这个支持,能够关闭它)tcp_wmem(3个INTEGER变量): min, default, maxmin:为TCP socket预留用于发送缓冲的内存最小值。每一个tcp socket均可以在建议之后均可以使用它。默认值为4096(4K)。default:为TCP socket预留用于发送缓冲的内存数量,默认状况下该值会影响其它协议使用的net.core.wmem_default 值,通常要低于net.core.wmem_default的值。默认值为16384(16K)。max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,”静态”选择参数SO_SNDBUF则不受该值影响。默认值为 131072(128K)。(对于服务器而言,增长这个参数的值对于发送数据颇有帮助,在个人网络环境中,修改成了51200 131072 204800)tcp_rmem (3个INTEGER变量): min, default, maxmin:为TCP socket预留用于接收缓冲的内存数量,即便在内存出现紧张状况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。default:为TCP socket预留用于接收缓冲的内存数量,默认状况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值状况下,TCP窗口大小为65535。 默认值为87380max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,”静态”选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。(能够看出,.max的设置最好是default的两倍,对于NAT来讲主要该增长它,个人网络里为 51200 131072 204800)tcp_mem(3个INTEGER变量):low, pressure, highlow:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。(理想状况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 – 这第 2 个值代表,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出 pressure状态。(理想状况下这个值应该是 TCP 可使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )high:容许全部tcp sockets用于排队缓冲数据报的页面量。(若是超过这个值,TCP 链接将被拒绝,这就是为何不要令其过于保守 (512000 * 300 / 4096) 的缘由了。 在这种状况下,提供的价值很大,它能处理不少链接,是所预期的 2.5 倍;或者使现有链接可以传输 2.5 倍的数据。 个人网络里为192000 300000 732000)通常状况下这些值是在系统启动时根据系统内存数量计算获得的。tcp_app_win : INTEGER默认值是31保留max(window/2^tcp_app_win, mss)数量的窗口因为应用缓冲。当为0时表示不须要缓冲。tcp_adv_win_scale : INTEGER默认值为2计算缓冲开销bytes/2^tcp_adv_win_scale(若是tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(若是tcp_adv_win_scale <= 0)。tcp_rfc1337 :BOOLEAN缺省值为0这个开关能够启动对于在RFC1337中描述的”tcp 的time-wait暗杀危机”问题的修复。启用后,内核将丢弃那些发往time-wait状态TCP套接字的RST 包.tcp_low_latency : BOOLEAN缺省值为0容许 TCP/IP 栈适应在高吞吐量状况下低延时的状况;这个选项通常情形是的禁用。(但在构建Beowulf 集群的时候,打开它颇有帮助)tcp_westwood :BOOLEAN缺省值为0启用发送者端的拥塞控制算法,它能够维护对吞吐量的评估,并试图对带宽的总体利用状况进行优化;对于 WAN 通讯来讲应该启用这个选项。tcp_bic :BOOLEAN缺省值为0为快速长距离网络启用 Binary Increase Congestion;这样能够更好地利用以 GB 速度进行操做的连接;对于 WAN 通讯应该启用这个选项。# 如下一段为抵抗syn flood攻击,平时建议关闭sysctl -w net.ipv4.tcp_syncookies=1              # tcp syncookie,默认关闭sysctl -w net.ipv4.tcp_max_syn_backlog=1280   # syn队列,默认1024,> 1280可能工做不稳定,须要修改内核源码参数sysctl -w net.ipv4.tcp_synack_retries=2             # syn-ack握手状态重试次数,默认5,遭受syn-flood攻击时改成1或2sysctl -w net.ipv4.tcp_syn_retries=2                  # 外向syn握手重试次数,默认4# 如下一段为应对tcp connect链接耗尽攻击,若是开启iptables connlimit模块可禁用# 有严重链接性能影响和不稳定因素,慎用sysctl -w tcp_tw_recycle=1                           # 默认0,tw快速回收sysctl -w tcp_tw_reuse=1                             # 默认0,tw重用sysctl -w tcp_keepalive_intvl=60                    # 默认75,tcp keeplive探测轮询时间sysctl -w tcp_keepalive_probes=3                  # 默认9,tcp keeplive探测轮询次数sysctl -w tcp_keepalive_time=1800                # 默认7200,tcp keeplive时间sysctl -w tcp_fin_timeout=30                        # 默认60,tcp fin状态超时时间#sysctl -w net.ipv4.tcp_retries1=2                     # tcp链接重传参数,慎用#sysctl -w net.ipv4.tcp_retries2=8sysctl -w net.ipv4.ip_conntrack_max=65535          # 增大iptables状态跟踪表

相关文章
相关标签/搜索