Socket中的TIME_WAIT状态
在高并发短连接的server端,当server处理完client的请求后立刻closesocket此时会出现time_wait状态然后如果client再并发2000个连接,此时部分连接就连接不上了,用linger强制关闭可以解决此问题,但是linger会导致数据丢失,linger值为0时是强制关闭,无论并发多少多能正常连接上,如果非0会发生部分连接不上的情况!(可调用setsockopt设置套接字的linger延时标志,同时将延时时间设置为0。)
TCP/IP的RFC文档。TIME_WAIT是TCP连接断开时必定会出现的状态。

TCP要保证在所有可能的情况下使得所有的数据都能够被投递。当你关闭一个socket时,主动关闭一端的socket将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态,这的确能够保证所有的数据都被传输。当一个socket关闭的时候,是通过两端互发信息的四次握手过程完成的,当一端调用close()时,就说明本端没有数据再要发送了。这好似看来在握手完成以后,socket就都应该处于关闭CLOSED状态了。但这有两个问题,首先,我们没有任何机制保证最后的一个ACK能够正常传输,第二,网络上仍然有可能有残余的数据包(wandering duplicates),我们也必须能够正常处理。

1、 应用进程(active close)首先调用close,于是导致TCP发送一个FIN分节,表示数据已分送完毕,请求关闭套接字。 
2、 另一端应用进程(passive close)接受收到FIN,并由该端的TCP确认(确认的过程是TCP发送ACK分节给对端套接字)。FIN的接受也作为文件结束符传递给上层应用进程。这里的文件结束符并非应用进程的EOF,在TCP字节流中,EOF的读或写通过收发一个特殊的FIN分节来实现。 
3、 另端(passive close)应用进程在接受到文件束符后,会调用close关闭它的套接字,这导致该端的TCP也发送了一个FIN分节。 
4、 主动关闭端(active close)接受到这个FIN后,TCP对它进行确认。(TCP发送ACK分节,值得注意的是主动关闭端在未接受到FIN之前,它的状态就是TIME_WAIT)。

综上所述:TIME_WAIT状态出现场景是主动关闭端在未接受到FIN之前,它的状态就是TIME_WAIT。

二.TCP为什么如此设计

1。防止上一次连接中的包(特别是最后一个ACK包),迷路后重新出现,影响新连接  (经过2MSL(max segment lifetime),上一次连接中所有的重复包都会消失)。
2。可靠的关闭TCP连接  在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
  fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以  主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。TIME_WAIT 并不会占用很大资源的,除非受到攻击。还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

time_wait 处理方法

设置SO_LINGER为零(亦即linger结构中的l_onoff域设为非零,但l_linger为0),便不用担心closesocket调用进入“锁定”状态(等待完成),不论是否有排队数据未发送或未被确认。这种关闭方式称为“强行关闭”,因为套接字的虚电路立即被复位,尚未发出的所有数据都会丢失。在远端的recv()调用都会失败,并返回WSAECONNRESET错误。
在connect成功建立连接之后设置该选项:
linger m_sLinger;
m_sLinger.l_onoff = 1;  // (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
m_sLinger.l_linger = 0; // (容许逗留的时间为0秒)
setsockopt(sockConnected,
         SOL_SOCKET,
         SO_LINGER,
         (const char*)&m_sLinger,
         sizeof(linger));
 
总结
也许我们避免不了CLOSE_WAIT状态冻结的再次出现,但我们会使影响降到最小,希望那个重用套接字选项能够使得下一次重新建立连接时可以把CLOSE_WAIT状态踢掉。

time_wait 处理方法相关推荐

  1. CentOS 大量的TIME_WAIT解决方法

    CentOS 大量的TIME_WAIT解决方法 最近个人博客总是出现无法打开的现象,具体表现为,打开页面需要等待n长时间,登陆系统后发现系统存在大量TIME_WAIT状态的连接,google了一下解决 ...

  2. TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:

    1.TCP建立连接,三次握手 建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据. 客户端请求服务端建立连接 第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置 ...

  3. tcp短连接TIME_WAIT问题解决方法大全(1)——高屋建瓴

    tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为"长连接"和"短连接", 长短连接的优点和缺点这里就不详细展开了,有心的同学直接去goog ...

  4. 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇

    1. 查看系统网络配置和当前TCP状态         在定位并处理应用程序出现的网络问题时,了解系统默认网络配置是非常必要的.以x86_64平台Linux kernelversion 2.6.9的机 ...

  5. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

  6. zabbix客户端掉线查看进程time_wait过多

    1.windows的服务器出现 netstat -nao | find /c "TIME_WAIT"            用来查看TIME_WAIT进程 公司的win2003主机 ...

  7. Linux服务器 大量的CLOSE_WAIT、TIME_WAIT解决办法

    Linux服务器 大量的CLOSE_WAIT.TIME_WAIT解决办法 系统上线之后,通过如下语句查看服务器时,发现有不少TIME_WAIT和CLOSE_WAIT. netstat -an | aw ...

  8. Socket高并发出现TIME_WAIT的原因以及解决办法

    最近公司项目遇到个问题,在Socket并发量较大的情况下,每次服务端发送完数据后,Sevice端采取主动Close的方断开连接.客户端用短连接的方式发送请求,会出现大量请求返回TIME_WAIT的现象 ...

  9. mysql time_wait报错_[请教] MySQL server has gone away 与 TIME_WAIT 的关系

    在阿里云配置了 MySql(RDS) 的读写分离地址后,在 PHP 中使用该地址进行更新操作时提示如下报错: 1.提示错误 MySQL server has gone away (SQL:xxx) 此 ...

最新文章

  1. python笔试知识点_python知识点及面试面试大集合
  2. java 子类必须实现_Java学习之接口的子类必须实现接口的全部方法吗?
  3. SpringBoot部署Jar文件,瘦身优化指南!
  4. 慎用mutableCopy
  5. VB如何实现Undo(撤消)功能
  6. Mysql和vs2010 的连接
  7. 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
  8. 你的不好意思,正在摧毁你
  9. sqlite developer注册码(转)
  10. 方正计算机如何用u盘安装系统,方正电脑用u盘装系统操作方法
  11. 利用JDK发布webService实例
  12. HTML代码页面无法跳转为什么,html超链接不跳转 html为什么超链接不跳转页面
  13. java之get/set方法的作用:灵活、安全
  14. 基于ISTQB定义理解软件测试
  15. 第一次CSP认证110分
  16. 携程2018 秋招编程题 - java
  17. 3月18日面试题复盘
  18. CSS文字溢出省略号,单行省略号,多行省略号
  19. 聚(N-异丙基丙烯酰胺),POLY(N-ISOPROPYL ACRYLAMIDE),PNIPAM
  20. Flex3下载 安装 注册码

热门文章

  1. 如何删除指定列中包含重复值的行
  2. android 即将推出色彩管理,OPPO Find X3系列即将发布:首发安卓10bit全链路色彩管理系统...
  3. linux centos 剪切板,Citrix Xendesktop发布Centos7之限制剪贴板
  4. mysql客户端与服务器的区别_MySQL运维---客户端与服务器模型
  5. Spring《一》快速入门
  6. 串口使用及测量实验2
  7. 大数据hive篇--UDF函数
  8. 学生网页作业——电影动漫言叶之庭(4页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  9. conn.connectiontimeout,conn.commandtimeout,command.commandtimeout?
  10. FileInfo和DirectoryInfo