避免 TCP/IP 端口耗尽

来源:互联网 发布:学编程和编码那个好 编辑:程序博客网 时间:2024/06/05 12:49

客户端启动到服务器的 TCP/IP 套接字连接时,客户端通常连接到服务器上的特定端口,并请求服务器通过临时(或暂时)TCP UDP 端口进行响应。在 Windows Server 2003 Windows XP 中,客户端应用程序所使用的临时端口的默认范围为 1025 5000。在某些情况下,有可能耗尽默认范围的可用端口。


TCP/IP 端口耗尽的症状随客户端应用程序的不同而不同,但通常都表现为显示网络连接失败错误。若要确定网络连接失败是否是由 TCP/IP 端口耗尽造成的,请在客户端计算机上执行以下步骤:

  1. 在运行 Windows XP Windows Server 2003 的计算机上单击开始,再单击运行,然后键入 cmd,单击确定打开命令提示。
  2. 执行以下操作之一:

·             Windows XP Windows Server 2003 计算机上的命令提示中输入以下命令,显示此计算机上 TCP/IP 协议所使用的活动连接:

·                         netstat-n

这将列出绑定到客户端计算机的 TCP/IP 地址以及 TCP/IP 地址与远程服务器通信所使用的端口。如果列出的端口使用了所有可用的端口,则出现了 TCP/IP 端口耗尽现象。

·            在基于 Windows Server 2003 的客户端计算机的命令提示中输入以下命令,以显示 TCP/IP 协议所使用的活动连接:

·                         netstat-b

这将列出绑定到客户端计算机的 TCP/IP 地址、TCP/IP 地址与远程服务器通信所使用的端口以及使用这些端口的应用程序。此信息可以帮助您确定那个客户端应用程序正在使用过多的 TCP/IP 端口。

TCP/IP 端口耗尽有关的问题

当客户端应用程序尝试使用 TCP/IP 套接字连接到 BizTalk Server,或当 BizTalk 应用程序尝试使用 TCP/IP 套接字连接到服务器时,可能会出现类似于下面的情况:

System.Net.WebException: The underlying connection wasclosed: An unexpected error occurred on a send.

- 或者 -

Unable to connect to the remote server

System.Net.Sockets.SocketException:Only one usage of each socket address (protocol/network address/port) isnormally permitted.

当出现这些错误时,还可能出现以下问题:

·            客户端应用程序可能无法连接到 BizTalk Server

·            BizTalk 应用程序服务可能无法连接到远程 SQL 服务器。

·            BizTalk Server 适配器可能无法连接到远程服务器。

·            客户端应用程序预留的每个端口均占用内核内存。如果预留了数目超常的客户端端口,Windows 内核内存的占用率将相应增加。

原因

如果客户端计算机中存在数目超常的 TCIP/IP 套接字连接,则客户端计算机上可能出现 TCP/IP 端口耗尽的情况。如果多个客户端应用程序都在建立连接,则可能出现这种情况。

如果所有可用的临时端口都分配给了客户端应用程序,则客户端将出现 TCP/IP 端口耗尽的情况。当 TCP/IP 端口耗尽时,将无法预留客户端端口,并且尝试通过 TCP/IP 套接字连接到服务器的客户端应用程序也将出错。

在高负载情况下,比处于正常负载时更容易出现 TCP/IP 端口耗尽的情况。

解决方法

执行以下步骤以避免 TCP/IP 端口耗尽及其相关问题:

  1. 验证客户端应用程序没有生成过多的 TCP/IP 套接字连接。这一点可以用上面提到的方法来检查,即在 Windows Server 2003 Windows XP 上运行 netstat -n,或者在 Windows Server 2003 2008 上运行 netstat -b

    如果某个客户端应用程序使用了数量超常的 TCP/IP 套接字连接,则应考虑重新设计客户端应用程序,以便更有效地使用 TCP/IP 套接字连接。
  2. 如果大量客户端应用程序要启动已知数量的 TCP/IP 套接字连接,但没有足够数量的可用临时端口来满足连接请求,则需要进行以下注册表修改。
  3. 增加动态分配到客户端 TCP/IP 套接字连接的临时端口的上限。
    1. 启动注册表编辑器。
    2. 在注册表中,浏览到并单击以下注册表项。

      HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
    3. 编辑菜单中单击新建“DWORD ,然后添加以下注册表值,以增加可以动态分配到客户端的临时端口的数量:

值名称

MaxUserPort

值数据

<在此输入一个 5000 65534 之间的十进制值>

  1.  
    1. 关闭注册表编辑器。

Aa560610.note(zh-CN,BTS.10).gif注意

必须重新启动计算机,此更改才会生效。

Aa560610.note(zh-CN,BTS.10).gif注意

增加用于客户端 TCP/IP 连接的临时端口的范围将占用 Windows 内核内存。请勿将此设置的值增加至超过容纳客户端应用程序套接字连接所需要的值,以便尽可能降低对 Windows 内核内存的不必要占用。

  1. 降低客户端 TCP/IP 套接字连接的超时值(默认值为 240 秒)
    1. 启动注册表编辑器。
    2. 在注册表中,浏览到并单击以下注册表项。

      HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
    3. 编辑菜单中单击新建“DWORD ,然后添加以下注册表值,以缩短关闭连接时,该连接处于 TIME_WAIT 状态的时间。当连接处于 TIME_WAIT 状态时,套接字对无法重新使用:

值名称

TcpTimedWaitDelay

值数据

<在此输入一个 30 240 之间的十进制值。>

  1.  
    1. 关闭注册表编辑器。

Aa560610.note(zh-CN,BTS.10).gif注意

必须重新启动计算机,此更改才会生效。

Aa560610.note(zh-CN,BTS.10).gif注意

此值的有效范围为 30 300(十进制)之间。默认值为 240