Server Message Block

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

Server Message Block (SMB) は、主にWindowsで使用されているOSI参照モデル第7層アプリケーション層部分の独自通信プロトコルの総称。主にWindows NTWindows 95LANを通じてファイル共有プリンタ共有などの実現に使用される。認証つきプロセス間通信機構としても動作する。

SMBを論じるにあたって、以下の事柄を区別する必要がある。

  • SMBプロトコル
  • そのプロトコル上で動作するSMBサービス群
  • NetBIOS
  • 認証つきプロセス間通信チャネルとしてSMBを使ったDCE/RPCサービス
  • Windowsでネットワークに接続された機器を一覧表示する機能があるが、これに使われている "Network Neighborhood" プロトコルは直接 NetBIOS 上のサービスとして動作している。

下位層のプロトコルとしてNetBIOSを使用している。このためネットワークを越えるルーティングはできず、中大規模のネットワークには向かない。制定された時期は古くMS-DOSLAN Managerから既に使用されている。ただし、NetBIOS over TCP/IPを利用できればルーティングは可能である。

SMB自体は マイクロソフトの独自のプロトコルであるが、これを正式にドキュメント化して仕様を公開することで、Windows以外のオペレーティングシステム (OS) やインターネット上を介してファイル共有サービス等を利用できるように拡張したものがCIFS (Common Internet File System) である。CIFS を使用するアプリケーションとしてSambaが知られている。

歴史[編集]

もともとのSMBはIBMのBarry Feigenbaumが設計したもので、DOSのローカルファイルアクセス用「割り込み 33」(21h) をネットワーク上のファイルシステム向けに変えることを目標としていた。マイクロソフトはこれにかなりの修正を施した。1990年ごろ、マイクロソフトはSMBプロトコルをスリーコムと共同開発していた LAN Manager製品に組み込んだ。さらにその後のWindows製品でもSMBプロトコルに機能を追加していった。

SMBは当初の設計段階からNetBIOS / NetBEUI API上で動作することを想定していたが(通常、NetBIOS Frames、NetBIOS over IPX/SPX、NetBIOS over TCP/IP で実装)、Windows 2000ではTCP上で直接動作させる機能も導入された(その場合サーバがTCPポート445番で待機)。

サン・マイクロシステムズWebNFS[1]を発表したころ、マイクロソフトは1996年にSMBをCommon Internet File System (CIFS) と改称し、さらなる機能追加を行った。例えば、シンボリックリンクハードリンク、より大きなファイルの操作、NetBIOSを使わずにTCPポート445番で直接接続する方式(実験的な試みであり、さらなる改良が必要だった)などへの対応である。マイクロソフトは部分的仕様をいくつかインターネットドラフトとしてIETFに提出したが[2]、いずれも有効期限切れとなっている。

SMBプロトコルは広く使われている Windowsプラットフォームとの通信で重要であり、またそれらプラットフォームでのSMB実装は公開されているCIFSから大きく拡張されていたため、マイクロソフト以外のオペレーティングシステムをSMBの互換クライアントや互換サーバとして使うためのフリーソフトウェア実装を提供するべく、リバースエンジニアリングを目的としてSambaプロジェクトが誕生した。

Windows VistaおよびWindows Server 2008ではSMB 2.0に対応している。サーバクライアント共にSMB 2.0対応の場合のみ、SMBのコマンドをまとめて発行できるためオーバーヘッドの軽減に貢献する。

実装[編集]

クライアント-サーバ方式[編集]

SMBはPeer to Peer方式の動作をし、クライアントが何らかの要求を送ると、サーバがそれに対応して応答する。SMBプロトコルの一部は特にファイルシステムへのアクセスを扱っており、クライアントはファイルサーバとの通信にその部分を使う。しかし、SMBプロトコルにはプロセス間通信 (IPC) に特化した部分もある。SMBプロトコルはローカルなサブネットでの使用に最適化したが、インターネット経由で他のサブネットとの間でSMBを使うこともできる。Windowsのファイル共有やプリンタ共有に関わるエクスプロイトは、そのような使用法を主なターゲットとしている。

