- net.ipv4.tcp_max_tw_buckets
毕竟它也是会占用一定的资源,所以应该有一个最大值,当超过这个值,系统就会删除最早的连接,这样始终保持在一个数量级。
这个数值就是由net.ipv4.tcp_max_tw_buckets这个参数来决定的。
CentOS7系统,你可以使用sysctl-a|greptw_buckets来查看它的值,默认为32768,
你可以适当把它调低,比如调整到8000,毕竟这个状态的连接太多也是会消耗资源的。
但你不要把它调到几十、几百这样,因为这种状态的tcp连接也是有用的,
如果同样的客户端再次和服务端通信,就不用再次建立新的连接了,用这个旧的通道,省时省力。
- net.ipv4.tcp_tw_recycle=1
所以该参数设置为1就可以让timewait状态的连接快速回收,它需要和下面的参数配合一起使用。
- net.ipv4.tcp_tw_reuse=1
- net.ipv4.tcp_syncookies=1
假如客户端发送请求后直接断开和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次,
这个重试的过程会持续一段时间(通常高于30s),当这种状态的连接数量非常大时,服务器会消耗很大的资源,从而造成瘫痪,
正常的连接进不来,这种恶意的半连接行为其实叫做synflood攻击。
设置为1,是开启SYNCookies,开启后可以避免发生上述的synflood攻击。
开启该参数后,服务端接收客户端的ack后,再向客户端发送ack+syn之前会要求client在短时间内回应一个序号,
如果客户端不能提供序号或者提供的序号不对则认为该客户端不合法,于是不会发ack+syn给客户端,更涉及不到重试。
- net.ipv4.tcp_max_syn_backlog
该参数决定最多能记录几个这样的连接。在CentOS7,默认是256,当有synflood攻击时,这个数值太小则很容易导致服务器瘫痪,
实际上此时服务器并没有消耗太多资源(cpu、内存等),所以可以适当调大它,比如调整到30000。
- net.ipv4.tcp_syn_retries
- net.ipv4.tcp_synack_retries
- net.ipv4.ip_local_port_range
当客户端和服务端建立连接时,比如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,
这个参数定义随机端口的范围。默认为3276861000,建议调整为102561000。
- net.ipv4.tcp_fin_timeout
该参数定义不属于任何进程的该连接状态的超时时间,默认值为60,建议调整为6。
- net.ipv4.tcp_keepalive_time
客户端或服务端会告诉对方要关闭连接,此时状态就会变为timewait,如果客户端没有告诉服务端,
并且服务端也没有告诉客户端关闭的话(例如,客户端那边断网了),此时需要该参数来判定。
比如客户端已经断网了,但服务端上本次连接的状态依然是established,服务端为了确认客户端是否断网,
就需要每隔一段时间去发一个探测包去确认一下看看对方是否在线。这个时间就由该参数决定。它的默认值为7200秒,建议设置为30秒。
- net.ipv4.tcp_keepalive_intvl
此时服务端还不能认定为对方不在线,而是要尝试多次。该参数定义重新发送探测的时间,即第一次发现对方有问题后,过多久再次发起探测。
默认值为75秒,可以改为3秒。
- net.ipv4.tcp_keepalive_probes