超出TCP连接端口数限制(MaxUserPort)引起的服务器问题

昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80端口。在这2台服务器上,浏览器打不开任何网站,但能ping通。重启其中1台服务器后,被重启的服务器恢复正常。

服务器用的是阿里云的,开始以为是阿里云的问题,向阿里云提交了工单。在提交了 netstat -nat 的信息后,阿里云工程师很快定位出问题原因,是TCP MaxUserPort不够用引起的,当时TCP连接的端口数是6000多,而Windows的默认最大TCP连接端口数(MaxUserPort)是5000。

知道这个原因后,上那台还在故障中的服务器,用netstat -n | find /C /I "established"一看,果然超过了5000(如果用PowerShell,可以用命令Get-Counter -Counter \TCPv4\*查看)。

从这个原因出发,所有的故障现象都有了合理的解释:

  • 连不上自己的本机80端口:连接本机80端口,也需要客户端TCP端口,没端口可用当然连不上;
  • 其它服务器可以连接到这2台服务器的80端口:其它服务器只是连接这2台服务器已有的80端口,不需要额外的端口;
  • 浏览器打不开任何网站:浏览器访问网站,建立TCP连接需要分配客户端TCP端口;
  • 能ping通:ping走的是ICMP协议,不够用的是TCP协议的端口,所以不受影响;
  • 重启后恢复正常:占用的TCP端口被重置,重新分配,还未达到5000的限制。

知道了真正原因,解决起来就很简单,修改最大TCP连接端口数(MaxUserPort)限制,修改方法:在注册表HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters中添加名为MaxUserPort,类型为DWORD(32-bit),值为65543(10进制)的项目并重启计算机。

posted on   大西瓜3721  阅读(1124)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2018-12-23 即时反应的input和propertychange方法

导航

点击右上角即可分享
微信分享提示