SMBサーバはファイルシステムや他のリソースに、ネットワーク上のクライアントがアクセスできるようにする。クライアントはサーバ上の共有ファイルシステムやプリンタにアクセスする。このような用法・機能としてはSMBは最も有名で最も広く使われている。しかし、SMBのファイルサーバとしての面には、NTドメインを構成するプロトコル群が重要であり、それらによって少なくともNT式のドメインベースの認証を提供している。NTドメインプロトコルはSMBのIPCである名前付きパイプのためだけにMSRPCサービスを提供し、SMBサーバの実装のほとんどはリソースへのユーザーアクセスの妥当性を検証するのにNTドメインの認証を使う。

性能問題[編集]

SMBプロトコルでは、各クライアントが自身の存在を知らせるためにサブネット全体にブロードキャストするため、ネットワークの帯域幅を占有しすぎると思われている。しかし、実はSMB自体はブロードキャストを使わない。SMBと結び付けられているブロードキャスト問題は、実際にはNetBIOSのサービス・ロケーション・プロトコルのせいである。デフォルトでは、WindowsのサーバはNetBIOSを使ってサービスの告知と発見を行う。NetBIOSは特定ホスト上で利用可能なサービスを一定間隔でブロードキャストすることで機能する。ホストが20台以下のネットワークではそのような設定でも十分だが、それ以上にホスト台数が増えるとブロードキャストのトラフィックが問題を生じるようになる。NetBIOS Name Server (NBNS) を適切に実装すると、この問題を緩和できる。例えばWindows Internet Naming Service (WINS) はマイクロソフトのネットワーク環境では適切な解決策を提供する。WINSはサービス要求の集中管理と登録のためのシステムを提供するが、ネットワークの設計と保守がより複雑化する。マイクロソフトは、Active Directory環境でのダイナミックDNSの利用を推奨している。

ネットワークを設計する際には、SMBプロトコルの性能はレイテンシに大きく影響されることを考慮しなければならない。SMBを使ってディレクトリを渡り歩いてファイルを探すような操作をしたとき、このレイテンシの影響が見た目にも明らかになる。例えばインターネット経由のVPNコネクションではレイテンシが大きくなることが多く、そのような環境ではディレクトリの中身(ファイル一覧)がなかなか表示されないということになる。

マイクロソフトによる拡張[編集]

マイクロソフトはSMB実装にいくつかの拡張を加えている。例えば、認証プロトコルである NTLMv1(もともとのSMB仕様では、IBMのLAN Managerのパスワードを使うことになっていて、そこから生まれたプロトコル)ではDESを間違った形で使っていたため、NTLMv2を追加した。さらに、NT 4.0のドメインログイン用プロトコルでは、アメリカ合衆国以外では40ビットの暗号を使っている(128ビットの暗号は輸出規制されていたため)。

SMB2[編集]

マイクロソフトは2006年、SMBの新バージョン SMB 2.0 (SMB2) をWindows Vistaで導入した[3]

SMB2では、コマンド/サブコマンドの種類が100以上あったものを19にまとめ、プロトコルのやりとりを集約した[4]パイプライン化機構があり、前の要求への応答を受け取る前に次の要求を送信できる。

複雑な動作を1つの要求にまとめることができ、クライアントとサーバ間のやり取りの回数を劇的に減らすことができ、結果として性能が向上する[5]。従来のSMBプロトコルにも同様な機能がありAndXと呼ばれていたが、マイクロソフトのクライアントは滅多にAndXを使わなかった。

SMB2ではより大きなバッファをサポートしており、大きなファイルの転送や高速なネットワークでの性能向上が見込まれる[5]

