伺服器訊息區塊通訊協定

**伺服器訊息區塊**（Server Message Block，縮寫為 SMB），又稱**網路檔案分享系統**（Common Internet File System，縮寫為 CIFS, /ˈsɪfs/），一種應用層網路傳輸協定，由微軟開發，主要功能是使網路上的機器能夠共享電腦檔案、印表機、序列埠和通訊等資源。它也提供經認證的行程間通訊機能。它主要用在裝有 Microsoft Windows 的機器上，在這樣的機器上被稱為 Microsoft Windows Network。

經過 Unix 伺服器廠商重新開發後，它可以用於連接 Unix 伺服器和 Windows 客戶機，執行列印和檔案分享等任務。

與功能類似的網路檔案系統（NFS）相比，NFS 的訊息格式是固定長度，而 CIFS 的訊息格式大多數是可變長度，這增加了協定的複雜性。CIFS 訊息一般使用 NetBIOS 或 TCP 協定傳送，分別使用不同的埠 139 或 445，目前傾向於使用 445 埠。CIFS 的訊息包括一個標頭（32 位元組）和訊息體（1 個或多個，可變長）。

## 特性

SMB 可以以不同方式執行在對談層或者更低的網路層之上：

* 直接執行在 TCP 上 port 445;
* 通過使用 NetBIOS API, 它可以執行在幾種不同的 transports:
  * 基於 UDP ports 137, 138 & TCP ports 137, 139 (NetBIOS over TCP/IP);
  * 基於一些傳統協定，例如 NBF (incorrectly referred to as _NetBEUI_).

SMB 的 "行程間通訊" (IPC) 系統提供 命名管道 s 機制，它使得程式設計師可以方便的實現繼承認證 (客戶端第一次連接 SMB 服務取得認證資訊後)。

一些服務的操作基於命名管道機制，例如那些 Microsoft 內部實現的基於 SMB 的 DCE/RPC, 被稱為基於 SMB 的 MSRPC, 同時允許 MSRPC 客戶端程式 處理認證過程 (藉助 SMB 服務提供的認證服務實現), 但是只在 MSRPC 客戶端程式上下文中有效。

_SMB 簽章_: Windows NT 4.0 Service Pack 3 及後續版本提供了基於數位簽章的 SMB 連接機制。常用的官方術語叫做「SMB 簽章」。其他被同時被使用的官方術語有

Server Message Block version 2 (SMB2) 旨在通過將 SMB signals 合併為一個封包來減輕這個效能限制。

SMB 支援 機會鎖 — 一種特殊的鎖機制 — 來提升效能。

SMB 服務是 Microsoft's Distributed File System 實現的基礎.

## 歷史

SMB 最初是 IBM 的貝瑞・費根鮑姆（Barry Feigenbaum）研製的，其目的是將 DOS 作業系統中的本機檔案介面「中斷 13」改造為網路檔案系統。後來微軟對這個發展進行了重大更改，這個更改後的版本也是最常見的版本。微軟將 SMB 協定與它和 3Com 一起發展的網路管理程式結合在一起，並在 Windows for Workgroups 和後來的 Windows 版本中不斷加入新的功能。

SMB 一開始的設計是在 NetBIOS 協定上執行的（而 NetBIOS 本身則執行在 NetBEUI、IPX/SPX 或 TCP/IP 協定上），Windows 2000 引入了 SMB 直接在 TCP/IP 上執行的功能。在這裡我們必須區分 SMB 協定和執行在這個協定上的 SMB 業務，以及 NetBIOS 和使用 SMB 作為認證隧道的 DCE/RPC 業務。此外我們還要區分主要（但不僅僅）直接使用 NetBIOS 資料報的「網路鄰居」協定。

1996 年，約於昇陽推出 WebNFS 的同時，微軟提出將 SMB 改稱為 Common Internet File System。此外微軟還加入了許多新的功能，比如符號連結、硬連結、提高檔案的大小。微軟還試圖支援直接聯絡，不依靠 NetBIOS，不過這個試圖依然處於嘗試階段，並需要繼續完善。微軟向互聯網工程工作小組提出了部份定義作為網際網路草案。不過這些提案現在均已過期。

由於 SMB 協定對於與占主要地位的 Microsoft Windows 平台通訊時的重要性，而目前該平台使用的 SMB 協定與初始的版本相比有巨大的改變，因此 Samba 專案就是被創立來逆向工程來提供一個與 SMB 軟體相容的自由軟體，使得非微軟作業系統也能夠使用它。

在 Windows Vista 中微軟又推出了 Server Message Block 2.0，後又在 Windows 7 中做了改進，截至 2012 年依次發布的主版本有 2.1 和 3.0。

### SMB 2.0

2006 年，Microsoft 隨著 Windows Vista 的發布 引入了新的 SMB 版本 (SMB 2.0 or SMB2) 
...

### SMB 2.1

SMB 2.1, 隨 Windows 7 和 Server 2008 R2 引入，主要是通過引入新的機會鎖機制來提升效能。

### SMB 3.0

SMB 3.0 (前稱 SMB 2.2) 在 Windows 8 和 Windows Server 2012 中引入。它帶來幾項重大改變，例如 the SMB Direct Protocol (SMB over RDMA) 和 SMB Multichannel（每 SMB 工作階段有多重連結）,
...

## 實現

### 客戶端 - 伺服器端結構

