本主题提供了客户端和服务器之间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 连接可能会消失而不通知。