zoukankan      html  css  js  c++  java
  • TCP连接时动态端口的相关问题说明

    最近在线上遇到一个TCP动态端口相关的问题,之前没有留意过此类问题,做个笔记记录在这里,希望也能给大家提供个参考。

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

    image-20201210230844546

    背景资料

    1. TCP/IP协议传输层建立连接时请求方和目标方都需要分配一个端口号。目标方的端口号自然是提前分配并创建连接时确定具体端口的,但是请求方的端口就采用本地动态端口的策略随机分配1个使用。

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

    netsh int ipv4 show dynamicport tcp
    

    image-20201210231702381

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

    也可以通过命令设置起始端口和数量:

    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。

    原因分析

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

    image-20201210232855770

    也就是说,作为Socket连接请求方的网关进程,确实可能会从OS获取到8003端口准备发起连接,所以RPC进程重启时再次绑定8003自然就失败了。

    解决方案

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

    扩展延申

    查阅资料时,看到有文章提到端口回收到重用会有时间间隔,根据 RFC793 规范,此值应是网络上最大段生存期的两倍(2msl),处于这个阶段的连接状态未TIME_WAIT。可以通过注册表配置此值,路径:HKEY_LOCAL_MACHINESYSTEMCurrentControlSet ServicesTCPIPParameters,键TcpTimedWaitDelay。

    参考资料

  • 相关阅读:
    汇编代码中db,dw,dd的区别
    利用汇编详解栈结构
    80X86指令总结
    【原创】自己动手写的一个查看函数API地址的小工具
    【初学破解】暴力破解绕过程序认证
    OD基本汇编指令
    排序算法
    数据聚类算法-K-means算法
    数据预测算法-ARIMA预测
    数据预测算法-指数平滑法-1
  • 原文地址:https://www.cnblogs.com/chen943354/p/14118255.html
Copyright © 2011-2022 走看看