TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT

转载 2015年07月07日 19:53:01

转载地址:http://maoyidao.iteye.com/blog/1744277


面试时看到应聘者简历中写精通网络,TCP编程,我常问一个问题,TCP建立连接需要几次握手?95%以上的应聘者都能答对是3次。问TCP断开连接需要几次握手,70%的应聘者能答对是4次通讯。再问CLOSE_WAIT,TIME_WAIT是什么状态,怎么产生的,对服务有什么影响,如何消除?有一部分同学就回答不上来。不是我扣细节,而是在通讯为主的前端服务器上,必须有能力处理各种TCP状态。比如统计在本厂的一台前端机上高峰时间TCP连接的情况,统计命令:

 

 

Linux shell代码  收藏代码
  1. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  
 

 

结果:

 

除了ESTABLISHED,可以看到连接数比较多的几个状态是:FIN_WAIT1, TIME_WAIT, CLOSE_WAIT, SYN_RECV和LAST_ACK;下面的文章就这几个状态的产生条件、对系统的影响以及处理方式进行简单描述。

 

TCP状态

TCP状态如下图所示:

可能有点眼花缭乱?再看看这个时序图


 

下面看下大家一般比较关心的三种TCP状态

SYN_RECV 

服务端收到建立连接的SYN没有收到ACK包的时候处在SYN_RECV状态。有两个相关系统配置:

 

1,net.ipv4.tcp_synack_retries :INTEGER

默认值是5

对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。通常我们不对这个值进行修改,因为我们希望TCP连接不要因为偶尔的丢包而无法建立。

2,net.ipv4.tcp_syncookies

一般服务器都会设置net.ipv4.tcp_syncookies=1来防止SYN Flood攻击。假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟)。

 

这些处在SYNC_RECV的TCP连接称为半连接,并存储在内核的半连接队列中,在内核收到对端发送的ack包时会查找半连接队列,并将符合的requst_sock信息存储到完成三次握手的连接的队列中,然后删除此半连接。大量SYNC_RECV的TCP连接会导致半连接队列溢出,这样后续的连接建立请求会被内核直接丢弃,这就是SYN Flood攻击。

 

能够有效防范SYN Flood攻击的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明。SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

 

观测服务上SYN_RECV连接个数为:7314,对于一个高并发连接的通讯服务器,这个数字比较正常。

CLOSE_WAIT

发起TCP连接关闭的一方称为client,被动关闭的一方称为server。被动关闭的server收到FIN后,但未发出ACK的TCP状态是CLOSE_WAIT。出现这种状况一般都是由于server端代码的问题,如果你的服务器上出现大量CLOSE_WAIT,应该要考虑检查代码。

TIME_WAIT

根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态。TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒。TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。

 

为什么需要TIME_WAIT?TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。

 

和TIME_WAIT状态有关的系统参数有一般由3个,本厂设置如下:

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 30

 

net.ipv4.tcp_fin_timeout,默认60s,减小fin_timeout,减少TIME_WAIT连接数量。

 

net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。


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

原文:http://daviswang.iteye.com/blog/819176 首先我们需要弄清楚SYN_RCVD状态是怎样产生的,通过TCP状态转换图(如下图)我们可以清楚的看...
  • fengxinze
  • fengxinze
  • 2011年12月21日 18:00
  • 11014

搭建LVS负载均衡环境,出现SYN_RECV状态的处理

第一次搭建LVS+KEEPALIVED环境时挺顺利的,过一段时间后重新搭建此环境时居然出问题,不管怎么配置修改参数,客户端总是连接不上realserver,通过ipvsadm -lc查看,结果如下: ...
  • xabc3000
  • xabc3000
  • 2013年02月28日 14:57
  • 8289

再谈应用环境下的TIME_WAIT和CLOSE_WAIT

昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下:http://blog.csdn.net/shootyou/article/details/6615051里头的分析过程有提到...
  • shootyou
  • shootyou
  • 2011年07月21日 10:50
  • 38697

TCP连接TIME_WAIT和CLOSE_WAIT状态

1 TCP连接中的状态 图1 TCP连接和断开的过程图1.1 名词解释 状态 含义 LISTEN 服务器在等待进入呼叫 SYN_RECV 一个连接请求已经到达,等待确认 ...
  • renwotao2009
  • renwotao2009
  • 2016年03月02日 15:57
  • 1972

TCP连接状态:CLOSE_WAIT和TIME_WAIT

1  CLOSE_WAIT状态的生成原因 CLOSE_WAIT状态的生成原因  首先我们知道,如果我们的Client程序处于CLOSE_WAIT状态的话,说明套接字是被动关闭的! 因为如果是Serve...
  • ajupiter
  • ajupiter
  • 2013年07月08日 16:06
  • 3080

TCP/IP详解--TCP连接中TIME_WAIT状态过多

TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的。仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT。服务器在处理客户端请...
  • yusiguyuan
  • yusiguyuan
  • 2014年03月18日 10:30
  • 48514

TIME_WAIT和CLOSE_WAIT状态区别

在服务器的日常维护过程中,会经常用到下面的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 它会显示例...
  • kobejayandy
  • kobejayandy
  • 2013年12月29日 17:15
  • 29290

TCP/IP详解--TCP连接中TIME_WAIT状态过多

TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的。仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT。服务器在处理客户端请...
  • yusiguyuan
  • yusiguyuan
  • 2014年03月18日 10:30
  • 48514

Mina 解决请求后直接关闭连接(去除TIME_WAIT状态)

Mina 是一个韩国人写的基本java NIO的一个高性能的传输框架,我们的搜索就是基本它作为一个搜索服务开放接口了。对于系统的TIME_WAIT过多,造成服务器的负载过高,这个问题我也不用多说了,这...
  • linyu19872008
  • linyu19872008
  • 2014年06月13日 20:56
  • 1768

nginx后端应用服务器有大量的tcp连接处于time_wait

今天发现weblogic上有大量的连接处于time_wait状态,感觉很奇怪。据说是nginx照成的,用tcpdump研究下。 在nginx的服务器上执行 tcpdump -i bond0...
  • abcd1f2
  • abcd1f2
  • 2015年07月30日 17:30
  • 1331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT
举报原因:
原因补充:

(最多只允许输入30个字)