TCP链接时动态端口的相关问题说明

最近在线上遇到一个TCP动态端口相关的问题,以前没有留意过此类问题,作个笔记记录在这里,但愿也能给你们提供个参考。windows

简单介绍下问题的场景:Windows服务器上,部署了网关程序SG和RPC进程,其中RPC进程监听本地8003端口。问题发生在一次线上常规发布的时候,RPC程序会重启一次加载新部署的程序文件。然而却启动失败了,直接缘由是”一般每一个套接字地址(协议/网络地址/端口)只容许使用一次。“。因而检查本地端口占用状况,发现8003端口确实被占用了,并且是被网关程序占用,以下图所示。服务器

image-20201210230844546

背景资料

  1. TCP/IP协议传输层创建链接时请求方和目标方都须要分配一个端口号。目标方的端口号天然是提早分配并建立链接时肯定具体端口的,可是请求方的端口就采用本地动态端口的策略随机分配1个使用。网络

  2. 动态端口的分配也不是纯随机的,而是根据OS设置,在一个范围内随机。能够经过命令查看:tcp

netsh int ipv4 show dynamicport tcp

image-20201210231702381

其中启动端口就是起始端口,端口数就是动态端口可分配的个数。code

也能够经过命令设置起始端口和数量:server

netsh int ipv4 set dynamicport tcp start=32765 num=30000
  1. Windows上动态端口的设置不是一成不变的,简单来讲: 在Windows vista和windows server 2008之前的系统中动态的客户端端口范围是1025到5000;在Windows vista和windows server 2008中,为了遵照IANA的推荐,把范围扩展成49152到65535。

缘由分析

根据以上内容,查看了服务器的动态端口配置,发现确实有问题:blog

image-20201210232855770

也就是说,做为Socket链接请求方的网关进程,确实可能会从OS获取到8003端口准备发起链接,因此RPC进程重启时再次绑定8003天然就失败了。tcp-ip

解决方案

修改本地动态端口范围,避开经常使用的服务端口范围。进程

扩展延申

查阅资料时,看到有文章提到端口回收到重用会有时间间隔,根据 RFC793 规范,此值应是网络上最大段生存期的两倍(2msl),处于这个阶段的链接状态未TIME_WAIT。能够经过注册表配置此值,路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters,键TcpTimedWaitDelay。ip

参考资料

相关文章
相关标签/搜索