また、「永続性ファイルハンドル」と呼ばれるものを導入している。これは、ネットワーク接続が切れてもSMBサーバとのコネクションが継続できるようにするもので、無線LANなど接続が切れやすい環境で新たなセッションを構築する必要をなくす。

SMB2はシンボリックリンクもサポートしている。他にもファイル属性のキャッシング、HMAC SHA-256ハッシュアルゴリズムによるメッセージ署名強化、ユーザー数・共有ファイル数などが増加した際のスケーラビリティ強化などの拡張がなされている[6]

従来のSMBプロトコルは16ビットで各種サイズを表していた。SMB2ではそれらの多くを32ビットや64ビットに拡張しており、ファイルハンドルの場合は16バイトとしている。

Windows Vistaとそれ以降のオペレーティングシステムでは、通信相手もWindows Vistaかそれ以降であれば、SMB2を使って通信する。従来のSMBは古いWindowsやSambaとの通信に使われ続ける。Samba 4ではSMB2を実験的にサポートした[7]

SMB2はマイクロソフトにとって具体的に次のような利益をもたらした。

  1. 知的財産権の明確化。従来のSMBはIBMがもともと設計したもので、Windows以外にもXENIXOS/2VMS (Pathworks) などにも採用されている。X/Openも部分的に標準化しており、IETFにもインターネットドラフトとして提出され無効となった[8]
  2. 比較的明確に過去と決別した。従来のSMBのコードは非常に様々なSMBクライアントやサーバに対応する必要があった。このためプロトコルにはオプション部分が多数存在する(長いファイル名を扱えるか否かなど)。また、コマンドの応答として様々なレベルの情報を扱う。さらにUnicode対応は後から追加されている。SMB2は少なくともマイクロソフトによる互換性テストを大幅に削減した(当初Windows Vistaのクライアントとサーバのみの評価で済んだ)。そのため、SMB2のコードは従来のものより大幅に単純化されている(例えば、Unicodeサポートが前提なので、Unicodeでない場合を扱うコードは不要)。

SMB2.1[編集]

Windows Server 2008 R2でSMB 2.1が搭載され、Windows Server 2008のSMB 2.0と比べてさらにファイル転送の速度が向上している。特に複数のクライアントから同時にアクセスされた際は約3.5倍の向上が図られている[9]

SMB3.0[編集]

Windows 8とWindows Server 2012で搭載された。SMB ダイレクト、SMB マルチチャネル、SMB 暗号化などの機能が追加された[10]。開発段階ではSMB2.2と呼ばれていた[11]

SMB3.02[編集]

Windows 8.1とWindows Server 2012 R2で搭載された。透過フェイルオーバー使用時の自動リバランス、SMB ダイレクトの性能向上などの更新にとどまる[12]

SMBプロトコルとSMB2プロトコルの仕様[編集]

SMBプロトコルとSMB2プロトコルの仕様は、マイクロソフトのMSDN Open Protocol Siteから無料でダウンロードできる[13]

SMBプロトコルに関する仕様はいくつかある。

  • MS-CIFS [1] - MS-CIFSは2007年に公開された仕様で、これまでSMBクライアントの実装に使われてきた draft-leach-cifs-v1-spec-02.txt の改訂版だが、これにも誤りがあることが知られている。
  • MS-SMB [2] - MS-CIFSへのマイクロソフトによる拡張仕様
  • MS-SMB2 [3] - SMB2プロトコルの仕様
  • MS-FSSO [4] - Windows File Access Services Systemの機能、ファイルサービスを必要とするシステムやアプリケーションとどのようにやり取りするか、設定や管理を行うシステムとどのようにやり取りするかを記述
  • MS-SMBD [5] - SMB ダイレクトの仕様

各種バージョンと実装[編集]

