SQL Server中的命名管道(named pipe)及其使用

1. 什么是命名管道?

与TCP/IP协议一样(TCP/IP协议即<传输控制协议和因特网互联协议>),命名管道是一种通讯协议
命令管道协议一般用于局域网中,因为它要求客户端必须具有访问服务器资源的权限


根据微软官方的资料所述:
若要连接到 SQL Server 数据库引擎,必须通过网络协议。
SQL Server服务器可以同时使用多种协议处理来自于客户端的“各种请求”。
每一个客户端只使用一种协议连接到 SQL Server服务器。

下图即是在使用SQL SERVER Maganement Studio连接到实例时,于登录框点击“选项”,即可配置当前客户端的网络协议。


如果客户端程序不知道 SQL Server 正在侦听哪个协议,可以配置客户端按顺序尝试多个协议。
下图即为在SQL Server配置管理器重的“SQL Native Client 10.0 配置”中设置按客户端尝试协议的顺序。


使用 SQL Server 配置管理器中的“SQL SERVER 网络配置”,可以启用、禁用以及配置SQL SERVER服务器实例的网络协议。



Shared Memory 是最简单的协议,没有任何的设置选项。
如果客户端使用Shared Memory协议的话,那么它只能连接同一台计算机上的SQL SERVER实例

Shared Memory协议避免了同一台计算机上的客户端和服务器实例之间的“进程间封送(跨越进程边界传送信息之前包装信息的方式)”,因为客户端进程直接访问了服务器存储数据的内存映射文件
Shared Memory去除了大量的管理开销,极大地提高性能,速度非常快,但只适用于连接本地服务器时(例如,web服务器与数据库安装在同一台服务器上)。

如果怀疑其他协议配置有误,请使用 Shared Memory 协议进行故障排除。

注意:
使用 MDAC 2.8 或更早版本的客户端不能使用 Shared Memory 协议。如果这些客户端尝试使用,将自动切换为 Named Pipes 协议。

TCP/IP 是 Internet 上广泛使用的通讯协议。
它的作用是:使得互连网络中,“硬件结构和操作系统各异的”计算机能够进行通信。

TCP/IP已经成为事实上的网络标准协议,从SQL Server 2000开始提供
如果你想通过
Internet连接到某个SQL Server实例上,则TCP/IP是唯一的选择。

将计算机配置为使用 TCP/IP 可能会很复杂,但大多数联网的计算机已经配置正确。
若要配置未在 SQL Server 配置管理器中出现的 TCP/IP 设置,请参阅 Microsoft Windows 文档。

Named Pipes 是为局域网而开发的协议。
内存的一部分被某个进程①用来向另一个进程②传递信息,因此进程①的输出就是进程②的输入。
进程②可以是本地的(与进程①位于同一台计算机上),也可以是远程的(网络互连的另一台计算机上)。

使用命名管道的原因一般有两个方面

  • 提高速度
    • 假设同样在快速局域网环境中,那么使用命名管道协议会比TCP/IP协议快一些(详细解释见后文)。
  • 增加安全性
    • 因为命名管道是只能用于局域网的,那么如果服务器关闭了TCP/IP协议而仅启用命名管道,就可以避免一些安全隐患
  • 更多的选择
    TCP/IP协议不可用时或者没有域名服务器(DNS)时(从而无法把域名解析成TCP/IP地址),Named Pipes可能会非常有用

VIA是虚拟接口适配器(Virtual Interface Adapter),具体的实现随提供商的不同而不同。
一般来说,它是一种网络接口,是两个系统之间性能极高的、专业的连接。
这种高性能部分是由于特殊的专用硬件知道系统之间有专用的连接,因此无需处理普通的网络寻址问题。

虚拟接口适配器 (VIA) 协议和 VIA 硬件一同使用。有关如何使用 VIA 的信息,请与硬件供应商联系。

========================================================================

在快速局域网 (LAN) 环境中,<TCP/IP协议的套接字客户端>与<Named Pipes客户端>在性能方面难分仲伯。
但是,如果网络环境中的网络速度越慢[如在广域网 (WAN) 或拨号网络上],两者的的性能差异则越明显,TCP/IP方式速度较快,而Named Pipes方式则较慢。
这是因为进程间通信 (IPC,Inner Process Communication) 的机制在对等项间的通信方式不同。

对于 Named Pipes,通常网络通信交互性更强。
一个对等方直到另一个对等方使用读取命令请求数据时才发送数据。
在开始读取数据前,网络读取一般包括一系列窥视 Named Pipes 的信息,这在慢速网络中可能开销非常大,并会导致过多的网络流量,其他的网络客户端反过来也会受到影响。

另外,本地管道和网络管道在性能上也有很大的区别。
如果客户端与SQL Server 实例在同一台计算机上运行,则可以选择本地 Named Pipes 协议。
本地 Named Pipes 以内核模式运行且速度非常快(它类似于Shared Memory方式,但原理不同)。

--------------------------------------------------------------------------

对于 TCP/IP 套接字,数据传输的效率更高,开销也更少。
数据传输还可以利用 TCP/IP 套接字性能增强机制的优点,例如窗口化、延迟确认等,这在慢速网络中可能非常有益。
对于应用程序的不同类型,这类性能差异可能非常大。

TCP/IP 套接字还支持积压队列。试图连接到 SQL Server 时,与可能导致管道忙错误的 Named Pipes 相比,该队列可以带来有限的平稳效果。

通常,TCP/IP 在慢速 LAN、WAN 或拨号网络中效果较好。
而当网络速度不成问题时,Named Pipes 则是更好的选择,因为其功能更强、更易于使用并具有更多的配置选项。

=========================================================================

3.如何使用命名管道

要使用命名管道连接到SQL Server,客户端代码中的连接字符串大致的语法是这样的

"server=.;database=northwind;uid=sa;pwd=pass@word;Network Library=dbnmpntw"

如果服务器是命名实例,则

"server=.\instanceName;database=northwind;uid=sa;pwd=pass@word;Network Library=dbnmpntw"

【注意】必须在服务器启用named pipe协议,并且启动Broswer服务

 

为了避免在连接字符串中这么麻烦,也为了避免泄露我们连接数据的一些机密信息,SQL Server Native Client还支持定义别名

image

点击“别名”,然后点击“新建别名”

image

如果创建好了别名,则可以在连接字符串中直接这样写

"server=Myserver;database=master;integrated security=true;"

看起来和以前我们定义ODBC数据源很类似,不是吗?

那么,如果这一串连接字符串被泄露,即便是别有用心的人,也不可能猜到我们的服务器到底是什么名字,而且我们使用了什么协议连接的。

反过来,我就又想到,这个别名是要在客户端创建的。那么是不是要我们自己跑到客户端去创建呢?显然不可能。那么该怎么办呢?

我自然联想到了ODBC数据源的动态创建,其实我们那时候是修改注册表的。我按照同样的思路找到了下面的注册表项

image

也就是说,你可以在安装程序的时候,动态给这个项目下面添加一些项。就可以实现了。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值