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

參考資料

相關文章
相關標籤/搜索