解决连接数过多和半开攻击_第1页
解决连接数过多和半开攻击_第2页
解决连接数过多和半开攻击_第3页
解决连接数过多和半开攻击_第4页
解决连接数过多和半开攻击_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录解决TCP连接数过多的问题1解决方法:4解决半开攻击的方法5解决方法:8解决TCP连接数过多的问题TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题TCP状态迁移对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基本上显示着established,time_wait,close_wait等大家很明白TCP初始化连接三次握手吧:发SYN包,然后返回SYN/ACK包,再发ACK包,连接正式建立。但是这里有点出入,当请求者收到SYS /ACK包后,就开始建立连接了,而被请求者第三次握手结束后才建立连接。但是大家明白关闭连接的工作原理吗?关闭连接要四

2、次握手:发FIN包,ACK 包,FIN包,ACK包,四次握手!为什么呢,因为TCP连接是全双工,我关了你的连接,并不等于你关了我的连接。客户端TCP状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED服务器TCP状态迁移:CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED当客户端开始连接时,服务器还处于LISTENING,客户端发一个SYN包后

3、,他就处于SYN_SENT状态,服务器就处于SYS收到状态,然后互相确认进入连接状态ESTABLISHED.当客户端请求关闭连接时,客户端发送一个FIN包后,客户端就进入FIN_WAIT_1状态,等待对方的确认包,服务器发送一个ACK包给客户,客户端收到ACK包后结束FIN_WAIT_1状态,进入FIN_WAIT_2状态,等待服务器发过来的关闭请求,服务器发一个FIN包后,进入CLOSE_WAIT状态,当客户端收到服务器的FIN包,FIN_WAIT_2状态就结束,然后给服务器端的FIN包给以一个确认包,客户端这时进入TIME_WAIT,当服务器收到确认包后,CLOSE_WAIT状态结束了,这时

4、候服务器端真正的关闭了连接.但是客户端还在TIME_WAIT状态下,什么时候结束呢.我在这里再讲到一个新名词:2MSL等待状态,其实TIME_WAIT就是2MSL等待状态,为什么要设置这个状态,原因是有足够的时间让ACK包到达服务器端,如果服务器端没收到ACK包,超时了,然后重新发一个FIN包,直到服务器收到ACK 包.TIME_WAIT状态等待时间是在TCP重新启动后不连接任何请求的两倍.大家有没有发现一个问题:如果对方在第三次握手的时候出问题,如发FIN包的时候,不知道什么原因丢了这个包,然而这边一直处在FIN_WAIT_2状 态,而且TCP/IP并没有设置这个状态的过期时间,那他一直会保

5、留这个状态下去,越来越多的FIN_WAIT_2状态会导致系统崩溃.上面我碰到的这个问题主要因为TCP的结束流程未走完,造成连接未释放。现设客户端主动断开连接,流程如下 如上图所示,Client                            消息                            

6、       Server         close()- FIN ->FIN_WAIT1                                                         CLOSE_WAI

7、T<- ACK -FIN_WAIT2 close()<- FIN -                     TIME_WAIT                                                 &

8、#160;     LAST_ACK                                            - ACK -> CLOSEDCLOSED由于Server的Socket在客户端已经关闭时而没有调用关闭,造成服务器端的连接处在“挂起”状态,而客户端则处在等待应答的状态上。此问题的典型特征是:一端处于FIN_WAIT2

9、 ,而另一端处于CLOSE_WAIT.不过,根本问题还是程序写的不好,有待提高-CLOSE_WAIT,TCP的癌症,TCP的朋友。CLOSE_WAIT状态的生成原因首先我们知道,如果我们的服务器程序APACHE处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!因为如果是CLIENT端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet:Client -> FIN -> ServerClient <- ACK <- Server这时候Client端处于FIN_WAIT_2状态;而Server 程序处于CLOSE_WAIT状态。Client <

10、;- FIN <- Server这时Server 发送FIN给Client,Server 就置为LAST_ACK状态。Client -> ACK -> ServerClient回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。Server 程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其 他事要做,导致没有发这个FIN packet。解决方法:修改/etc/sysctl.conf添加net.ipv4.tcp_keepalive_time = 3600establ

11、ished状态保持时间为3600秒net.ipv4.tcp_keepalive_probes = 6established状态保持时间到期后请求次数net.ipv4.tcp_keepalive_intvl = 25每次请求的间隔时间为25秒然后保存文件sysctl p 使修改的文件立即生效解决半开攻击的方法TIMEWAIT状态本身 和应用层的客户端或者服务器是没有关系的。仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候 会出现这个TIMEWAIT。服务器在处理客户端请求的时候,如果你的程序设计为服务器主动关闭,那么你才有可能需要关注这

