Microsoft SMB 协议数据包交换方案

本主题提供了客户端和服务器之间 Microsoft SMB 协议数据包交换的示例。 以下步骤概述了该过程:

  1. 客户端和服务器建立 NetBIOS 会话。
  2. 客户端和服务器协商 Microsoft SMB 协议方言。
  3. 客户端登录到服务器。
  4. 客户端连接到服务器上的共享。
  5. 客户端在共享上打开文件。
  6. 客户端从文件读取。

首先,客户端与服务器建立全双工 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 连接可以在不通知的情况下消失。