虚拟 Windows Server 2008 R2 系统意外响应 TCP 回显端口 7

虚拟 Windows Server 2008 R2 系统意外响应 TCP 回显端口 7

我们有一个运行 Windows Server 2008 R2 的虚拟系统,它在 TCP 端口 7 上响应(回显)。(即,响应 SYN,它发送 ACK、RST,这足以使InetAddress#isReachable()返回true。)

然而,这个系统确实不是启用“简单 TCP/IP 服务”功能。检查发现netstat -a端口 7 上没有任何内容在监听。

那么谁在响应 TCP 回显请求?

请注意物理 Windows 7系统也没有启用“简单 TCP/IP 服务”,但不是响应(如预期)。打开该功能并启动相应的 Windows 服务会使netstat -a显示

  TCP    0.0.0.0:7              WINDOWS7HOSTNAME:0      LISTENING

(再次:正如预期的那样)。

据我们目前所知,我们的 Windows Server 2008 / 2008 R2 系统(全部是虚拟的)出现意外响应,而 Windows 7 系统(全部是物理的且未启用“简单 TCP/IP 服务”)没有按预期响应。

我的问题:为什么运行 Windows Server 的虚拟系统会在未启用“简单 TCP/IP 服务”的情况下在 TCP 回显端口 7 上响应?

这可能是由虚拟化软件(我认为是 VMware ESX)引起的吗?或者这是 Windows Server 版本的功能?可能还有其他原因吗?

答案1

这是完全正常且预料之中的。当您尝试连接到具有沒有聽在该服务器上,服务器始终会以“重置”数据包(带有标志RST)进行响应。这记录在RFC 793 第 65 页传输控制协议:协议规范

片段到达

    如果状态为关闭(即 TCB 不存在)则

      传入段中的所有数据都将被丢弃。传入的
      包含 RST 的段将被丢弃。  传入的段不
      包含 RST 会导致发送 RST 作为响应。
      选择确认和序列字段值来使
      发送违规的 TCP 可以接受的重置序列
      部分。

      如果 ACK 位关闭,则使用序列号零,

        <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK>

      如果 ACK 位处于打开状态,

        <SEQ=SEG.ACK><CTL=RST>

      返回。

然而,许多防火墙(包括 Windows 自带的防火墙)都配置为降低防火墙无法识别的所有数据包——即所谓的“隐身模式”。因此Win7 防火墙丢弃你的连接请求甚至在到达 TCP 驱动程序之前,因为它没有接受 TCP 端口 7 连接的规则。

(我想补充的是,这是有史以来最烦人的事情。它不是简单地说“这里什么都没有,走开”,而是导致长时间、烦人的超时。)

在 Windows Server 上,TCP 按预期响应,因为防火墙处于非活动状态或未配置为阻止此端口。

相关内容