服务器消息块(SMB)协议是一种网络文件共享协议,Microsoft Windows 中实现的协议称为Microsoft SMB 协议。 定义特定版本的协议的消息数据包集称为方言。 通用 Internet 文件系统 (CIFS) 协议是 SMB 的方言。 SMB 和 CIFS 也可用于 VMS、多个版本的 Unix 和其他作系统。
通用 Internet 文件系统 (CIFS) 文件访问协议中的 Microsoft Corporation 提供了对 CIFS 的技术参考。
概述
尽管其主要用途是文件共享,但其他Microsoft SMB 协议功能包括:
- 方言协商
- 确定网络中的其他 Microsoft SMB 协议服务器或进行网络浏览
- 通过网络打印
- 文件、目录和共享访问身份验证
- 文件和记录锁定
- 文件和目录更改通知
- 扩展文件属性处理
- Unicode 支持
- 机会性锁定
在 OSI 网络模型中,Microsoft SMB 协议最常用作应用程序层或表示层协议,并且依赖于较低级别的传输协议。 Microsoft SMB 协议的传输层协议最常用于 NetBIOS over TCP/IP (NBT)。 但是,Microsoft SMB 协议也可在没有单独的传输协议的情况下使用,Microsoft SMB 协议/NBT 组合通常用于向后兼容性。
Microsoft SMB 协议是客户端服务器实现,由一组数据包组成,每个数据包都包含客户端发送的请求或服务器发送的响应。 这些数据包可以广泛分类为:
- 会话控制数据包建立并停止与共享服务器资源的连接。
- 文件访问数据包访问和操作远程服务器上的文件和目录。
- 常规消息包将数据发送到打印队列、邮件槽(mailslot)和命名管道,并提供有关打印队列状态的数据。
某些消息数据包可以分组并在一个传输中发送,以减少响应延迟并提高网络带宽。 这称为“批处理”。 Microsoft SMB 协议数据包交换方案 部分介绍了使用数据包批处理的 Microsoft SMB 协议会话的示例。
本部分内容
以下主题概述了 Microsoft SMB 协议和 CIFS 协议:
| 主题 | DESCRIPTION |
|---|---|
| Microsoft SMB 协议方言 | 若要使用 Microsoft SMB 协议在客户端与服务器之间建立连接,必须先确定客户端和服务器支持的最高级别的功能的方言。 |
| Microsoft SMB 协议身份验证 | Microsoft SMB 协议中使用的安全模型与 SMB 的其他变体使用的安全模型相同,由两个安全用户和共享级别组成。 共享是Microsoft SMB 协议客户端可以访问的文件、目录或打印机。 |
| Microsoft SMB 协议数据包交换方案 | 客户端与服务器之间Microsoft SMB 协议数据包交换的示例。 |
一、Microsoft SMB 协议方言
多年来,Microsoft SMB 协议消息数据包列表已增长,以适应Microsoft SMB 协议的日益增强功能,现在数百个。 其增长的每个阶段都标有一个标准数据包集或方言。 每个方言都由标准字符串(如“PC NETWORK PROGRAM 1.0”、“MICROSOFT NETWORKS 3.0”、“DOS LANMAN 2.1”或“NT LM 0.12”)标识。 第一个字符串标识 SMB 的第一个方言,最后一个字符串标识 CIFS,这是Microsoft SMB 协议的第一个方言。
大多数 Windows 客户端至少支持六种不同的 Microsoft SMB 协议方言,因此使用 Microsoft SMB 协议在客户端与服务器之间建立连接的第一步是确定具有客户端和服务器支持的最高级别的功能的方言。 此过程被称为“谈判方言”。上述方言字符串包含在方言协商请求和响应数据包中,以实现此目的。
二、Microsoft SMB 协议身份验证
Microsoft SMB 协议中使用的安全模型与 SMB 的其他变体使用的安全模型相同,由两个安全级别(用户和共享)组成。 共享是Microsoft SMB 协议客户端可以访问的文件、目录或打印机。
用户级身份验证指示尝试访问服务器上的共享的客户端必须提供用户名和密码。 进行身份验证后,用户可以访问服务器上不受共享级别安全性保护的所有共享。 此安全级别允许系统管理员专门确定哪些用户和组可以访问共享。
共享级身份验证指示对共享的访问由分配给该共享的密码控制。 与用户级安全性不同,此安全级别不需要用户名进行身份验证,也不会建立用户标识。
在两个安全级别下,密码在发送到服务器之前进行加密。 Microsoft SMB 协议支持 NTLM 和较旧的 LAN 管理器 (LM) 加密。 这两种加密方法都使用质询-响应身份验证,其中服务器将发送一个随机字符串,客户端返回一个计算的响应字符串,该字符串证明客户端有足够的凭据进行访问。
三、Microsoft SMB 协议数据包交换方案
本主题提供了客户端和服务器之间Microsoft SMB 协议数据包交换的示例。 以下步骤概述该过程:
- 客户端和服务器建立 NetBIOS 会话。
- 客户端和服务器协商Microsoft SMB 协议方言。
- 客户端登录到服务器。
- 客户端连接到服务器上的共享。
- 客户端在共享上打开一个文件。
- 客户端从文件读取。
首先,客户端与服务器建立全双工 TCP 连接。 然后,客户端通过 TCP 连接生成并发送 NetBIOS 会话请求数据包。 如果数据包的格式正确,服务器将返回一个数据包,其中包含确认会话已建立的消息。 之后,客户端会将第一个Microsoft SMB 协议数据包发送到服务器。
| 数据包 1:SMB_COM_NEGOTIATE 方向: 客户端到服务器 说明: 客户端请求服务器协商Microsoft SMB 协议方言。 标识客户端可以使用的方言的字符串列表包含在数据包中。 |
| 数据包 2:SMB_COM_NEGOTIATE 方向: 服务器到客户端 说明: 服务器响应客户端的请求,以标识要在会话中使用的Microsoft SMB 协议方言。 返回的数据包还包括一个 8 字节随机字符串,该字符串将在下一步中用于在登录过程中对客户端进行身份验证。 |
| 数据包 3:SMB_COM_SESSION_SETUP_ANDX 方向: 客户端到服务器 说明: 此数据包包含有关客户端功能的信息,因此即使服务器只实现了共享级别安全性,也必须发送此数据包。 数据包 3:SMB_COM_SESSION_SETUP_ANDX 方向: 服务器到客户端 说明: 如果服务器接受质询/响应,则会在返回到客户端的数据包中包含有效的 UID。 如果不接受,服务器将返回此数据包中的错误代码并拒绝访问。 |
| 数据包 4:SMB_COM_TREE_CONNECT_ANDX 方向: 客户端到服务器 说明: 客户端请求对共享的访问权限。 数据包包含以 UNC 格式表示的共享的完全指定路径。 |
| 数据包 5:SMB_COM_TREE_CONNECT_ANDX 方向: 服务器到客户端 说明: 如果授予对共享的访问权限,则服务器将返回与此数据包中的共享相对应的 16 位树 ID (TID)。 如果共享不存在,或者用户没有足够的凭据访问共享,服务器将返回此数据包中的错误代码,并拒绝访问共享。 |
| 数据包 6:SMB_COM_OPEN_ANDX 方向: 客户端到服务器 说明: 客户端请求服务器代表客户端打开访问共享上的文件。 此数据包包含要打开的文件的名称。 |
| 数据包 7:SMB_COM_OPEN_ANDX 方向: 服务器到客户端 说明: 如果授予对文件的访问权限,服务器将返回所请求的文件的文件 ID。 如果文件不存在,或者用户没有足够的凭据访问该文件,服务器将返回此数据包中的错误代码,并拒绝访问该文件。 |
| 数据包 8:SMB_COM_READ_ANDX 方向: 客户端到服务器 说明: 客户端请求服务器代表客户端从打开的文件读取数据,并将此数据返回到客户端。 此数据包中包含文件打开时客户端获取的文件 ID,用于标识服务器应从中读取数据的打开文件。 |
| 数据包 9:SMB_COM_READ_ANDX 方向: 服务器到客户端 说明: 服务器返回此数据包中请求的文件数据。 如果授予了对服务器、共享和文件的访问权限,则不太可能出现此处的错误。 但是,在某些情况下,它可能发生:例如,如果在打开文件的时间和读取共享的时间之间更改了对共享的访问。 |
注意
如果实现不支持更改通知的 CIFS,则 Windows 无法将未完成的句柄保留在文件系统中,并且 SMB 连接可能会消失而不通知。
机会锁
机会锁(也称为 oplock)是客户端在服务器上的文件上加的锁。 在大多数情况下,客户端请求机会锁,以便它可以在本地缓存数据,从而减少网络流量并提高明显的响应时间。 机会锁由具有远程服务器的客户端上的网络重定向程序以及本地服务器上的客户端应用程序使用。
注释
在本节中找到的有关机会锁的文章主要涉及客户端应用程序,尽管也为网络重定向程序提供了一些信息。 可以在 Windows WDK 的 Oplocks 文章中找到更多网络重定向程序的作锁信息。
概述
机会锁协调客户端和服务器与多个客户端之间的数据缓存和一致性。 一致的数据是跨网络相同的数据。 换句话说,如果数据是一致的,则服务器上的数据以及所有客户端都会同步。
机会锁不是客户端对服务器的命令。 它们是从客户端到服务器的请求。 从客户端的角度来看,它们是机会性的。 换句话说,每当其他因素使锁成为可能时,服务器都授予此类锁。
当本地应用程序请求访问远程文件时,机会锁的实现对应用程序是透明的。 网络重定向程序以及涉及的服务器会自动打开和关闭机会锁。 但是,当本地应用程序请求访问本地文件时,还可以使用机会锁,并且必须委托其他应用程序和进程的访问以防止文件损坏。 在这种情况下,本地应用程序直接从本地文件系统请求机会锁,并在本地缓存该文件。 以这种方式使用时,机会锁实际上是由本地服务器管理的信号灯,主要用于文件和文件访问通知中的数据一致性。
在应用程序中使用机会锁之前,应熟悉 “创建和打开文件”中所述的文件访问和共享模式。
可以创建的并发机会锁的最大数目仅受可用内存量的限制。
本地应用程序不应尝试从远程服务器请求机会锁。 如果尝试执行此作, DeviceIoControl 将返回错误。
机会锁机制对应用程序的作用有限。 本地文件系统上的应用程序使用机会锁的一种用途是提供透明的文件访问。 应用程序(如内容索引器或其他扫描程序)可以使用机会锁来通知另一个应用程序正在尝试访问索引器应用程序正在处理的文件。 这使索引器能够关闭其句柄,不妨碍其他应用程序,从而避免引起共享违规或其他问题。 应用程序中机会锁的另一个实际用途是测试网络重定向程序或服务器机会锁处理程序。
通常,文件系统实现对机会锁的支持。 大多数应用程序将机会性锁管理留给文件系统驱动程序。 任何实现文件系统的人都应使用 可安装文件系统 (IFS) 工具包。 任何开发可安装文件系统以外的设备驱动程序的人都应使用 Windows 驱动程序工具包(WDK)。
机会锁及相关操作是互联网草案中通用 Internet 文件系统(CIFS)协议机会锁部分的一个拓展集。 CIFS 协议是服务器消息块 (SMB) 协议的增强版本。 有关详细信息,请参阅 Microsoft SMB 协议和 CIFS 协议概述。 CIFS Internet Draft 明确指出,可以通过拒绝授予机会锁来实现 CIFS。
本部分内容
以下主题用于识别机会锁:
| 主题 | DESCRIPTION |
|---|---|
| 本地缓存 | 本地缓存 数据是一种技术,用于加快对数据文件的网络访问速度。 它涉及到尽可能在客户端而不是服务器上缓存数据。 |
| 数据一致性 | 如果数据是一致的,则服务器上的数据以及所有客户端都会同步。 提供数据一致性的软件系统是修订控制系统(RCS)。 |
| 如何请求机会锁 | 要请求机会锁,首先需要以适合于应用程序的权限和标志打开文件。 请求机会锁的所有文件都必须以重叠(异步)模式打开。 |
| 针对锁定文件打开请求的服务器响应 | 你可以通过授予尽可能多的共享、请求所需的最低访问级别,以及使用适合应用程序的最低侵入性机会锁来最大程度地降低应用程序对应用程序的影响,从而最大程度地降低应用程序对应用程序的影响。 |
| 机会锁的类型 | 介绍具有机会性锁的 Read-Write-Handle、Read-Write、Read-Handle 和 Read。 此外,还介绍了旧级别 1、级别 2、批处理和筛选机会锁。 |
| 破解机会锁 | 使机会锁失效是一个将一个客户端在文件上具有的锁降级的过程,以便另一个客户端可以打开文件,无论是否使用机会锁。 |
| 伺机锁示例 | 级别 1 机会锁、批处理机会锁和筛选器机会锁的网络流量视图关系图。 |
| 机会锁操作 | 如果应用程序请求机会锁,则必须使用具有FILE_FLAG_OVERLAPPED标志的 CreateFile 函数为重叠(异步)输入和输出打开其请求锁的所有文件。 |
有关机会性锁的其他信息,请参阅 CIFS Internet 草稿文档。 本主题与当前 CIFS Internet 草稿之间的任何差异都应得到解决,以支持 CIFS Internet 草稿。

6949

被折叠的 条评论
为什么被折叠?



