`

通讯系统经验谈【一】TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT

 
阅读更多

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

 

 

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,表示关闭。

 

下一篇:http://maoyidao.iteye.com/blog/1744309 “通讯系统经验谈【二】解读内核参数 - socket/文件句柄资源限制参数”会向大家介绍本厂网络相关设置中的其他选项,特别是系统资源限制相关的内核配置。

 

  • 大小: 22.7 KB
  • 大小: 108.9 KB
  • 大小: 217 KB
分享到:
评论
1 楼 z890202 2014-02-13  
写的很好 学习一下

相关推荐

    CLOSE_WAIT错误详解

    在TCP/IP协议栈中,CLOSE_WAIT是一个非常关键的连接状态,它涉及到客户端和服务器之间的通信。这个状态在处理网络连接时可能出现的问题时尤其重要。本文将深入探讨CLOSE_WAIT错误的含义、原因以及如何解决。 首先,...

    关于网站的SYN_RECV攻击的防范措施.txt

    SYN_RECV状态表示TCP连接建立过程中的一个阶段,当客户端向服务器发起连接请求时,会发送一个SYN数据包,服务器接收到该数据包后,会进入SYN_RECV状态,并响应一个SYN+ACK数据包。正常情况下,客户端会回应一个ACK...

    tcp通讯协议握手分析.zip_Linux tcp通讯详细介绍_tcp 握手 源码_tcp 通讯_握手_通讯握手协议

    TCP(Transmission Control Protocol)传输控制协议是互联网上最常用的一种通信协议,它的主要目标是提供可靠的、面向连接的数据传输服务。TCP通过建立连接、数据传输、连接释放等步骤确保了数据的准确无误地到达...

    socket_recv函数使用心得.

    * SO_DEBUG:只能对 TCP 套接字使用,设置该选项后系统将保存TCP 发送和接收的所有数据相关信息。 * SO_REUSEADDR:绑定套接字用到。套接字正常关闭或异常退出后的一段时间内,端口依然维持原来的绑定状态,设置此...

    _storage_emulated_0_android_data_com.tencent.mobileqq_Tencent_QQfile_recv_实训四.zip

    标题中的"_storage_emulated_0_android_data_com.tencent.mobileqq_Tencent_QQfile_recv_实训四.zip" 是一个Android设备上的文件路径,它包含了用户在腾讯QQ应用中接收的文件。这个路径提供了关于文件存储位置和来源...

    TIME_WAIT.rar_C-means_linux 网络状态_linux c wait_tcp_unix 网络编程

    在Linux系统中,进行网络编程时,TCP连接的TIME_WAIT状态是至关重要的一个环节。TIME_WAIT状态是TCP连接生命周期中的最后一个阶段,对于理解和优化网络应用性能有着直接的影响。本资源"TIME_WAIT.rar"包含了关于这个...

    tcp_send_and_recv_files.zip_QT_QT TCP_QT-TCP_Qt 远程_spin5wd

    7. **事件驱动编程**:Qt采用信号和槽机制进行事件处理,当TCP连接状态改变、数据到达或发送完成时,可以触发相应的信号,通过连接这些信号到对应的槽函数,实现异步通信。 8. **错误处理**:在实际的网络编程中,...

    sama5d3x-ek: rs485_recv_send.c

    针对爱特梅尔的SAMA5D3X-EK评估版,RS485串口操作例子。

    poco_recv_mail_test.zip

    Poco是一个开源的C++库,它包含了丰富的网络编程组件,包括邮件处理模块。`poco_recv_mail_test.zip`这个压缩包文件包含了几个使用Poco库接收邮件的示例代码,这些示例可能是从不同来源收集和汇总的。在本文中,我们...

    obex_recv_file.zip

    通过分析"obex_recv_file"源码,我们可以了解到Linux下蓝牙文件接收的具体实现细节。这不仅有助于理解OBEX协议的工作原理,也为开发者提供了一个实际的示例,帮助他们在自己的项目中实现类似功能。 在实际应用中,...

    com_recv_send.zip_com_recv

    在IT行业中,串口通信是一种常见且基础的设备间数据传输方式。"com_recv_send.zip_com_recv"这个项目显然关注的是在本地计算机上利用串行端口(COM口)进行数据的发送与接收,而非使用网络编程中的SOCKET接口。下面...

    TCP_Connection_Status.zip

    在实际应用中,结合这两个文件,IT管理员可以定期检查服务器的TCP连接情况,例如检测是否有大量半开连接(SYN_SENT或SYN_RECV)、是否存在长时间未关闭的连接(FIN_WAIT或CLOSE_WAIT),或者是否因为连接资源耗尽而...

    两台设备的TCP通讯_Codesys的两台设备之前的TCP通讯_

    4. 关闭连接:当通讯完成时,使用`TCP_CLOSE`函数关闭TCP连接,释放系统资源。 在实际应用中,你可能还需要处理错误情况,例如连接失败、数据传输错误或超时。为了确保通讯的可靠性,可以使用心跳机制定期发送小量...

    serial_recv.rar_serial recv

    《串口接收程序serial_recv详解》 在计算机通信领域,串口通信是一种常见的数据传输方式,尤其在嵌入式系统和工业控制中扮演着重要角色。本文将详细讲解一款名为"serial_recv"的串口接收工具,该工具主要用于调试...

    epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht

    epoll机制epoll_create、epoll_ctl、epoll_wait、close(在epoll的ET模式下,read和write或send和recv当返回值0且errno=EAGAIN - linking530的专栏 - CSDN博客.mht

    python网络编程调用recv函数完整接收数据的三种方法

    **原理**:基础数据接收法基于这样一个事实:当与服务端的socket连接断开时,`recv()`函数会返回空字符串(`''`)。因此,可以通过在一个循环中持续调用`recv()`函数,直到它返回空字符串为止,以此来确保所有数据都...

    Netstat命令详解如何关闭TIME_WAIT连接如何查看nginx的访问流量[归类].pdf

    5. FIN_WAIT1:主动关闭(active close)端应用程序调用 close,于是其 TCP发出 FIN 请求主动关闭连接,之后进入 FIN_WAIT1 状态。 6. CLOSE_WAIT:被动关闭(passive close)端 TCP 接到 FIN。 7. FIN_WAIT2:主动...

    TCP.zip_TCP连接_tcp vc_tcp vc_vc通信程序_以太网通信

    TCP(Transmission Control Protocol)是一种基于Internet的协议,用于在两台计算机之间建立可靠的数据传输连接。它是TCP/IP协议栈中的重要组成部分,确保了数据的顺序传输和错误检测。在这个“TCP.zip”压缩包中,...

    ir_recv.rar_IR_IR mtk_MTK IR_ir module_ir receive

    标题中的"ir_recv.rar_IR_IR mtk_MTK IR_ir module_ir receive"暗示了这是一个与红外(IR)接收相关的软件资源,特别针对MTK(MediaTek)平台。MTK是一家知名的半导体公司,其芯片广泛应用于手机、电视和其他电子...

Global site tag (gtag.js) - Google Analytics