tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为“长连接”和“短连接”,
长短连接的优点和缺点这里就不详细展开了,有心的同学直接去google查询,本文主要关注如何解决tcp短连接的TIME_WAIT问题。

短连接最大的优点是方便,特别是脚本语言,由于执行完毕后脚本语言的进程就结束了,基本上都是用短连接。
但短连接最大的缺点是将占用大量的系统资源,例如:本地端口、socket句柄。
导致这个问题的原因其实很简单:tcp协议层并没有长短连接的概念,因此不管长连接还是短连接,连接建立->数据传输->连接关闭的流程和处理都是一样的。

正常的TCP客户端连接在关闭后,会进入一个TIME_WAIT的状态,持续的时间一般在1~4分钟,对于连接数不高的场景,1~4分钟其实并不长,对系统也不会有什么影响,
但如果短时间内(例如1s内)进行大量的短连接,则可能出现这样一种情况:客户端所在的操作系统的socket端口和句柄被用尽,系统无法再发起新的连接!

举例来说:假设每秒建立了1000个短连接(Web场景下是很常见的,例如每个请求都去访问memcached),假设TIME_WAIT的时间是1分钟,则1分钟内需要建立6W个短连接,
由于TIME_WAIT时间是1分钟,这些短连接1分钟内都处于TIME_WAIT状态,都不会释放,而Linux默认的本地端口范围配置是:net.ipv4.ip_local_port_range = 32768    61000
不到3W,因此这种情况下新的请求由于没有本地端口就不能建立了。

可以通过如下方式来解决这个问题:
1)可以改为长连接,但代价较大,长连接太多会导致服务器性能问题,而且PHP等脚本语言,需要通过proxy之类的软件才能实现长连接;
2)修改ipv4.ip_local_port_range,增大可用端口范围,但只能缓解问题,不能根本解决问题;
3)客户端程序中设置socket的SO_LINGER选项;
4)客户端机器打开tcp_tw_recycle和tcp_timestamps选项;
5)客户端机器打开tcp_tw_reuse和tcp_timestamps选项;
6)客户端机器设置tcp_max_tw_buckets为一个很小的值;

在解决php连接Memcached的短连接问题过程中,我们主要验证了3)4)5)6)几种方法,采取的是基本功能验证和代码验证,并没有进行性能压力测试验证,
因此实际应用的时候需要注意观察业务运行情况,发现丢包、断连、无法连接等现象时,需要关注是否是因为这些选项导致的

虽然这几种方法都可以通过google查询到相关信息,但这些信息大部分都是泛泛而谈,而且绝大部分都是人云亦云,没有很大参考价值。
我们在定位和处理这些问题过程中,遇到一些疑惑和困难,也花费了一些时间去定位和解决,以下就是相关的经验总结。

tcp短连接TIME_WAIT问题解决方法大全(1)——高屋建瓴相关推荐

  1. 远程桌面连接管理问题解决方法大全

    我想,人无完人,事物也是.远程桌面连接也不例外,总是会出现各种各样的问题,我们也在解决问 题的路上渐行渐远,此时,要是给我一篇解决问题的大全,我想我会很开心吧,不过网上都是些零零 散散的问题,那我就自 ...

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

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

  3. 《“网上邻居”无法互访问题解决方法大全 》

    <"网上邻居"无法互访问题解决方法大全 > "网上邻居"无法互访的问题实在是太常见了,无论在学校,网吧还是家里多台电脑联机,都有可能遇到网上邻居无法 ...

  4. python控制苹果手机触摸屏失灵怎么办_iPhone手机触屏不灵敏怎么办 触屏失灵乱跳等问题解决方法大全必看...

    目前有很多的用户都正在使用苹果iphone iPhone触屏不灵敏怎么办 解决方法一. 解决方法二. 苹果手机触摸屏不灵敏的解决方法二是,强制重启:同时按住iPhone的电源和Home键并保持几秒钟, ...

  5. 传奇更新服务器信息失败怎么回事啊,天天传奇更新失败错误代码422576147处理方法 问题解决方法大全...

    天天传奇玩家在更新的时候出现了异常提示,错误代码422576147.那么这种时候该怎么解决呢?我们就一起来了解下吧! 天天传奇更新失败错误代码422576147处理方法 出现原因: 更新时候无法连接服 ...

  6. robo3t 连接服务器数据库_车牌识别软件连接各种数据库方法大全

    软件连接各种数据库方法大全 1:软件连接免安装数据库. 免安装数据库使用方便,不受操作系统版本影响,不用安装,解压打开运行即可,所以免安装数据库不要放在桌面上,也不要解压打开多个. 打开车牌识别软件, ...

  7. JDBC连接数据库遇到的“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。”问题解决方法

    JDBC连接数据库遇到的"驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接."问题解决方法! 时间:2018-12-20 本文章向大家介绍JDB ...

  8. mysql 遗失对主机的连接,MySQL远程连接丢失问题解决方法(Lost connection to MySQL server)...

    MySQL远程连接丢失问题解决方法(Lost connection to MySQL server) 最近服务器很不稳定,于是重装了mysql 和php 服务,但是接着却遇到了很头疼的麻烦. 远程连接 ...

  9. 微软小娜 服务器,Win10微软小娜无法连接网络怎么办?微软小娜无法连接网络问题解决方法...

    Win10微软小娜无法连接网络怎么办?小娜是Win10专为中国市场的定制,也就是微软的cortana语音,可以智能解答问题,还能轻松完成日程设定以及文件搜索等工作.但最近和小娜进行语音互动时,提示&q ...

最新文章

  1. PHP系统编程--01.多进程与多线程
  2. jQuery的Autocomplete插件的远程url取json数据的问题
  3. 刘朋:程序员如何练就领导力
  4. Java数据结构和算法(二):数组
  5. vue-cli构建的项目手动添加eslint配置
  6. php向数据库 插入图片,php-向/从MySQL数据库插入/查看图像
  7. Java之JDBC安装、使用详解(2021最新!)
  8. “元宇宙”是个啥?都有哪些大招?
  9. 使用Python进行网站页面开发——Django快速入门
  10. Unity3D学习路线与学习经验分享
  11. asp.net实现动态显示当前日期时间
  12. (转)移动端自适应方案
  13. mysql中英混合排序+Java处理多音字
  14. 微信封号被限制的几种原因及解决方法
  15. 手机IMSI码规则更新-通过IMSI判断运营商的方法
  16. Vue入门(二)v-show、v-if、v-bind
  17. win732位升级64位教程
  18. 学计算机加数模社团,数学建模社团简介
  19. CoCo2017数据集使用(简单介绍)
  20. Python实现简易五子棋(代码+注释)

热门文章

  1. 具体做事的人一定要承担责任吗?
  2. 台式计算机内存卡与普通有啥区别,电脑硬盘和内存有什么区别?
  3. java程序设计清华大学出版社_清华大学出版社-图书详情-《Java程序设计基础》...
  4. [Excel知识技能] 排序功能
  5. linux 笔记本合盖不休眠设置
  6. 如何在服务器上部署静态网页,让所有人都能访看到?
  7. 亚米社区app v1.1.6
  8. 计算机语言元素周期表,元素周期表版《生僻字》,感受一下化学世界的语言魅力~...
  9. 使用BurpSuite对IOS客户端app抓包方法
  10. 软文写作技巧:文字表达能力是关键