当前位置:   article > 正文

SMB小传 —— SMB网络文件系统协议介绍

kernel的filesystem系统实现smb协议

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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/749157
推荐阅读
相关标签
  

闽ICP备14008679号