SMB 使用對等的通訊方式，一個客戶端向一個伺服器提出請求，伺服器相應地回答。SMB 協定中的一部份專門用來處理對檔案系統的存取，使得客戶端可以存取一個檔案伺服器。SMB 也有行程間通訊的部份。SMB 協定尤其適用於局部子網路，但是也可以被用來通過全球資訊網來連結不同的子網路。Microsoft Windows 的檔案和印表機分享主要使用這個功能。

SMB 伺服器向網路上的客戶端提供檔案系統和其它資源。客戶端電腦也可能有其自己的、不共享的硬碟，但是可能也想使用伺服器上分享的檔案系統和印表機。這是 SMB 為什麼這麼出名和廣泛地被使用的原因。SMB 普及的另一個原因是它使用適合 NT 網域的協定，至少提供基於 NT 網域式的認證。NT 網域協定是一個微軟遠端程序呼叫服務，幾乎只能被 SMB 行程間通訊的具名管道使用。幾乎所有 SMB 伺服器的實現使用 NT 網域來認證使用者是否可以存取一個資源。

### 效能問題

一般認為 SMB 協定會占用很多網路頻寬，因為每個客戶端均在整個子網路內廣播其存在。但是 SMB 本身並不使用廣播。SMB 造成的廣播問題實際上是 NetBIOS 的服務定位協定造成的。一般來說 Microsoft Windows 伺服器使用 NetBIOS 來協定和定位服務。而 NetBIOS 則定時向一個特定的伺服器廣播一個服務的存在。對於一個少於 20 個伺服器的網路來說這個方式是可行的。但是隨伺服器數目的增加廣播造成的交通會導致問題。通過適當地實現 WINS 定位協定這個問題可以被緩和。WINS 使用更進階的系統來確定和中央化服務需求，但是造成自己的設計和保管網路的問題。動態 DNS 是另一個解決方法。微軟本身推薦在微軟的 Active Directory 環境下使用動態 DNS。網路延遲對 SMB 協定的速度有非常大的衝擊。在伺服器之間網路延遲大的情況下通過 SMB 來更換檔案夾非常明顯地反映了這個問題。比如在通過全球資訊網使用虛擬私人網路時網路延遲就會比較大，這時使用 SMB 就很惱人。

### 微軟的更改

微軟在實現其 SMB 時添加了許多功能，比如微軟引入了 NTLMv2，因為原來的第 1 版使用的 DES 容易被破解。此外因早年美國政府對於高等加密軟體限制出口，NT 4.0 在美國以外僅使用 40 位元位加密，以今天的標準來說容易被解密。

### 特點

SMB 的行程間通訊機制值得一提。通過這個系統，它提供具名管道。這個機制是最早的、程式設計師可以使用的少數行程間通訊之一，它繼承客戶端聯絡 SMB 伺服器時的認證來提供服務。具名管道繼承認證是一個獨特和透明的機制，因此使用 Windows API 的程式設計師和 Windows 的使用者均將它看作是自然的。

有些服務使用具名管道，比如使用通過 SMB 的微軟遠端程序呼叫的程式，也允許微軟遠端程序呼叫客戶端程式進行自己的認證，並且由此掩蓋 SMB 伺服器的認證。但是這個掩蓋只在客戶端程式的認證成功的情況下才生效。

另一個特點是 SMB 對檔案使用一種特殊的、被稱為伺機釘選的釘選機構來提高速度。

微軟的分散式檔案系統實現就基於 SMB。

## 其他實現和版本

以下列出的包括 SMB 客戶端、伺服器以及不同的擴充 SMB 的協定。

* 自由軟體 Samba 重新實現 SMB 和微軟的擴充，包括伺服器和命令列客戶端。
* Samba-TNG 是一款 Samba 的衍生版本。
* Linux 内核包括兩個 SMB 客戶端實施，它們使用虛擬檔案系統通過標準檔案系統應用程式介面提供接觸 SMB 伺服器上的檔案。
* ONStor 公司實施了其自己的 SMB，這個實施也支援 NFS 協定。
* Novell NetWare 版本 6 以上提供 CIFS 伺服器實施，使得 Microsoft Network 客戶端可以解除 NetWare 的檔案。
* FreeBSD、NetBSD 和 Mac OS X 均包含使用它們自己的虛擬檔案系統的 SMB 客戶端。
* FreeNAS 是一個小型的網路儲存裝置服務，其目的在於使得使用者可以重新使用老電腦作為檔案伺服器。它支援 CIFS/Samba 協定。
* 維爾軟體公司實施過一個 SMB。
* Network Appliance 有一個 SMB 伺服器的實施。

## 安全

多年以來，微軟實現的其直接依賴的協定與組件都存在著許多安全漏洞。其他供應商的安全漏洞主要在於缺乏對較新的身分驗證協定（例如 NTLMv2 和 Kerberos 贊成如 NTLMv1、LanMan 或純文字密碼）的支援。即時攻擊跟蹤表明 SMB 是入侵企圖的主要攻擊媒介之一，例如 2014 年索尼影業遭駭客攻擊事件，以及 2017 年的 WannaCry 勒索軟體攻擊。

## 參考資料

## 相關條目

* NetBIOS
* NetBIOS Frames 協定
* NetBIOS over TCP/IP

## 外部連結

* SMB/CIFS 技術說明（頁面存檔備份，存於網際網路檔案館）
* Common Internet File System (CIFS) File Access Protocol（頁面存檔備份，存於網際網路檔案館）— 微軟技術說明
* Samba 研製資訊（頁面存檔備份，存於網際網路檔案館）
* [1] SMB 指令描述