定义
SMB协议是一种应用层的网络通信协议, 用于让网络上的节点之间共享文件、打印机和串行端口, 并进行多种形式的信息交换[3]。它采用客户端—服务器结构, 客户端提出请求, 服务器作出应答, 服务器把自己的文件系统和其他资源开放给网络上的客户端使用[3]。
在 Microsoft Windows 中实现的版本被称作 Microsoft SMB 协议, 定义某一版本协议的消息数据包集合称为方言, 通用 Internet 文件系统(CIFS)协议就是 SMB 的一种方言[2]。除文件共享外, SMB 还支持方言协商、网络浏览、网络打印、共享访问身份验证、文件与记录锁定、文件和目录变更通知以及 Unicode 等功能[2]。
原理
SMB 属于客户端—服务器模式的实现, 由一组数据包构成, 每个数据包承载客户端发出的请求或服务器给出的响应。这些数据包大致分为三类: 会话控制数据包用于建立和终止与共享服务器资源的连接, 文件访问数据包用于访问和操作远程服务器上的文件与目录, 常规消息数据包则把数据送往打印队列、邮件槽和命名管道, 并提供打印队列状态信息[2]。为降低应答延迟、提高带宽利用率, 多个消息数据包可以合并到一次传输中发送, 这种做法称为批处理[2]。
在 OSI 网络模型中, SMB 通常被归为应用层或表示层协议, 依赖较低层的传输协议承载; 最常用的传输层协议是运行在 TCP/IP 之上的 NetBIOS(NBT), 也可以不使用单独的传输协议[2]。直接承载于 TCP 的 SMB 通信使用 445 端口, 此类流量不再经过 NetBT, 报文前有 4 字节头部, 首字节固定为 0x00, 其后 3 字节表示数据长度; 经由 NetBT 会话承载的 SMB 则建立在 TCP 139 端口上[4]。SMB 的进程间通信机制提供命名管道, 使程序员能够利用客户端首次连接 SMB 服务时完成的认证, 一些服务如基于 SMB 的 MSRPC 都建立在命名管道之上[1]。
发展历程
SMB 的核心最初由 IBM 的贝瑞·费根鲍姆(Barry Feigenbaum)设计, 他起初用自己的姓名缩写将其命名为 BAF, 后来改称 SMB; 该协议最初的目的是把 DOS 系统中的本地文件接口改造成网络文件系统[5]。原始协议运行在 NetBIOS 之上, 其命令基本是 DOS 文件读写接口的翻版, 效率不高, 早期也不具备身份验证, 网络上的任何人都可以读写[5]。IBM 于 1984 年发布了最初的 SMB 规范, 1985 年至 1992 年间 IBM、3Com、Intel 与微软共同对协议进行扩展, 使其成为 DOS、OS/2 和 Windows 等系统的默认文件系统协议[6]。
1996 年, 微软对 SMB 加以扩展并改称通用 Internet 文件系统(CIFS), 同时加入了符号链接、硬链接和更大的文件尺寸等能力; 这一提议停留在互联网草案阶段, 未成为正式标准, 微软后来停用了 CIFS 这一名称[7]。Windows Vista 与 Windows Server 2008 中引入了 SMB 2.0, 协议包格式与 SMB 1.0 完全不同; 2.1 版随 Windows 7 与 Windows Server 2008 R2 出现, 3.0 版则随 Windows 8 与 Windows Server 2012 推出[8][9]。
SMB 2.0 相较 1.0 允许多个操作同时进行, 而 1.0 只能执行一个操作并等待响应后才能继续, 因此 2.0 在文件复制上速度明显更快; 2.0 还支持在网络短暂中断后维持并续传文件[10]。3.0 版则加入了 SMB Direct(基于远程直接内存访问的 SMB)、SMB 加密、SMB 多通道和透明故障转移等特性[11]。3.1.1 版开始协商加密与完整性算法, 并提供预认证完整性校验与压缩能力[12]。
应用
SMB 最常见的用途是局域网内的文件共享与远程打印, 普通用户熟悉的网络邻居和远程打印功能背后就是这一协议[5]。在 Windows 上, 网络共享由 网络组件「文件和打印机共享」提供, 其他操作系统也可以实现该协议, 例如 Samba 就是一个可运行在类 Unix 及 OpenVMS 等系统上的 SMB 服务器, 它能让 Windows 计算机访问非 Windows 系统上的共享[13]。
SMB 也是 微软 分布式文件系统实现的基础, 虚拟化平台 Hyper-V 采用 SMB 作为基于文件的存储协议, 该协议自 Windows 2000 起随系统提供[1][10]。SMB 3.0 中的 SMB Direct 可借助支持 RDMA 的网卡提升性能, SMB 多通道则允许一次 SMB 会话绑定多条网络连接, 从而聚合带宽并提高容错性[11]。近年出现了 SMB over QUIC, 它在 SMB 3.1.1 之上改用基于 UDP 的 QUIC 传输, 默认以 TLS 加密, 并使用 UDP 443 端口而非 TCP 445 端口, 客户端自 Windows 11 起提供支持[14]。
局限
SMB 传统上依赖 TCP 445 端口, 而这一端口常被防火墙、运营商或云安全组封禁, 导致共享无法建立; 排查此类问题时通常需要确认 445 端口是否开放[15][16]。同时, SMB 在广域网上的表现受限, 高延迟或丢包会明显拖慢握手和传输过程, 早期版本也不具备校验和验证机制, 在延迟较高的网络中容易出现性能问题[17]。
SMB 的早期版本存在明显安全短板。SMB 1.0 缺少加密与预认证完整性校验、对不安全来宾登录的限制以及防降级攻击等机制, 其漏洞曾被多个高危攻击利用, 微软已于 2014 年正式弃用该版本, 并从 Windows 10 1709 和 Windows Server 1709 起不再默认安装[18][19]。协议规范长期闭源, 最初只以私有形式提供, 其他厂商和项目不得不通过逆向工程来实现互通, SMB 1.0 的规范是在被逆向工程之后才发布的[20]。
不同版本之间存在兼容性约束。SMB 2.0 只在客户端与服务器双方都支持时才可使用, 若有一方不支持, 通信会退回 SMB 1.0[8]。禁用了 SMBv1 之后, 仍依赖该版本的旧计算机或旧软件可能出现兼容问题[21]。SMB over QUIC 同样只支持 SMB 3.1.1, 无法兼容旧客户端, 并且需要配置 TLS 证书与 QUIC 端点[14]。
参见
参考资料
- [科普中国]-服务器消息块协议 [引用日期2026-10-14]
- Microsoft SMB 协议和 CIFS 协议概述 [引用日期2026-10-14]
- SMB プロトコルの説明 [引用日期2026-10-14]
- Server Message Block and NetBIOS - INTERNET-DRAFT A [引用日期2026-10-14]
- The SMB/CIFS protocol [引用日期2026-10-14]
- CIFS_POSIX_extensions [引用日期2026-10-14]
- Server Message Block [引用日期2026-10-14]
- ms10-054 [引用日期2026-10-14]
- SMB3 [引用日期2026-10-14]
- Server Message Block [引用日期2026-10-14]
- smb-3-file-server-features [引用日期2026-10-14]
- Guidelines-for-Writing-Modules-with-SMB [引用日期2026-10-14]
- 共享资源 [引用日期2026-10-14]
- SMB over QUIC: Secure File Sharing without a VPN [引用日期2026-10-14]
- storage-files-networking-overview [引用日期2026-10-14]
- SMBJ连接超时常见原因有哪些? - 黎小葱 2025-10-03 14:25 采纳率: 98.5% [引用日期2026-10-14]
- Revision 381ae892-685b-44d7-bc23-ddd36b8776dc [引用日期2026-10-14]
- 微软承认 9 月 Win10 / Win11 更新导致 SMBv1 共享失效 [引用日期2026-10-14]
- Disabling SMBv1 on Windows desktops [引用日期2026-10-14]
- Server Message Block [引用日期2026-10-14]