我们有一个运行 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 按预期响应,因为防火墙处于非活动状态或未配置为阻止此端口。