`
DavisWang
  • 浏览: 52400 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对服务器上出现大量的SYN_RCVD状态的TCP连接的问题分析

阅读更多

        首先我们需要弄清楚SYN_RCVD状态是怎样产生的,通过TCP状态转换图(如下图)我们可以清楚的看到,SYN_RCVD是TCP三次握手的中间状态,是服务端口(监听端口,如应用服务器的80端口)收到SYN包并发送[SYN,ACK]包后所处的状态。这时如果再收到ACK的包,就完成了三次握手,建立起TCP连接。

      如果服务器上出现大量的SYN_RCVD状态的TCP连接说明这些连接一直没有收到ACK包,这主要有两种可能,一种是对方(请求方或客户端)没有收到服务器发送的[SYN,ACK]包,另一种可能是对方收到了[SYN,ACK]包却没有ACK。

      对于第一种情况一般是由于网络结构或安全规则限制导致(SYN,ACK)包无法发送到对方,这种情况比较容易判断:只要在服务器上能够ping通互联网的任意主机,基本可以排除这种情况。

      对于第二种情况要稍微复杂一些,这种情况还有两种可能:一种是对方根本就不打算ACK,一般在对方程序有意为之才会出现,如SYN Flood类型的DOS/DDOS攻击;另一种可能是对方收到的[SYN,ACK]包不合法,常见的是SYN包的目的地址(服务地址)和应答[SYN,ACK]包的源地址不同。这种情况在只配置了DNAT而不进行SNAT的服务网络环境下容易出现,主要是由于inbound(SYN包)和outbound([SYN,ACK]包)的包穿越了不同的网关/防火墙/负载均衡器,从而导致[SYN,ACK]路由到互联网的源地址(一般是防火墙的出口地址)与SYN包的目的地址(服务的虚拟IP)不同,这时客户机无法将SYN包和[SYN,ACK]包关联在一起,从而会认为已发出的SYN包还没有被应答,于是继续等待应答包。这样服务器端的连接一直保持在SYN_RCVD状态(半开连接)直到超时。     

  • 大小: 77.6 KB
分享到:
评论
3 楼 eyesmore 2012-04-11  
上面的推断没有完全验证,期待跟您讨论下,谢谢
2 楼 eyesmore 2012-04-11  
分析得相当好,学习到了。但是“对于第二种情况要稍微复杂一些,这种情况还有两种可能。” 你说的两种情况,感觉应该不会是平时大家常见的。我想和您讨论下另外一个情况,总的来说事因为 backlog 队列满了,我的linux服务器  /proc/sys/net/ipv4/tcp_max_syn_backlog 显示的是8192(不了解是否是默认值),这么大的数值能满听起来不可思议。那么这个多米了骨牌是怎么产生的呢? 1、数据库太多的慢查询; => 2、连接池的连接不够用; =>3、Resin用于处理http请求的工作线程开始大量进入WATING状态;  =>4、Resin用于处理http请求的工作线程耗尽; => 5、没有Resin工作线程执行serverSocket.accept()了,但是网站如果访问量高,这个时候大量的TCP连接还在不断进来; => 6、客户连接开始在backlog队列排队,8192个一下子也耗尽(8192远没有大家想想得那么多,一个8千万的访问的站点,意味着每秒钟处理1K个HTTP请求);  =>7、当backlog塞满的时候,windows的策略是拒绝后来的连接,但是linux的策略是受不到客户端的三次握手的ACK,tcpdump的时候明明能看到ACK过来了,但是可能有意不处理,奇怪的是linux服务端每收到ACK,立马重发SYN|ACK,也就是说:linux有意把后来的连接滞留在 SYN_RECV状态,既不果断断开,又不建立,即使收到ACK了。 注意:我做了些实验是基于 SeverSocket传入 backlog参数的,并没有让她超过linux服务器的。
1 楼 eyesmore 2012-04-11  
分析得相当好,学习到了。但是“对于第二种情况要稍微复杂一些,这种情况还有两种可能。” 你说的两种情况,感觉应该不会是平时大家常见的。我想和您讨论下另外一个情况,总的来说事因为 backlog 队列满了,我的linux服务器  /proc/sys/net/ipv4/tcp_max_syn_backlog 显示的是8192(不了解是否是默认值),这么大的数值能满听起来不可思议。那么这个多米了骨牌是怎么产生的呢? 1、数据库太多的慢查询; => 2、连接池的连接不够用; =>3、Resin用于处理http请求的工作线程开始大量进入WATING状态;  =>4、Resin用于处理http请求的工作线程耗尽; => 5、没有Resin工作线程执行serverSocket.accept()了,但是网站如果访问量高,这个时候大量的TCP连接还在不断进来; => 6、客户连接开始在backlog队列排队,8192个一下子也耗尽(8192远没有大家想想得那么多,一个8千万的访问的站点,意味着每秒钟处理1K个HTTP请求);  =>7、当backlog塞满的时候,windows的策略是拒绝后来的连接,但是linux的策略是受不到客户端的三次握手的ACK,tcpdump的时候明明能看到ACK过来了,但是可能有意不处理,奇怪的是linux服务端每收到ACK,立马重发SYN|ACK,也就是说:linux有意把后来的连接滞留在 SYN_RECV状态,既不果断断开,又不建立,即使收到ACK了。 注意:我做了些实验是基于 SeverSocket传入 backlog参数的,并没有让她超过linux服务器的。

相关推荐

    tcp连接状态详解 描述了tcp协议常用的命令

    TCP 连接状态详解 TCP 连接状态是指在 TCP 协议中,连接的不同阶段所对应的状态。...了解 TCP 连接状态是非常重要的,因为它可以帮助我们更好地理解 TCP 协议的工作机理,并更好地解决网络连接问题。

    TCP SYN Flood分析

    TCP SYN Flood攻击正是利用这个特性,客户端发送大量的SYN请求,但不回应服务器的SYN+ACK报文,使得服务器保持大量处于SYN_RCVD状态的半打开连接,最终耗尽服务器资源。 #### 三、TFN2K(Tribe Flood Network 2000...

    剖析TCP连接的状态变迁图

    TCP连接的状态变迁图是理解TCP工作原理的关键,它清晰地展示了TCP连接从建立到关闭的整个过程,对于排查网络和系统问题具有重要意义。 TCP连接的状态变迁主要包括以下几个阶段: 1. **三次握手建立连接**: - **...

    TCP_Connection_Status.zip

    本压缩包"TCP_Connection_Status.zip"包含两个文件,分别是用于监控和分析TCP连接状态的脚本"lvm_netstat_tcp.pl"以及Cacti图形模板文件"cacti_graph_template_snmp_get_tcp_connection_status.xml"。接下来,我们将...

    计算机网络课件:4_7_4 TCP连接的建立与释放.pptx

    服务器进入SYN_RCVD状态。 3. 客户端确认:客户端收到服务器的SYN+ACK报文后,再发送一个ACK报文,确认号ack=y+1,序列号seq=x+1,表示已收到服务器的SYN。此时,客户端进入ESTABLISHED状态,表示客户端认为连接...

    TCP状态转换图1

    4. **SYN_RCVD**: 服务器收到客户端的SYN,响应一个ACK(确认)和自己的SYN(SYN+ACK),进入SYN_RCVD状态。 5. **ESTABLISHED**: 客户端收到服务器的SYN+ACK,回送ACK确认,进入ESTABLISHED状态。服务器收到客户端...

    tcp状态解析和windowsio说明

    TCP(Transmission Control Protocol)是一...理解TCP状态转换对于排查网络连接问题,优化连接建立和关闭的流程,以及处理异常网络条件非常重要。在Windows编程中,正确处理这些状态能够确保网络程序的稳定性和可靠性。

    TCP连接建立TCP连接建立

    2. **第二次握手**:服务器收到SYN包后,会返回一个SYN+ACK包作为响应,此时服务器进入SYN_RCVD状态。这个包包含两个部分:一是对客户端SYN的确认(ACK),二是自己发起的连接请求(SYN)。 3. **第三次握手**:...

    TCP/IP协议知识点总结与面试

    例如,在`SYN_SENT`状态下,接收到来自服务器的SYN+ACK包后,客户端将进入`SYN_RCVD`状态,并发送一个ACK包。 ### 结论 通过对TCP/IP协议的深入了解,我们可以更好地理解和处理网络通信中的各种问题。在面试准备...

    TCP连接的建立与终止1

    TCP连接的建立与释放可以用一个有限状态机来表示,包括CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT、CLOSE_WAIT、CLOSING和LAST_ACK等11种状态。每个状态对应一系列合法...

    TCP状态机详细描述

    通过对TCP状态机的学习,我们不仅可以深入了解TCP连接的建立和关闭过程,还能够更好地处理网络编程中遇到的各种问题。希望本文能够帮助读者深入理解TCP状态机的工作机制,为进一步学习网络协议打下坚实的基础。

    win系列服务器禁用syn服务脚本

    TCP/IP协议是互联网上广泛使用的传输层协议,它采用三次握手来建立连接,其中第二步就是服务器收到客户端发送的SYN报文段并回复SYN+ACK,这个状态被称为SYN_RCVD。禁用SYN服务可能是出于安全考虑,比如防止SYN Flood...

    SYN flood攻击

    2. 第二次握手:服务器接收到SYN包后,回应一个SYN+ACK数据包,表示同意建立连接,并返回一个随机的序列号,此时服务器进入SYN_RCVD状态。 3. 第三次握手:客户端收到服务器的SYN+ACK包后,再发送一个ACK(确认)...

    TCP IP 原理-阿沐1

    TCP/IP协议是互联网通信的基础,它包含了两个主要的协议组件:传输控制...在开发和调试网络应用程序时,理解TCP/IP的工作原理以及三次握手和四次挥手的过程至关重要,这有助于解决可能出现的连接问题和数据丢失问题。

    c++网络编程1

    为解决这些问题,操作系统提供了TCP参数来调整行为,如tcp_syn_retries减少重试次数,tcp_max_syn_backlog增加SYN连接队列长度,以及tcp_abort_on_overflow决定超出处理能力时如何操作。 TCP连接的关闭也涉及到四次...

    TCP三次握手.docx

    服务器的状态变为 SYN_RCVD,表示服务器已经收到客户端的 SYN 报文,等待客户端的响应。 第三次握手 在第三次握手中,客户端收到服务器的 SYN-ACK 报文后,客户端会发送一个 ACK 报文给服务器,ACK 报文的序列号是...

    仿真协议浅谈TCP

    本文旨在通过对TCP协议的介绍及其在连接建立与终止过程中的深入分析,帮助读者更好地理解TCP的工作机制。 #### 二、TCP协议概述 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过一系列机制确保...

    TCP通信例子,客户端+服务器端

    服务器进入SYN_RCVD状态。 - 第三次握手:客户端收到SYN+ACK报文后,再发送一个ACK报文,确认号为服务器的序列编号加1。客户端进入ESTABLISHED状态。当服务器收到这个ACK报文后,也进入ESTABLISHED状态,此时TCP...

    TCP通信的三次握手和四次挥手详解.docx

    TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它通过三次握手来建立连接,而通过四次挥手来断开...在实际网络环境中,通过这样的方式分析网络通信过程,有助于理解和排查可能出现的问题。

Global site tag (gtag.js) - Google Analytics