12、个TIMEWAIT状态过多的问题。如果你的服务器设计为被动关闭,那么你首先要关注的是CLOSE_WAIT。 原则TIMEWAIT并不是多余的 。 在TCP协议被创造, 经历了大量的实际场景实践之后 ,TIMEWAIT 出现了,因为TCP主 动关闭连接的一方需要TIMEWAIT状态,它是我们的朋友。这是  UNIX网络编程 的作者-Steven对TIMEWAIT的态度。 TIMEWAIT是友好的      TCP 要保证在所有可

13、能的情况下使得所有的数据都能够被正确送达。当你关闭一个 socket 时,主动关闭一端的 socket 将进入 TIME_WAIT 状态,而被动关闭一方则转入CLOSED状态,这的确能够保证所有的数据都被传输。当一个socket关闭的时候,是通过两端四次握手完成的,当一端调用close()时,就说明本端没有数据要发送了。这好似看来在握手完成以后,socket就都可以处于初始的CLOSED状态了,其实不然。原因是这样安排状态有两个问题, 首先,我们没有任何机制保证最后的一个ACK能够正常传输,第二,网络上仍然有可能有残余的数据包(wan

14、dering duplicates),我们也必须能够正常处理。 TIMEWAIT就是为了解决这两个问题而生的。 1.假设最后一个 ACK 丢失了,被动关闭一方会重发它的 FIN。 主动关闭一方必须维持一个有效状态信息(TIMEWAIT状态下维持),以便能够重发 ACK。 如果主动关闭的socket不维持这种状态而进入CLOSED状态,那么主动关闭的socket在处于CLOSED状态时, 接收到FIN后将会响应一个RST。被动关闭一方接收到RST后会认为出错了。如果TCP协议想要正常完成必要的操作而终止双方

15、的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。这就是为什么socket在关闭后,仍然处于TIME_WAIT状态的第一个原因,因为他要等待以便重发ACK。2.假设 目前连接的通信双方都已经调用了 close() ,双方同时进入 CLOSED的终结状态,而没有走 TIME_WAIT 状态。会出现如下问题,现在有一个新的连接被建立起来,使用的IP地址与端口与先前的完全相同,后建立的连接是原先连接的一个完全复用。还假定原先的连接中有数据报残存于网络之中,这样新的连接收到的数据报中有可能是先前连接的数据报。为了防止这一点

16、,TCP不允许新连接复用TIME_WAIT状态下的socket。处于TIME_WAIT状态的socket在等待两倍的MSL时间以后(之所以是两倍的MSL,是由于MSL是一个数据报在网络中单向发出到认定丢失的时间,一个数据报有可能在发送途中或是其响应过程中成为残余数据报,确认一个数据报及其响应的丢弃的需要两倍的MSL),将会转变为CLOSED状态。这就意味着,一个成功建立的连接,必然使得先前网络中残余的数据报都丢失了。大量TIMEWAIT在某些场景中导致的令人头疼的业务 问题大量TIMEWAIT出现,并且需要解决 的场景      &#

17、160; 在高并发短连接的TCP服务器上,当服务器处理完 请求后立刻按照主动正常 关闭连接。这个场景下, 会出现大量socket处于 TIMEWAI T 状态。如果客户端的并发量持续很高, 此时部分客户端就会显示 连接不上。 我来解释下这个场景。 主动正常关闭TCP连接,都会出 现TIMEWAIT。为什么我们要关注这个高并发短连接呢?有两个方面需要注意 : 1. 高并发可以让服务器在短时间范围内同时 占用大量端口,而端口有个065535的范围,并

18、不是很多,刨除系统和其他服务要用的,剩下的就更少了 。 2. 在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。这里有个相对长短 的概念,比如,取一个web页面,1秒钟的http 短连接处理完业务, 在关闭连接之后,这个业务用过的端口 会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的 。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源) 被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。(说

19、个题外话,从这个意义出发来考虑服务器性能调优的话, 长连接业务的服务 就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中, 一般长连接对应的业务的并发量并不会很高 ) 综合这两个方面,持续的到达一定量的 高并发短连接,会使服务器因端口资源不足而拒绝为一 部分客户服务。同时,这些端口都是服务器临时分配,无法用SO_ REUSEADDR选项解决这个问题:( 一对矛盾TIMEWAIT既友好,又令人头疼。 但是我们还是要抱着一个友好的态度来看待它,因为它尽

20、它的能力保证了服务器的健壮性。 可行而且必须存在, 但是不符合原则的解决方式1. linux没有在sysctl或者proc文件系统暴露修改 这个TIMEWAIT超时时间的接口 ,可以修改内核协议栈代码中关于这个TIMEWAIT的超时时间参数,重编内核,让它缩短超时时间,加快回收; 2. 利用SO_LINGER选项的强制关闭方式,发RST而不是FIN,来越过TIMEWAIT状态,直接进入CLOSED状态。详见我的博 文 TCP之选项 SO_LINGER  。 我如何看待这个问题为什么说上述两种解决方式我觉得可行,但是不符合原则? 我首先认为,我要依靠TIMEWAIT状态来保证

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论