以下の一覧は、SMBクライアント、SMBサーバ、SMBプロトコルの各種拡張(Network Neighborhood スイートやNTドメインスイートなど)である。以下に示したのは主なもので、拡張版、再実装版、移植版などは省いている。

  • Sambaは、SMBプロトコルとマイクロソフトの拡張をフリーソフトウェアとして再実装したもの。SMBサーバ機能とコマンドラインのSMBクライアント機能がある。
  • LinuxカーネルにはVFSを使ったSMBクライアントの実装が2つあり(smbfsとcifs)、SMBサーバ上のファイルに標準のファイルシステムAPI経由でアクセスできる。fuseカーネルモジュールとユーザー空間のfusesmbを使ってSMBクライアント機能を実現することもできる。
  • NetWare version 6以降では、CIFSサーバ機能を実装している。
  • FreeBSDにはVFSを使ったSMBクライアント実装としてsmbfsがある。
  • NetBSDMac OS XにはそれぞれのVFSを使ったSMBクライアント実装としてsmbfsがある(元はFreeBSDのsmbfsを移植)。
  • Solarisには、Mac OS Xのsmbfsを基にしたCIFS client for Solarisというプロジェクトがある。
  • OpenSolarisは2007年10月、カーネル内にCIFSサーバ機能を実装した[14]
  • 小型NASサーバFreeNASは、FreeBSDベースで、CIFS/Sambaもサポートしている。EMCコーポレーションネットアップといったストレージ企業各社もSMBサーバの実装を行っている。
  • Advanced Server for Unix (AS/U) はUNIX向けにWindows NT 3.51のSMBサーバ機能を移植したもので、AT&Tがマイクロソフトからライセンス提供を受け、主なUNIXベンダーにライセンス提供した。しかし、元のコードの品質が悪く、各ベンダーは実用化に苦労した。サン・マイクロシステムズは、Advanced Server for UnixをSolarisに移植した Solaris PC NetLink(コード名 Cascade)を製品化している。
  • コンテンツマネジメントシステムAlfrescoには、SMBサーバのJavaによる実装JLANが含まれている。
  • JCIFSはJavaによるSMBクライアント実装
  • RTSMB組み込みシステム用のCIFS/SMB実装。マイクロソフトやSambaの設計とは無関係に一から設計された。
  • Visuality Systems NQ CIFSも組み込みシステム用のCIFS/SMB実装。SMB1.0/SMB2.0対応。多くのRTOSに移植されている。

脚注・出典[編集]

  1. ^ YANFS yet another nfs
  2. ^ * Common Internet File System Protocol (CIFS/1.0)
  3. ^ Navjot Virk and Prashanth Prahalad (2006年3月10日). “What's new in SMB in Windows Vista” (英語). Chk Your Dsks. MSDN. 2006年5月1日閲覧。
  4. ^ Vistaの目指すネットワークの姿(2)- NetBIOSなしでWindowsネットを実現”. ITPro. 2010年3月30日閲覧。
  5. ^ a b “[http://pc.watch.impress.co.jp/docs/2008/0404/ms.htm マイクロソフト、VistaとServer 2008で実現するメリットを解説 ~ネットワーク高速化やセキュリティポリシー適用など]”. PC Watch. 2010年3月30日閲覧。
  6. ^ SMB2, a complete redesign of the main remote file protocol for Windows
  7. ^ Andrew Tridgell (2006年9月12日). “Exploring the SMB2 protocol (PDF)”. 2009年10月27日閲覧。
  8. ^ このあたりの歴史的経緯は http://ubiqx.org/cifs/Intro.html に詳しい
  9. ^ @IT 編集部. “「ファイルサーバー、小型NASは安いのを選べ」 本当にそれでいい?”. 2011年2月10日閲覧。
  10. ^ サーバー メッセージ ブロックの概要”. 2013年8月8日閲覧。
  11. ^ SMB 2.2 is now SMB 3.0”. 2013年8月8日閲覧。
  12. ^ What's New in SMB in Windows Server 2012 R2”. 2014年7月2日閲覧。
  13. ^ Open Specifications Developer Center
  14. ^ Project CIFS Server - Introduction

関連項目[編集]

外部リンク[編集]