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 是可供使用的最簡單協議,沒有可配置的設定。由於使用 Shared Memory 協議的用戶端僅可以串連到同一台電腦上啟動並執行 SQL Server 執行個體,因此它對於大多數資料庫活動而言是沒用的。如果懷疑其他協議配置有誤,請使用 Shared Memory 協議進行故障排除。
| 注意: |
| 使用 MDAC 2.8 或更早版本的用戶端不能使用 Shared Memory 協議。如果這些用戶端嘗試使用,將自動切換為 Named Pipes 協議。 |
TCP/IP
TCP/IP 是 Internet 上廣泛使用的通用協議。它與互連網路中硬體結構和作業系統各異的電腦進行通訊。TCP/IP 包括路由網路流量的標準,並能夠提供進階安全功能。它是目前在商業中最常用的協議。將電腦配置為使用 TCP/IP 可能會很複雜,但大多數連網的電腦已經配置正確。若要配置未在 SQL Server 組態管理員中出現的 TCP/IP 設定,請參閱 Microsoft Windows 文檔。
Named Pipes
Named Pipes 是為區域網路而開發的協議。記憶體的一部分被某個進程用來向另一個進程傳遞資訊,因此一個進程的輸出就是另一個進程的輸入。第二個進程可以是本地的(與第一個進程位於同一台電腦上),也可以是遠端(位於連網的電腦上)。
VIA
虛擬介面適配器 (VIA) 協議和 VIA 硬體一同使用。有關如何使用 VIA 的資訊,請與硬體供應商聯絡。
Named Pipes 與 TCP/IP 通訊端
在快速區域網路 (LAN) 環境中,傳輸控制通訊協定或 網際網路通訊協定 (IP) (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 組態管理員中列出的順序嘗試這些協議。
| 注意: |
Microsoft SQL Server 不支援 Banyan VINES 順序包協議 (SPP)、多協議、AppleTalk 或 NWLink IPX/SPX 網路通訊協定。以前使用這些協議串連的用戶端必須選擇其他協議才能串連到 SQL Server。
|
實際上,具名管道在SQL Server組態管理員中看起來是下面這樣。其實,在安裝好SQL Server之後就自動會有一個管道名稱。你當然也可以修改該名稱的。
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還支援定義別名
點擊“別名”,然後點擊“建立別名”
如果建立好了別名,則可以在連接字串中直接這樣寫
"server=Myserver;database=master;integrated security=true;"
看起來和以前我們定義ODBC資料來源很類似,不是嗎?
那麼,如果這一串聯接字串被泄露,即便是別有用心的人,也不可能猜到我們的伺服器到底是什麼名字,而且我們使用了什麼協議串連的。
反過來,我就又想到,這個別名是要在用戶端建立的。那麼是不是要我們自己跑到用戶端去建立呢?顯然不可能。那麼該怎麼辦呢?
我自然聯想到了ODBC資料來源的動態建立,其實我們那時候是修改註冊表的。我按照同樣的思路找到了下面的登錄機碼
也就是說,你可以在安裝程式的時候,動態給這個項目下面添加一些項。就可以實現了。
其他參考資源:SQL Server 2008 Native Client編程
http://msdn.microsoft.com/zh-cn/library/ms130892.aspx