[MS-SMB2]: Server Message Block (SMB) Protocol Versions 2 and 3

既然在深入nfs的知识,那就干脆把smb相关的知识一起对比着学习一下,本文翻译自9/20/2023, [MS-SMB2]: Server Message Block (SMB) Protocol Versions 2 and 3,大部分借助于ChatGPT翻译,仅作为我个人的参考,如果你想查阅,建议看英文文档,因为我不确定我记录的中文翻译是否完整和正确。

持续更新中。。。

1 引言

Server Message Block (SMB)协议版本2和版本3支持在计算机之间共享文件和打印资源。该协议借用并扩展了Server Message Block (SMB) Version 1.0 Protocol中的概念,该协议在[MS-SMB]中进行了规定。本规范假定读者熟悉[MS-SMB]以及[MS-WPO]第9节中描述的安全概念。

本规范的第1.5、1.8、1.9、2和3节是规范性的。本规范中的所有其他部分和示例均属于信息性内容。

1.1 术语表

查阅的时候再翻译

1.2 参考

Microsoft开放规范库中的文档链接指向引用文档的最新发布版本中的正确部分。然而,由于库中的单个文档不会同时更新,因此文档中的部分编号可能不匹配。您可以通过检查勘误表来确认正确的部分编号。

1.2.1 规范性引用

我们经常对规范性引用进行调查,以确保它们持续可用。如果您在查找规范性引用时遇到任何问题,请联系dochelp@microsoft.com。我们将协助您找到相关信息。

请查看网页

1.2.2 信息性引用

请查看网页

1.3 概述

服务器消息块(Server Message Block,SMB)协议第2版和第3版,以下简称“SMB 2协议”,是原始服务器消息块(SMB)协议(如[MS-SMB]和[MS-CIFS]中所指定)的扩展。这两种协议都用于客户端通过网络请求来自服务器系统的文件和打印服务。两者都是有状态的协议,其中客户端建立与服务器的连接,建立在该连接上的身份验证上下文,然后发出各种请求以访问文件、打印机和命名管道进行进程间通信。

SMB 2协议是现有SMB协议的重大修订,如[MS-SMB]中所指定。数据包格式与SMB协议完全不同,但许多基本概念得以保留。用于启动和接受连接的底层传输可以是直接TCP(如第2.1节所指定)或NetBIOS over TCP传输(如[RFC1001]和[RFC1002]所指定)。

为了保持与现有客户端和服务器的兼容性,可以使用现有的SMB协议来协商使用SMB 2协议,如第1.7节所述。然而,在协商后,这两种协议将不会在指定的连接上混合使用。

与其前身一样,即原始SMB协议(如[MS-SMB]中所指定),SMB 2协议支持以下功能:

为连接上的不同安全主体建立一个或多个身份验证上下文。
在连接上连接到目标服务器上的多个共享资源。
打开、读取、修改或关闭目标服务器上的多个文件或命名管道。
利用文件的机会性锁定,以允许客户端缓存数据以提高性能。
查询和应用文件或目标服务器上卷的属性。
取消未完成的操作。
将IO控制码操作传递到服务器机器上的底层对象存储。
验证请求和响应的完整性。
支持共享范围和服务器别名,以使单个服务器呈现为多个不同的服务器,如[MS-SRVS]第1.3节所述。

SMB 2协议除了上述功能外,还提供了一些增强功能:

允许在客户端连接暂时断开后重新建立对文件的打开。
允许服务器平衡客户端在任何时候可以拥有的同时操作的数量。
在共享、用户和同时打开文件的数量方面提供可扩展性。
支持符号链接。
使用更强的算法验证请求和响应的完整性。

SMB 2.1方言引入了以下增强功能:

允许客户端在多协议协商请求中指示对多个SMB 2方言的支持。
允许客户端在来自同一客户端的多个打开中获取并保留客户端缓存状态。
允许客户端标记未缓冲句柄上的单个写操作,以将其视为写直通。
允许客户端检索文件的哈希以供在分支缓存检索中使用,如[MS-PCCRC]第2.3节所述。

SMB 3.0方言引入了以下增强功能:

允许客户端检索文件特定区域的哈希以供在分支缓存检索中使用,如[MS-PCCRC]第2.4节所述。
允许客户端在目录上获得租约。
支持在客户端和服务器之间的流量加密,以每个共享为基础进行。
在适当的硬件和网络可用时,支持远程直接内存访问(RDMA)传输。
在客户端和服务器之间支持增强故障切换,包括可选的句柄持久性。
允许应用程序在新客户端上执行故障切换并打开先前使用应用程序实例标识符打开的文件。
允许客户端将会话绑定到服务器上的多个连接。可以通过与会话关联的任何通道发送请求,并通过与请求使用的相同通道发送相应。下图显示了两个使用多个通道与服务器通信的会话的示例。

图1: 使用多通道的两个会话

SMB 3.0.2方言引入以下增强功能:

允许客户端通过树连接响应检测不对称共享,以便客户端可以优化其与服务器的连接,以在访问此类共享时提高可用性和性能。
允许客户端请求未缓冲读、写操作。
允许客户端在使用RDMA传输执行I/O时请求远程失效。

SMB 3.1.1方言引入以下增强功能:

支持加密和完整性算法的协商。
增强协商和会话建立的保护。
使用指定的方言重新连接。
支持客户端和服务器之间消息的压缩。
通过RDMA转换的协商支持RDMA负载的加密。

2 todo: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/06451bf2-578a-4b9d-94c0-8ce531bf14c4