赞
踩
SMB网络文件系统协议, 全名服务器消息块(Server Message Block),曾用名CIFS(通用互联网文件系统 Common Internet File System), 公元1983年诞生于IBM[1],幼年得到英特尔和微软的照料,最终在微软的培养下成长为当今世上网络文件系统协议两极之一的存在。本文就来聊聊SMB的生平二三事。
作为一个诞生在谷歌、亚马逊、雅虎、甚至思科都不曾存在的互联网“远古”时代[2]的网络协议,SMB的早期版本(SMB 1.0/CIFS,以下简称SMB1)在不停地修修补补中却也渐渐无法适应现代的网络环境了。如今的互联网已经不再简单不再纯粹,互联网上存储着海量的数据并还在快速生产新数据,运行着各式各样的网络应用,也同样充斥着的无处不在的恶意攻击。
SMB1协议有太多的缺点,除了近期在2017年因为WannaCry病毒事件而再次暴露出来的巨大安全漏洞之外,便是SMB1协议特性导致了其对于网络资源的巨大耗费以及在远距通信场景下极差的性能。SMB1显著的性能问题还使得CIFS加速器成为了WAN加速类产品[3]的必备组件,思科、riverbed等公司都研发过此类功能,当然这些都是题外话了。对于SMB1的种种不足和为什么要停止使用SMB1,微软SMB项目的负责人Ned Pyle已经有了清晰的诉说[4, 5],本文便不再赘述了。
下面(表-1),本文列表总结了SMB协议各个版本的发布时间以及各版本所带来的重要协议特性。可以看到,从1983年到2007年这整整24年中,SMB作为一个网络文件系统的基本功能已经比较完整了,各种文件系统操作、用户认证、消息签名、客户端缓存等等的功能都有,更是取消了对NetBIOS协议层的依赖从而直接使用445端口运行在TCP/IP之上。至于为何SMB在1996年一度改名为CIFS呢?那都是源于微软面对Sun公司的NFS(Network File System)协议面向Web服务的扩张(WebNFS),而进行的一次失败的IETF网络文件系统标准化尝试[6],对此本文不多作细说。不过这一次改名导致了人们现在有时也会以CIFS来称呼SMB协议,而在Linux平台的SMB客户端甚至一直保持了CIFS的命名。
随着互联网产业的快速发展,SMB堪忧的安全性和愈发跟不上时代的性能使得微软不得不对SMB协议进行大刀阔斧的修订,并在2007年发布了SMB 2.0。仔细观察就会发现,SMB 2.X和SMB 3.X带来的众多新特性基本都是是围绕着增加安全性和提升性能这两个主题来设计的。
SMB版本 |
年代 |
相应操作系统版本 |
重要协议特性 |
SMB 3.1.1 |
2015 |
Windows 10 Windows Server 2016 |
- 传输加密算法协商 - 预认证完整性检查(pre-authentication integrity) |
SMB 3.0.2 |
2013 |
Windows 8.1 Windows Server 2012 R2 |
- 客户端直读直写请求 - SMB Direct(RDMA)性能改进 |
SMB 3.0 |
2012 |
Windows 8 Windows Server 2012 |
- 目录级元数据客户端缓存(directory lease) - 持久句柄(persistent handle) - 基于AES-CCM算法的数据传输加密 - 消息签名(message signing)改用AES-CMAC算法 - SMB Direct(RDMA)支持 - 多通道(multi-channel) |
SMB 2.1 |
2009 |
Windows 7 Windows Server 2008 R2 |
- 基于Lease的文件数据客户端缓存 - 多协议版本支持协商(multi-protocol negotiate) - 弹性句柄(resilient handle) |
SMB 2.0.2 |
2008 |
Windows Vista SP1 Windows Server 2008 |
- SMB指令数量减至19个 - 基于信用点(credit)的流控机制 - 改进复合请求机制(request compounding) - 耐用句柄(durable handle) - 消息签名(message signing)改用SHA-256算法 - 支持软链接(symbolic link) - 提升最大数据块尺寸(maximum block size) |
SMB 2.0 |
2007 |
Windows Vista |
|
======================== 时代的分割线 ======================== |
|||
SMB 1.0/CIFS |
2000 |
Windows 2000 |
- 包含100+指令的指令集 - 打开(open)、读(read)、修改(modify)、关闭(close)等文件操作 - 取消(cancel)操作 - 直接运行于TCP/IP协议之上(Direct hosting of SMB over TCP/IP) - 查询、设定文件和卷属性(attributes) - 基于NTLM、Kerbeors等协议的用户认证 - 基于MD5算法的消息签名(message signing) - 基于机会锁(opportunistic lock / oplock)的文件数据客户端缓存 |
CIFS |
1996 |
Windows NT 4.0 |
|
早期SMB |
1983 |
MS-DOS OS/2 |
表-1 SMB协议版本历史与重要特性[7]
然而,如果用户们想要真正用上新版SMB协议带来的新特性,就必须保证SMB客户端和SMB服务端都能够支持带有该特性的协议版本。更因为微软并不支持向旧版Windows系统移植新版的SMB客户端或服务端程序,用户只能更新操作系统之后才能够体验更新的SMB特性。在表-2中,我们列出了不同Windows系统组合之间所能够支持的最高的SMB版本以供参考。
Windows版本
|
Windows 10
WS 2016
|
Windows 8.1
WS 2012 R2
|
Windows 8
WS 2012
|
Windows 7
WS 2008 R2
|
Windows Vista
WS 2008
|
更早版本
|
Windows 10
WS 2016
|
SMB 3.1.1
|
SMB 3.0.2
|
SMB 3.0
|
SMB 2.1
|
SMB 2.0.2
|
SMB 1
|
Windows 8.1
WS 2012 R2
|
|
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。