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


    1. 什么是命名管道?

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

    要解释这个问题,我还是摘录微软官方的资料比较好

    http://msdn.microsoft.com/zh-cn/library/ms187892.aspx

    若要连接到 SQL Server 数据库引擎,必须启用网络协议。Microsoft SQL Server 可同时通过多种协议处理请求。客户端用单个协议连接到 SQL Server。如果客户端程序不知道 SQL Server 正在侦听哪个协议,可以配置客户端按顺序尝试多个协议。使用 SQL Server 配置管理器启用、禁用以及配置网络协议。

    Shared Memory 是可供使用的最简单协议,没有可配置的设置。由于使用 Shared Memory 协议的客户端仅可以连接到同一台计算机上运行的 SQL Server 实例,因此它对于大多数数据库活动而言是没用的。如果怀疑其他协议配置有误,请使用 Shared Memory 协议进行故障排除。

    ms187892.note(zh-cn,SQL.100).gif注意:
    使用 MDAC 2.8 或更早版本的客户端不能使用 Shared Memory 协议。如果这些客户端尝试使用,将自动切换为 Named Pipes 协议。

    TCP/IP 是 Internet 上广泛使用的通用协议。它与互连网络中硬件结构和操作系统各异的计算机进行通信。TCP/IP 包括路由网络流量的标准,并能够提供高级安全功能。它是目前在商业中最常用的协议。将计算机配置为使用 TCP/IP 可能会很复杂,但大多数联网的计算机已经配置正确。若要配置未在 SQL Server 配置管理器中出现的 TCP/IP 设置,请参阅 Microsoft Windows 文档。

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

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

    在快速局域网 (LAN) 环境中,传输控制协议或 Internet 协议 (TCP/IP) 套接字客户端和 Named Pipes 客户端在性能方面不相上下。但是,网络速度越慢[如在广域网 (WAN) 或拨号网络上],TCP/IP 套接字客户端与 Named Pipes 客户端的性能差异越明显。这是因为进程间通信 (IPC) 的机制在对等项间的通信方式不同。

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

    阐明所讨论的是本地管道还是网络管道也很重要。如果服务器应用程序在运行 SQL Server 实例的计算机的本地运行,则可以选择本地 Named Pipes 协议。本地 Named Pipes 以内核模式运行且速度非常快。

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

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

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

    该协议必须在客户端和服务器上都启用才能正常工作。服务器可以同时监听所有已启用的协议的请求。客户端计算机可以选取一个协议,或按照 SQL Server 配置管理器中列出的顺序尝试这些协议。

    ms187892.note(zh-cn,SQL.100).gif注意:
    Microsoft SQL Server 不支持 Banyan VINES 顺序包协议 (SPP)、多协议、AppleTalk 或 NWLink IPX/SPX 网络协议。以前使用这些协议连接的客户端必须选择其他协议才能连接到 SQL Server。

    实际上,命名管道在SQL Server配置管理器中看起来是下面这样。其实,在安装好SQL Server之后就自动会有一个管道名称。你当然也可以修改该名称的。

    image

    2. 为什么用命名管道?

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

    • 提高速度
      • 假设同样在局域网中,那么使用命名管道协议会比TCP/IP协议快一些。
    • 增加安全性
      • 因为命名管道是只能用于局域网的,那么如果服务器关闭了TCP/IP协议而仅启用命名管道,就可以避免一些安全隐患

    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

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

    其他参考资源:SQL Server 2008 Native Client编程

    http://msdn.microsoft.com/zh-cn/library/ms130892.aspx

  • 相关阅读:
    Java基础知识总结(绝对经典)
    mybatis注解详解
    div行内样式style常用属性
    php中json_decode()和json_encode()的使用方法
    java调用javascript :js引擎rhino
    DeleteDC() 与 ReleaseDC() 的区别 [转]
    non-manifold Mesh(非流形网格)
    C++静态成员函数小结 [转]
    C++ 类的静态成员详细讲解[转]
    CString 转 char*; wstring 转 string
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1441913.html
Copyright © 2020-2023  润新知