SQL Server 的网络通信机制
问题
我试图了解 SQL Server 如何在网络上进行通信,因为我必须告诉我的网络团队在防火墙上打开哪些端口,以便边缘 Web 服务器与内部的 SQL Server 进行通信。我需要知道什么?
解决方案
为了了解需要在哪里打开什么,我们首先简单谈谈当今常用的两个主要协议:
- TCP - 传输控制协议
- UDP - 用户数据报协议
两者都是 TCP/IP 协议套件的一部分。我们将从 TCP 开始。
TCP
TCP 是客户端与 SQL Server 通信的主要协议。实际上,更正确的说法是客户端和 SQL Server 使用表格数据流 (TDS),但 TDS 实际上位于 TCP 之上,当我们谈论 Windows、防火墙和其他网络设备时,规则和控制就是围绕该协议构建的。所以我们只用 TCP 来讨论。
TCP 是一种面向连接的协议。这意味着两个系统协商连接并都同意。把它想象成一个电话。当一个人发起电话时,另一个人必须同意接听电话,并且双方都可以随时结束电话。TCP也是同样的道理。两个系统都必须同意通信,但任何一方都可以随时结束通信。此外,TCP 中还内置了一项功能,可确保所有通信都可以根据需要进行拆卸和重新组装,以便它可以通过各种网络设备并以正确的顺序重新正确组合在一起。它还具有处理和重传丢失通信的机制。
由于此功能,TCP 成为许多不同网络应用程序使用的协议。所有应用程序共享的方式是通过使用端口。当系统上出现 SQL Server 等服务时,它必须侦听端口。对于默认的SQL Server实例,默认端口为1433。客户端通过TCP协议连接到该端口,协商并同意连接,然后双方可以根据需要传输信息,直到任何一方决定结束通信。实际上,双方都会有一个用于通信的端口,但由于客户端的端口通常是半随机确定的,因此当我们谈论防火墙等时,通常我们对服务器或服务正在使用的端口感兴趣。
UDP协议
与 TCP 不同,UDP 不是面向连接的。“客户端”可以向任何它想要的人发送 UDP 通信。没有任何东西可以协商通信连接,协议本身也没有任何东西可以协调通信顺序或类似的东西。如果需要,它必须由应用程序或由应用程序使用的基于 UDP 构建的协议来处理。如果您将 TCP 视为电话,则将 UDP 视为明信片。我可以将明信片邮寄给我想要的任何人,只要写明地址并贴上邮票,邮政部门就会取走它。现在,无法保证之后会发生什么。没有重新传输丢失的通信的机制。它非常适合不需要确认的简短沟通。由于多个网络应用程序可以通过 UDP 进行通信,因此它使用端口,就像 TCP 一样。SQL 浏览器或 SQL Server 侦听器服务使用 UDP。
网络通信 - 与 SQL Server 对话
设置 SQL Server 实例时,它侦听的 TCP 端口取决于。默认实例将设置为侦听端口 1433。命名实例将设置为安装期间选择的随机端口。此外,命名实例将被配置为允许它动态更改该端口。这意味着当命名实例启动时,如果它发现某些东西已经在使用它通常使用的端口,它将选择一个新端口。如果您有一个命名实例,并且有穿过防火墙的连接,您将需要使用 SQL Server 配置管理器来设置静态端口。这将允许网络和安全人员配置他们的设备以获得最大程度的保护。虽然您可以更改 SQL Server 默认实例的网络端口,但大多数人不会这样做。
网络通信 - 查找 SQL Server
当仅指定客户端连接到 SQL Server 的名称(例如 MySQLServer)时,这是尝试连接到默认实例。在这种情况下,客户端将自动尝试与 MySQLServer 上的端口 1433 进行通信。如果您已切换默认实例的端口,则需要告诉客户端正确的端口,通常通过在连接字符串中指定以下语法:,。例如,如果您将 SQL Server 移至侦听 14330,则您将使用 MySQLServer,14330 而不仅仅是 MySQLServer。
但是,由于命名实例默认动态设置其端口,因此客户端从一开始就永远不知道它应该与哪个端口通信。这就是 SQL 浏览器或 SQL Server 侦听器服务 (SQL Server 2000) 的用途。在本例中,客户端通过 UDP 协议向端口 1434 发送通信。它询问“命名实例在哪里?” 因此,如果我运行一个名为 SQL2008R2 的命名实例,它会询问 SQL 浏览器:“嘿,我如何与 MySQLServer\SQL2008R2 对话?” 然后,SQL 浏览器会从UDP 端口 1434将通信发送回客户端,告诉客户端如何与命名实例通信。当然,您可以跳过所有这些静态设置命名实例的端口。然后您可以使用,连接机制,客户端不会尝试与 SQL Browser 服务通信。它只会尝试建立连接。例如,如果 SQL2008R2 实例正在侦听端口 20080,指定 MySQLServer,20080 将尝试连接到命名实例。
网络通信 - 命名管道
命名管道是一种较旧的网络库通信机制,通常不再使用。它不应该跨防火墙使用。但是,如果由于某种原因您需要使用它连接到 SQL Server,则该协议也位于 TCP 之上。命名管道实际上由操作系统使用,它在协议中拥有自己的机制来确定将通信路由到何处。就网络通信而言,它侦听 TCP 端口 445。无论我们谈论的是 SQL Server 的默认实例还是命名实例,都是如此。
汇总表
要将所有这些放在一起,您需要了解以下内容:
微信赞赏
支付宝赞赏