尝试我们的虚拟代理 - 它可以帮助你快速识别和修复常见的 SMB 问题。
服务器消息块(SMB)是文件系统作的网络传输协议,使客户端能够访问服务器上的资源。 SMB 协议的主要目的是通过 TCP/IP 在两个系统之间启用远程文件系统访问。
SMB 故障排除可能非常复杂。 本文不是详尽的故障排除指南,而是一篇简短的入门文章,介绍了如何有效地排查 SMB 问题。
工具和数据收集
质量 SMB 故障排除的一个关键方面是传达正确的术语。 因此,本文介绍了基本的 SMB 术语,以确保数据收集和分析的准确性。
注释
SMB 服务器(SRV)是指托管文件系统的系统,也称为文件服务器。 SMB 客户端 (CLI) 是指尝试访问文件系统的系统,与 OS 版本无关。
例如,如果使用 Windows Server 2016 访问托管在 Windows 10 上的 SMB 共享,则 Windows Server 2016 是 SMB 客户端和 Windows 10 SMB 服务器。
收集数据
在排查 SMB 问题之前,建议先在客户端和服务器端收集网络跟踪。 以下准则适用:
在 Windows 系统上,可以使用 netshell(netsh)、网络监视器、消息分析器或 Wireshark 收集网络跟踪。
第三方设备通常具有内置数据包捕获工具,例如 tcpdump(Linux/FreeBSD/Unix),或 pktt (NetApp)。 例如,如果 SMB 客户端或 SMB 服务器是 Unix 主机,可以通过运行以下命令来收集数据:
# tcpdump -s0 -n -i any -w /tmp/$(hostname)-smbtrace.pcap
从键盘使用 Ctrl+C 停止收集数据。
若要发现问题的来源,可以检查两端跟踪:CLI、SRV 或两者之间的某个位置。
使用 netshell 收集数据
本部分提供使用 netshell 收集网络跟踪的步骤。
重要
Microsoft消息分析器工具 已停用 ,我们建议 Wireshark 分析 ETL 文件。 以前下载该工具并正在查找详细信息的用户,请参阅“安装和升级消息分析器”。
注释
运行 Netsh 跟踪会创建一个 ETL 文件。 可以在消息分析器(MA)、网络监视器 3.4(将分析程序设置为网络监视器分析程序 > Windows)和 Wireshark 中打开 ETL 文件。
在 SMB 服务器和 SMB 客户端上,在驱动器 C 上创建 Temp 文件夹。然后运行以下命令:
netsh trace start capture=yes report=yes scenario=NetConnection level=5 maxsize=1024 tracefile=c:\Temp\netTrace.etl
如果使用 PowerShell,请运行以下 cmdlet:
New-NetEventSession -Name trace -LocalFilePath "C:\Temp\netTrace.etl" -MaxFileSize 1024 Add-NetEventPacketCaptureProvider -SessionName trace -TruncationLength 1500 Start-NetEventSession trace
重现问题。
运行以下命令停止跟踪:
netsh trace stop
如果使用 PowerShell,请运行以下 cmdlet:
Stop-NetEventSession trace Remove-NetEventSession trace
注释
应仅跟踪传输的最小数据量。 对于性能问题,如果情况允许,始终采用好跟踪和坏跟踪。
分析流量
SMB 是使用 TCP/IP 作为网络传输协议的应用程序级协议。 因此,SMB 问题也可能由 TCP/IP 问题引起。
检查 TCP/IP 是否遇到以下任何问题:
TCP 三向握手未完成。 这通常表示存在防火墙块,或者服务器服务未运行。
正在重新传输。 由于复合 TCP 拥塞控制机制,这些可能会导致文件传输缓慢。
5 次重新传输后出现 TCP 重置可能意味着系统之间的连接丢失,或者其中一个 SMB 服务崩溃或停止响应。
TCP 接收窗口正在减少。 这可能是由于存储缓慢或其他问题导致无法从辅助函数驱动程序 (AFD) Winsock 缓冲区中检索数据的问题。
如果没有明显的 TCP/IP 问题,请查找 SMB 错误。 为此,请执行以下步骤:
始终根据 MS-SMB2 协议规范检查 SMB 错误。 许多 SMB 错误是良性的(不有害)。 请参考以下信息,先确定 SMB 返回错误的原因,然后再判断错误是否与以下问题中的任何一个相关。
MS-SMB2 消息语法文章详细介绍了每个 SMB 命令及其选项。
MS-SMB2 客户端处理文章详细介绍 SMB 客户端如何创建请求和响应服务器消息。
MS-SMB2 服务器处理文章详细介绍了 SMB 服务器如何创建请求和响应客户端请求。
检查 TCP 重置命令是否在FSCTL_VALIDATE_NEGOTIATE_INFO(验证协商)命令后立即发送。 如果是,请参阅以下信息:
当验证协商进程在客户端或服务器上失败时,SMB 会话必须终止(TCP 重置)。
此过程可能会失败,因为 WAN 优化器正在修改 SMB 协商数据包。
如果连接过早结束,请确定客户端和服务器之间的最后一次交换通信。
分析协议
查看网络跟踪中的实际 SMB 协议详细信息,以了解所使用的确切命令和选项。
请记住,SMB 只执行被告知要做的任务。
可以通过检查 SMB 命令来了解应用程序尝试做什么。
将命令和作与协议规范进行比较,以确保一切正常运行。 如果不是,请收集更接近或较低级别的数据,以查找有关根本原因的详细信息。 为此,请执行以下步骤:
收集标准数据包捕获。
运行 netsh 命令,跟踪并收集有关网络堆栈中是否存在问题的详细信息,或 Windows 筛选平台(WFP)应用程序中是否存在问题(例如防火墙或防病毒程序)。
如果所有其他选项都失败,请收集一个t.cmd(如果怀疑问题发生在 SMB 本身中,或者其他任何数据都不足以识别根本原因)。
例如:
将文件传输到单个文件服务器时遇到速度缓慢的情况。
双面跟踪显示 SRV 对 READ 请求的响应速度缓慢。
删除防病毒程序可解决文件传输缓慢问题。
请与防病毒程序管理部门联系以解决该问题。
注释
(可选)在故障排除期间 ,还可以 暂时卸载防病毒程序。
事件日志
SMB 客户端和 SMB 服务器都有详细的事件日志结构,如以下屏幕截图所示。 收集事件日志以帮助查找问题的根本原因。
与 SMB 相关的系统文件
本部分列出了与 SMB 相关的系统文件。 若要使系统文件保持更新,请确保已安装最新的 更新汇总 。
%windir%\system32\Drivers 下列出的 SMB 客户端二进制文件:
RDBSS.sys
MRXSMB.sys
MRXSMB10.sys
MRXSMB20.sys
MUP.sys
SMBdirect.sys
%windir%\system32\Drivers 下列出的 SMB 服务器二进制文件:
SRVNET.sys
SRV.sys
SRV2.sys
SMBdirect.sys
在 %windir%\system32 下
srvsvc.dll
更新建议
建议在解决 SMB 问题之前更新以下组件:
文件服务器需要文件存储。 如果存储具有 iSCSI 组件,请更新这些组件。
更新网络组件。
为了提高性能和稳定性,请更新 Windows Core。