Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1161369
  • 博文数量: 220
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1769
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-13 16:19
个人简介

努力, 努力, 再努力

文章分类

全部博文(220)

文章存档

2018年(8)

2017年(46)

2016年(75)

2015年(92)

我的朋友

分类: 系统运维

2017-02-17 19:32:54


. 故障描述:

         1. 环境描述: centos6.5

2. 应用环境: apache 2.4.23 , php-5.6.29

       3.  Web服务器响应很慢,通过netstat –atupno观察,发现大量状态为SYN_RECVTIME_WAIT, CLOSE_WAIT的连接

       问题1 服务器响应慢,是什么造成的? 是大量的SYN_RECV半连接攻击导致的,还是太多的TIME_WAIT, CLOSE_WAIT造成的?无法分清

   问题2:多少个半连接攻击SYN_RECV,会造成服务器响应慢甚至打不开页面

       问题3: TIME_WAIT, CLOSE_WAIT状态的连接究竟产生了什么影响?

       问题4:如果解决?

      

. TCP 4次断开状态转换图

    参考百度文章:《解决连接数过多和半开攻击》疏理TCP状态机的转换

 

绘制TCP 4次断开状态转换图如下:


 

了解了以下问题:

         1. TIME_WAIT状态产生原因以及他为何而存在, 造成何种影响:

       为什么要设置这个状态,原因是有足够的时间让ACK包到达服务器端,如果服务器端没收到ACK包,超时了,然后重新发一个FIN包,直到服务器收到ACK

       TIMEWAIT并不是多余的。在TCP协议被创造,经历了大量的实际场景实践之后,TIMEWAIT出现了

       TIMEWAIT是友好的,TCP要保证在所有可能的情况下使得所有的数据都能够被正确送达

 

       TIMEWAIT的负面影响也很明显:

       高并发的请求在短时间内会占用0-65536中的大量端口,当服务器主动关闭连接时会进入time_wait状态,即等待2MSL时,在centOS6.XMSL=60秒,2MSL就是服务器主动关闭连接后还要等待120秒,在这120秒里,新的连接不能占用处于time_wait状态连接的端口,最终会导致端口资源耗尽,另外,太多连接也会占用过多的内存。这就是time_wait状态将会造成的影响.

      

       2. 要分清是半连接攻击导致响应慢,还是time_wait导致,分步解决

        减少time_wait等待时间,减轻time_wait造成的影响

        之后再考虑半连接攻击问题

 

. 修改内核参数与netstat状态对照

         偿试解决问题:根据实际情况选择修改

         1. 修改内核参数:

             

              命令:vim /etc/sysctl.conf 添加如下条目:

             

              #开启快速回收,centos6.5 默认值1

              net.ipv4.tcp_tw_recycle = 1

             

              #减少time_wait等待时间, net.ipv4.tcp_fin_timeoutMSL, 2*MSL=60

              net.ipv4.tcp_fin_timeout = 30   (centos6.5默认60)

             

              #time_wait连接同时保持的最大数量, 默认262144

              net.ipv4.tcp_max_tw_buckets = 1000

 

              #tcp 已建立连接的保持时间调整为1800, 原为7200(两个小时)

              net.ipv4.tcp_keepalive_time = 1800

 

              # 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表             示关闭

              net.ipv4.tcp_tw_reuse = 1

 

      2. netstat 命令输出:

(1) timer列显示的时间是倒计时

(2) keepalive (1797.70/0/0)  对应 net.ipv4.tcp_keepalive_time = 1800

(3) apache的配置文件中有以下两项:

       KeepAlive On                                  #开启长连接

       KeepAliveTimeout 15                            #apache保持长连接15秒超时

      

       这两个条目的影响是:浏览器超过15秒没有访问web页面,apache会主动

       断开连接,即发送fin包,正常情况下,该连接会迅速进入time_wait状态
    

       Timewait(59.21/0/0) 对应 net.ipv4.tcp_fin_timeout = 30 (30=1MSL)

 

阅读(1764) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~