摘要:隨著信息技術(shù)的快速發(fā)展,網(wǎng)絡(luò)共享和文件傳輸已成為日常工作中不可或缺的一部分。服務(wù)器消息塊(Server Message Block)協(xié)議作為微軟Windows操作系統(tǒng)中廣泛使用的網(wǎng)絡(luò)文件共享協(xié)議,其穩(wěn)定性對企業(yè)運營至關(guān)重要。旨在通過對服務(wù)器消息塊協(xié)議在實際應(yīng)用中遇到的各類故障進行系統(tǒng)性分析,提供一套全面的故障排除方法和解決方案,以幫助信息技術(shù)專業(yè)人員快速定位并解決問題,保障網(wǎng)絡(luò)環(huán)境的高效運行。
關(guān)鍵詞:服務(wù)器消息塊;文件傳輸協(xié)議;網(wǎng)絡(luò)故障
一、前言
服務(wù)器消息塊(SMB)通信協(xié)議是微軟(Microsoft)和英特爾(Intel)在1987年制定的協(xié)議,主要是作為Microsoft網(wǎng)絡(luò)的通信協(xié)議[1]。SMB協(xié)議的目的是通過TCP/IP在兩個系統(tǒng)之間啟用遠(yuǎn)程文件系統(tǒng)訪問。SMB是一個遵循客戶機服務(wù)器模式的協(xié)議,SMB服務(wù)器負(fù)責(zé)通過網(wǎng)絡(luò)提供可用的共享資源給SMB客戶機,服務(wù)器和客戶機之間通過TCP/IP協(xié)議進行連接[2]。一旦服務(wù)器和客戶機之間建立了一個連接,客戶機就可以通過向服務(wù)器發(fā)送命令完成共享操作,如讀、寫、檢索等。原始版本SMB1的帶寬效率低下,并且缺乏足夠的安全性[3]。后續(xù)的SMB版本通過內(nèi)置加密、SMB多通道和SMB直通等功能解決了這些問題[4]。
SMB協(xié)議在企業(yè)網(wǎng)絡(luò)中的應(yīng)用極為廣泛,同時也面臨著各種故障和性能問題的挑戰(zhàn)。SMB協(xié)議導(dǎo)致的網(wǎng)絡(luò)故障通常表現(xiàn)為無法訪問共享文件、連接超時、認(rèn)證失敗等問題。一般出現(xiàn)這類故障時,要確保系統(tǒng)文件更新。與SMB相關(guān)的系統(tǒng)文件包括客戶端與服務(wù)器端兩部分,在客戶端%windir%\system32\Drivers下的二進制文件有RDBSS.sys、MRXSMB.sys、MRXSMB10.sys、MRXSMB20.sys、MUP.sys等。在SMB服務(wù)器端%windir%\system32\Drivers下的二進制文件有SRVNET.sys、SRV.sys、SRV2.sys、SMBdirect.sys等,其文件體系結(jié)構(gòu)如圖1所示[4]。
SMB客戶端和SMB服務(wù)器都有詳細(xì)的事件日志結(jié)構(gòu),收集事件日志以幫助查找問題的根本原因。
二、連接性問題
目前,SMB采用傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議和端口445,在客戶端與服務(wù)器通信之前需要三次握手,TCP協(xié)議管理數(shù)據(jù)傳輸。如果出現(xiàn)TCP 3-way handshake失敗,通常是由于防火墻設(shè)置不當(dāng)導(dǎo)致的流量阻塞。解決此問題需要檢查本地和基礎(chǔ)設(shè)施中的防火墻設(shè)置,確保TCP端口445的流量未被阻止。此外,還需確認(rèn)SMB服務(wù)是否在監(jiān)聽端口445,并檢查Windows防火墻是否屏蔽了445端口。
對于TCP SYN數(shù)據(jù)包到達SMB服務(wù)器,但SMB服務(wù)器不返回TCP SYN-ACK數(shù)據(jù)包的情況,使用netstat和Get-NetTcpConnection命令檢查端口監(jiān)聽狀態(tài),在TCP端口445上有一個監(jiān)聽器應(yīng)該由SYSTEM進程擁有,確?!胺?wù)器服務(wù)(Server service)”已啟動并運行。獲取場景追蹤,并查找WFP(Windows Filtering Platform)丟棄SMB流量(TCP端口445),或者如果啟用了Windows防火墻,則啟用防火墻日志記錄并查看是否記錄了丟棄,獲取WFP捕獲并查看哪個規(guī)則/程序正在丟棄流量。對于TCP SYN流量從未到達SMB服務(wù)器,必須調(diào)查網(wǎng)絡(luò)路徑上的設(shè)備,可以分析每個設(shè)備上捕獲的網(wǎng)絡(luò)跟蹤,以確定哪個設(shè)備正在阻止流量。
三、協(xié)商失敗
SMB3.0提高了SMB協(xié)議的性能、安全性、管理、備份和可用性。這些功能包括SMB直接、SMB多通道、SMB加密、遠(yuǎn)程卷影復(fù)制服務(wù)支持和客戶端訪問的透明故障轉(zhuǎn)移[5]。SMB服務(wù)器從SMB客戶端接收SMB NEGOTIATE請求。連接超時并在60秒后重置,大約200微秒后可能會出現(xiàn)ACK消息。
協(xié)商失敗可能由SMB版本不匹配或客戶端不支持SMB over NetBIOS引起。解決此問題需要檢查客戶端和服務(wù)器之間的SMB版本兼容性,并確保網(wǎng)絡(luò)配置正確。根據(jù)表1可以看到不同Windows版本最高可以協(xié)商出來的SMB協(xié)議[6]。
四、會話設(shè)置失敗
故障現(xiàn)象為SMB服務(wù)器從SMB客戶端接收SMB SESSION_SETUP請求,但無法響應(yīng)。會話設(shè)置失敗通常涉及Kerberos認(rèn)證問題,當(dāng)SMB服務(wù)器從客戶端接收SMB SESSION_SETUP請求時,如果使用Kerberos進行身份驗證,可能會因為Kerberos流量在TCP端口88上出現(xiàn)問題而導(dǎo)致會話設(shè)置失敗[7]。可以查看Kerberos流量,確保在獲取令牌時沒有錯誤。
在SMB SESSION_SETUP請求中的安全Blob可能沒有發(fā)送正確的憑據(jù),會導(dǎo)致會話設(shè)置失敗,檢查安全Blob以確認(rèn)發(fā)送了正確的憑據(jù)。此外,還需確保服務(wù)器有SPN記錄,并且在通過CNAME DNS記錄訪問時,SMB簽名正常工作。如果在UNC路徑中使用了服務(wù)器的FQDN或NetBIOS名稱,則應(yīng)使用Kerberos進行身份驗證。在協(xié)商響應(yīng)之后,將嘗試獲取服務(wù)器CIFS SPN的Kerberos票證。查看TCP端口88上的Kerberos流量,確保在獲取令牌時沒有Kerberos錯誤[4]。此外,進行以下檢查:
查看SMB SESSION_SETUP請求中的安全Blob,確保發(fā)送了正確的憑據(jù);
嘗試禁用SMB服務(wù)器名稱強化 (SmbServerName HardeningLevel = 0);
確保SMB服務(wù)器在通過CNAME DNS記錄訪問時具有SPN;
確保SMB簽名正常工作,對于較舊的非Windows操作系統(tǒng)設(shè)備尤其重要。
五、樹連接失敗
SMB樹連接失敗通常是由于網(wǎng)絡(luò)問題、權(quán)限設(shè)置錯誤或配置不當(dāng)?shù)仍蛞鸬摹=鉀Q此問題需要檢查共享是否存在于服務(wù)器上,并確認(rèn)磁盤和文件夾對共享是可訪問的,同時確保憑據(jù)具有共享和NTFS訪問權(quán)限。
檢查網(wǎng)絡(luò)連接,確保網(wǎng)絡(luò)連接正常,特別是SMB客戶端和服務(wù)器之間的連接??梢試L試ping服務(wù)器IP地址或域名來測試網(wǎng)絡(luò)連通性。檢查SMB版本,確保SMB客戶端和服務(wù)器支持的版本兼容。如果電視、NAS或其他設(shè)備支持的SMB版本較低,可能需要調(diào)整設(shè)備的SMB版本設(shè)置。檢查共享路徑,確保指定的共享路徑存在且正確。如果路徑中包含中文或其他特殊字符,可能會導(dǎo)致連接失敗。嘗試使用英文路徑和避免使用特殊字符[8]。
調(diào)整安全設(shè)置,確保SMB服務(wù)器名稱強化設(shè)置正確,可以嘗試禁用SMB服務(wù)器名稱強化(SmbServerNameHardeningLevel = 0)[8]。查看日志文件,檢查SMB客戶端和服務(wù)器端的日志文件,查找具體的錯誤信息,以幫助確定是客戶端問題還是服務(wù)器端問題。更新和補丁,確保SMB客戶端和服務(wù)器都是最新版本,并且安裝了所有必要的補丁。
六、其他改善SMB協(xié)議傳輸速度的方法
(一)大文件復(fù)制速度慢
1.嘗試使用微軟在Windows內(nèi)置的無緩沖輸入輸出(IO)的方式進行文件復(fù)制(使用 xcopy /J 或 robocopy /J 命令)。
2.確保接收端縮放(Receive Side Scaling - RSS)配置正確。RSS 是一種用于提高網(wǎng)絡(luò)性能的技術(shù),主要應(yīng)用于多處理器系統(tǒng)中的網(wǎng)絡(luò)接收處理。其核心原理是允許網(wǎng)絡(luò)適配器將接收到的網(wǎng)絡(luò)數(shù)據(jù)包分發(fā)到多個處理器核心上進行處理,而不是只由一個核心來處理所有數(shù)據(jù)包。
3.測試硬盤存儲速度,因為SMB協(xié)議傳輸速度首先會受計算機本地存儲速度限制。在測試過程中如果發(fā)現(xiàn)文件復(fù)制有時一開始速度很快,隨后傳輸速度變慢。那么:
① 這種情況通常發(fā)生在初始復(fù)制是在緩存或緩沖中進行的,要么在內(nèi)存中,要么在磁盤陣列(RAID)控制器的內(nèi)存緩存中。當(dāng)緩存耗盡時,就會迫使數(shù)據(jù)直接寫入磁盤(Write-Through),而這會更慢。
② 使用Windows自帶的性能監(jiān)視器(Performance Monitor),查看存儲性能是否會隨時間下降,機器本身存儲瓶頸導(dǎo)致的SMB傳輸速度變慢。
③ 使用 RAMMap (SysInternals 工具)查看內(nèi)存中 “映射文件” 的使用量是否因可用內(nèi)存耗盡而停止增長[9]。
4.在網(wǎng)絡(luò)日志抓包中查找是否存在數(shù)據(jù)包丟失的情況,因為網(wǎng)絡(luò)丟包可能會導(dǎo)致 TCP 擁塞控制機制進行限流。
5.在SMB3 或更高版本的情況下,確保 SMB 多通道已啟用且正常工作。所謂多通道,就是在 Windows 系統(tǒng)中,當(dāng)進行 SMB 文件傳輸時,系統(tǒng)能夠自動檢測到多個可用的網(wǎng)絡(luò)適配器,并利用這些網(wǎng)絡(luò)適配器同時建立多個網(wǎng)絡(luò)連接來傳輸數(shù)據(jù),從而實現(xiàn)帶寬聚合和容錯功能。
6.如果SMB 客戶端遇到的問題,在 SMB 中啟用更大的最大傳輸單元 (MTU,Maximum Transmission Unit),將注冊表中的 EnableLargeMtu 設(shè)置為 1。MTU指的是網(wǎng)絡(luò)中一個數(shù)據(jù)幀或數(shù)據(jù)包能夠攜帶的最大數(shù)據(jù)量。一般情況下,以太網(wǎng)的默認(rèn) MTU 值是 1500 字節(jié)。若使用更大的 MTU 值,每次傳輸?shù)臄?shù)據(jù)量就會增多,這樣可以減少數(shù)據(jù)傳輸時的封裝開銷,進而提高傳輸效率。
7.還是在SMB 客戶端遇到問題的情況下,禁用帶寬限制,將注冊表中的 EnableBandwidthThrottling 設(shè)置為禁用狀態(tài)時(設(shè)置為 0),系統(tǒng)就不會對 SMB 客戶端的網(wǎng)絡(luò)帶寬使用進行限制。單個或多個 SMB 連接就可以占用大部分的網(wǎng)絡(luò)帶寬。
(二)小文件復(fù)制速度慢
“大量小文件”定義為數(shù)百、數(shù)千甚至數(shù)百萬個小于 1 MB 的文件。 SMB協(xié)議傳輸速度慢的情況最常出現(xiàn)在存在大量小文件的時候。在一定程度上,這是預(yù)期的并且眾所周知的現(xiàn)象[10]。SMB 協(xié)議必須執(zhí)行多個協(xié)議步驟才能創(chuàng)建文件,文件創(chuàng)建在性能方面是一項 “代價高昂的操作”。在傳輸任何數(shù)據(jù)之前,SMB 必須執(zhí)行多個協(xié)議操作來創(chuàng)建文件。文件系統(tǒng)本身在創(chuàng)建文件時也會有額外的性能損耗。小文件復(fù)制會反復(fù)受到這種損耗的影響。使用單線程復(fù)制時,每個文件的數(shù)據(jù)量不足以讓網(wǎng)絡(luò)傳輸足夠的數(shù)據(jù)來維持高網(wǎng)絡(luò)速度,因為創(chuàng)建文件所花費的時間比傳輸文件數(shù)據(jù)的時間更多。出現(xiàn)此問題的原因是,在僅傳輸少量數(shù)據(jù)負(fù)載后,就必須暫停數(shù)據(jù)傳輸以執(zhí)行文件創(chuàng)建。然而,單個大文件只有一次文件創(chuàng)建損耗,然后可以傳輸足夠的數(shù)據(jù)以達到網(wǎng)絡(luò)峰值速度。
提升通過SMB協(xié)議傳輸“大量小文件”的方式有三種。
1.使用Robocopy 命令來幫助傳輸。Robocopy 是 Windows 系統(tǒng)內(nèi)置的傳輸工具,其中的 “/MT” 參數(shù)可開啟多線程文件復(fù)制功能。多線程開啟后,可以顯著改善SMB協(xié)議的傳輸速度。
2.采用文件壓縮方式,即將小文件壓縮成大的文件,像常見的.zip、.7z、.rar、等格式,然后直接通過SMB傳輸大文件。
3.還可以選用其他支持多線程文件復(fù)制的第三方的文件復(fù)制工具。
七、結(jié)語
SMB協(xié)議的故障排除是一個復(fù)雜的過程,涉及多個層面的檢查和配置。通過對連接性、協(xié)商、會話設(shè)置、樹連接和網(wǎng)絡(luò)適配器配置等問題的系統(tǒng)性分析和解決,可以顯著提高網(wǎng)絡(luò)共享的性能和穩(wěn)定性。隨著技術(shù)的不斷發(fā)展,各類新的網(wǎng)絡(luò)故障和挑戰(zhàn)也將持續(xù)出現(xiàn)。因此,持續(xù)的監(jiān)控和優(yōu)化是確保SMB協(xié)議高效運行的關(guān)鍵。
參考文獻
[1]周后兵.網(wǎng)絡(luò)數(shù)據(jù)包攔截與操縱技術(shù)的研究與應(yīng)用[D].成都:電子科技大學(xué),2007.
[2]何偉,呂彬,周向軍.一種提高SMB協(xié)議代理文件下載性能的方法[J].計算機安全,2011(01):27-29.
[3]齊寓.基于SMB協(xié)議的文件安全傳輸技術(shù)研究[D].哈爾濱:哈爾濱工程大學(xué),2015.
[4]Elizabeth Ross, Deland Han. Advanced Troubleshooting Server Message Block (SMB)[EB/OL]. [2025-02-15].https://learn.microsoft.com/en-us/windows-server/storage/file-server/troubleshoot/troubleshooting-smb.
[5]Padre Pedro, Han Liang. New SMB File Server 3.0 Features - Windows Server[EB/OL].2023-12-26[2025-02-15].https://learn.microsoft.com/en-us/troubleshoot/windows-server/high-availability/smb-3-file-server-features.
[6]Jason Gerend. Overview of File Sharing Using the SMB 3 Protocol in Windows Server[EB/OL]. 2023-01-26[2025-02-15].https://learn.microsoft.com/en-us/windows-server/storage/file-server/file-server-smb-overview.
[7]Han Liang," Anna Li. Negotiate, Session Setup, and Tree Connect Failures - Windows Server[EB/OL]. 2023-12-26[2025-02-15]. https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/negotiate-session-setup-tree-connect-fails.
[8]Han Liang," Anna Li. Guidance for Troubleshooting SMB - Windows Server[EB/OL]. 2024-03-16[2024-12-15]. https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/troubleshoot-smb-guidance?source=recommendations.
[9]Dhurata Jahiu, Alex Mihaiuc, and Mark Russinovich. RAMMap v1.61[EB/OL]. Learn.microsoft.com, 2022-07-20[2025-03-11]. https://learn.microsoft.com/en-us/sysinternals/downloads/rammap.
[10]Han Liang, Anna Li, and Simonx Xu. Slow SMB files transfer speed[EB/OL].Learn.microsoft.com, 2025-2-14[2025-03-11]. https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/slow-smb-file-transfer.
作者單位:保時捷工程技術(shù)研發(fā)(上海)有限公司
責(zé)任編輯:王穎振 楊惠娟