Windows Communication Foundation (WCF)为高性能通信提供基于 TCP 的新网络协议(net.tcp://)。 WCF 还引入了新的系统组件 Net.TCP 端口共享服务,使 net.tcp 端口能够在多个用户进程中共享。
背景和动机
首次引入 TCP/IP 协议时,只使用少量应用程序协议。 TCP/IP 使用端口号来区分应用程序,方法是为每个应用程序协议分配唯一的 16 位端口号。 例如,如今的 HTTP 流量标准化为使用 TCP 端口 80,SMTP 使用 TCP 端口 25,FTP 使用 TCP 端口 20 和 21。 使用 TCP 作为传输的其他应用程序可以通过约定或通过正式标准化来选择另一个可用的端口号。
使用端口号区分应用程序存在安全问题。 防火墙通常配置为阻止除几个已知入口点以外的所有端口上的 TCP 流量,因此部署使用非标准端口的应用程序通常很复杂,甚至不可能,因为存在企业和个人防火墙。 可以通过已允许的标准已知端口进行通信的应用程序会减少外部攻击面。 许多网络应用程序都使用 HTTP 协议,因为大多数防火墙默认配置为允许 TCP 端口 80 上的流量。
在 HTTP.SYS 模型中,许多不同的 HTTP 应用程序的通信中将多路复用到单个 TCP 端口。此模型已经成为 Windows 平台上的标准。 这为防火墙管理员提供了一个共同的控制点,同时允许应用程序开发人员最大程度地降低生成可以使用网络的新应用程序的部署成本。
跨多个 HTTP 应用程序共享端口的功能长期以来一直是 Internet 信息服务(IIS)的一项功能。 但是,只有通过 IIS 6.0 引入了 HTTP.SYS(内核模式 HTTP 协议侦听器),此基础结构才完全通用化。 实际上,HTTP.SYS允许任意用户进程共享专用于 HTTP 流量的 TCP 端口。 此功能允许许多 HTTP 应用程序在同一物理计算机上共存,同时共享通过 TCP 端口 80 发送和接收流量所需的网络基础结构。 Net.TCP 端口共享服务为 net.tcp 应用程序启用相同类型的端口共享。
端口共享体系结构
WCF 中的端口共享体系结构有三个主要组件:
工作进程:使用共享端口通过 net.tcp:// 通信的任何进程。
WCF TCP 传输:实现 net.tcp:// 协议。
Net.TCP 端口共享服务:允许许多工作进程共享同一 TCP 端口。
Net.TCP Port Sharing Service 是用户模式的 Windows 服务,可代表通过其连接的辅助进程接受 net.tcp:// 连接。 套接字连接到达时,端口共享服务会检查传入消息流以获取其目标地址。 根据此地址,端口共享服务可以将数据流路由到最终处理它的应用程序。
当使用 net.tcp:// 端口共享的 WCF 服务打开时,WCF TCP 传输基础结构不会直接在应用程序进程中打开 TCP 套接字。 相反,传输基础结构会将服务的基址统一资源标识符(URI)注册到 Net.TCP 端口共享服务,并等待端口共享服务代表其侦听消息。 端口共享服务将对到达的发送给该应用程序服务的消息进行调度。
安装端口共享
Net.TCP 端口共享服务在所有支持 WinFX 的作系统上都可用,但默认情况下未启用该服务。 作为安全预防措施,管理员必须先手动启用 Net.TCP 端口共享服务,然后才能首次使用。 Net.TCP 端口共享服务公开了允许您调整端口共享服务所拥有的网络套接字特性的一些配置选项。 有关详细信息,请参阅 如何:启用 Net.TCP 端口共享服务。
在应用程序中使用 Net.tcp 端口共享
在 WCF 应用程序中使用 net.tcp:// 端口共享的最简单方法是使用此属性 NetTcpBinding 公开服务,然后使用该属性启用 Net.TCP 端口共享服务 PortSharingEnabled 。
有关如何执行此作的详细信息,请参阅 如何:配置 WCF 服务以使用端口共享。
端口共享的安全影响
尽管 Net.TCP 端口共享服务在应用程序和网络之间提供了一层处理,但使用端口共享的应用程序仍应受到保护,就像直接在网络上侦听一样。 具体而言,使用端口共享的应用程序应评估其运行所依据的进程特权。 请考虑使用内置的网络服务帐户运行应用程序,该帐户使用网络通信所需的最小进程权限集运行。