1. 利用命令查看如图

wKiom1iVL0GBVDa3AACndQC9b9M409.png-wh_50








可以发现确实有大量的链接处于syn-recv的状态


2.syn-recv如何产生的呢

首先,syn-recv是tcp三次握手的中间状态,是服务端口如应用服务器端口,收到syn包并发送[syn,ack]包所处的状态,这时如果再收到ACK的包,就完成了三次握手,建立起了TCP链接


3.产生大量syn-recv包状态主要有两种可能:

一:客户端或者请求端未能收到服务器的syn_ack包

二:客户端或者请求端收到服务器的syn_ack包,但是客户端没有返回服务端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_recv状态(半开连接)直到超时。


4.tcp的三次连接与四次断开

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

TCP的四次断开:
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。