Windows 10/11ではSMBによるネットワークファイル共有で転送時の圧縮(SMB圧縮転送)に対応している。これはネットワークでの転送時にファイルを圧縮し、転送に要する時間を短縮させるものだ。ただし、圧縮が有効でないファイルも存在すること、圧縮・伸張をCPUで実行していることから転送中のCPU負荷に多少の影響が出る。
しかし、圧縮がある程度有効なファイルなら、理屈的には時間を短縮することが可能だ。また、xcopyやrobocopyなどのコマンドもSMB圧縮転送に対応しており、ファイルサーバー側がSMB圧縮を有効にしていればオプションでSMB圧縮転送を利用できる。
Windows 10 Ver.1903で搭載されていた機能だが
デフォルトではオフに
SMB圧縮転送機能は、2019年5月リリースのWindows 10 Ver.1903(19H1、Windows 10 May 2019 Update)で、SMB v3の機能として搭載されたが、同年11月セキュリティ問題が告知され、無効化が推奨された。詳細な理由はわからないが、少なくとも「CVE-2020-0796」というセキュリティ問題では、当面の対策としてレジストリによるSMB圧縮転送の無効化が推奨されているため、SMB圧縮に何らかの関係がある問題だと思われる。
●CVE-2020-0796 Microsoft - Windows SMBv3 Client/Server Remote Code Execution Vulnerability
https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-0796
その後、2020年3月のKB4551762では、SMB v3のセキュリティ更新プログラムが提供されている。ただし、現在のWindows 10/11では、サーバー側、クライアント側ともにSMB転送圧縮が無効になった状態である。
そもそもSMB転送圧縮とは
SMB転送圧縮とは、SMBによるネットワークファイル共有で、ファイルを転送するときに圧縮してデータ量を削減する。そのためには、サーバー側、クライアント側両方がSMB圧縮転送が実装されて、許可されている必要がある。
サーバー側は現状、Windows 11のみの対応だが、クライアント側のSMB圧縮転送機能はWindows 10でも動作する。実際には、それぞれいろいろと条件があるのだが、基本的にサーバー側はWindows 11(もしくはWindows Server 2022)、クライアント側はWindows 10/11の組み合わせでSMB転送が利用可能だ。
圧縮には、MicrosoftのXPRESSと呼ばれるアルゴリズムが使われるが、LZ77(Lempel-Ziv)やLZ77にハフマン符号を組み合わせたもの(LZ77+Huffman)、NTFSのファイル圧縮(LZNT1)などがあり、データに合わせて自動的に切り替えて利用するようだ。
LZ77は、データ中の繰り返しを見つけて圧縮するアルゴリズムであるため、基本的には繰り返しの多いデータほど圧縮率が高くなる。具体的には、ファイルの中身がほとんどゼロであるようなファイルは圧縮率が高く、中身がほとんど乱数(あるいはそれに近いもの)である場合にはほぼ圧縮できない。
サーバー側でSMB圧縮転送を有効化する
Windows 11なら、PowerShellのSet-SmbShareコマンドを使うことで、SMB圧縮転送を有効化できる。現状、GUIから設定することはできないようだ。具体的には、
Set-SmbShare -Name 〈共有名〉 -CompressData $true
とする。共有名は、Get-SmbShareコマンドで一覧を得ることができる。また、SMB圧縮転送の設定状態は、
Get-SmbShare -Name 〈共有名〉 | select CompressData
で調べることができる。
どの場合でも、CompressDataがTrueになっていれば、その共有名へのアクセス時にクライアント側がSMB圧縮転送を有効にしていれば、圧縮転送となる。
クライアント側でSMB圧縮転送を有効化する
クライアント側でSMB圧縮転送を有効化するには、レジストリ設定を行うか、xcopyやrobocopyで「/COMPRESS」オプションを使う。
レジストリ設定をすることで、常にSMB圧縮が有効になるが、サーバー側と違い、共有先によって切り替えることはできない。もっとも、接続時のネゴシェーションでSMB圧縮転送を使うかどうかが決まり、サーバー側で共有名ごとに有効/無効を切り替えることができるため、問題が起きることはなさそうだ。
とはいえ、セキュリティ問題で無効化された機能である。有効にするかどうかは、ご自身のリスクとして判断されたい。何か問題が起きたとしても筆者および編集部では責任を取ることはしない。
レジストリ設定だが、以下のキーに「EnableCompressedTraffic」というDWORD値を作り、データとして1を書き込む。
キー
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters
reg.exeコマンドを使うなら、
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters /v EnableCompressedTraffic /t REG_DWORD /d 1
とする。これですぐにSMB圧縮転送が有効になる。
また、SMB圧縮転送を無効化したい場合には、「EnableCompressedTraffic」を削除するか、データとして0を書き込む。
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters /v EnableCompressedTraffic
実際にSMB圧縮転送を試してみるも効果は微妙
サーバー側でSMB圧縮転送を有効にしたまま、クライアント側で有効/無効を切り替え、1GBのファイルを転送してみた。簡易なテストで、結果からいうと微妙なところ。中身がゼロだけのファイルでは、コピーの処理時間に違いが見られたが、乱数ファイル(ほとんど繰り返しがない)では、ほとんど効果がなかった。
測定は、PowerShellのMeasure-Commandを使い、Copy-Itemコマンドでサーバー側の1GBのファイルをローカルフォルダーにコピーする時間を測定した。ネットワークはギガビットイーサを使っている。サーバー側は、CPUにCeleron J4125、メモリ8GB、クライアント側はCore i5-8250U、メモリは8GBである。
コピーするファイルは、fsutil.exeコマンドで作成した中身がゼロだけのファイルと、以下のリストで作成した乱数からなるファイル。fsutilで作ったファイルは0だけなので、最も圧縮が有効になる場合と考えられる。
$r=new-object byte[] (1GB);
(new-object System.Random).NextBytes($r);
[System.IO.File]::WriteAllBytes("c:\temp\test-r-1G2", $r)
多少は、圧縮が効いているみたいなので、GB単位の大きなファイルをLAN内で転送することが多いならSMB圧縮転送を有効にしておく意味はありそうだ。とはいえ、セキュリティ上のリスクを考えると、屋外に持ち出せるラップトップやタブレットクラスのマシンでわざわざ設定するほどでもないという感じである。
この連載の記事
-
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 - この連載の一覧へ