一、简介

SMB协议(也叫CIFS)是一种Windows上使用的共享协议。分为三个版本:SMB、SMB2和SMB3。

二、CIFS工作方式

1、基于TCP构建三次握手 2、协商:客户端把自己支持的所有CIFS版本都发送给服务器,服务器从中挑出自己所支持的最新版本回复给客户端。 3、协商好版本后,建立CIFS Session。 4、完成Session Setup(身份验证),常用的方式有Kerbero和NTLM。 5、打开共享文件夹(Tree Connect)

三、常见问题

1、如果用户无权访问此目录,会不会在Tree Connect这一步失败? 答:不会。Tree Connect并不检查权限,所以即便无权限访问的用户也能得到Tree ID。检查权限的工作由Greate操作完成。无论是新建文件、打开目录,还是读写文件,都需要Greate。 2、假如某用户已经打开了\10.32.106.72\dest\abc.txt,如果还想再打开\10.32.106.72\Source\abc.txt,需要再建一个TCP连接吗? 答:没有必要,在一个TCP连接上能维持多个打开的Tree Connect。 3、Windows的Backup Operators组中的用户有权备份所有文件,但不一定有权限读写文件。服务器是怎么知道一个用户是想备份还是想读的? 答:备份和读这两个行为的确非常相似,都是依靠Read操作来完成的。它们的不同点在于,备份的时候在Greate请求中的"Backup Intent"设为1,而读的时候"Backup Intent"设为0。服务器就是依靠Backup Intent来决定是否允许访问的。 4、如果多个用户一起访问相同文件,CIFS如何处理冲突?(访问冲突指的是CIFS协议层的) 答:在Create请求中有Access Mask和Share Access Mask两个选项。前者表示该用户对此文件的访问方式(读、写、删等),后者表示该用户允许其他用户对此文件的访问方式。 5、CIFS如何保证缓存数据的一致性? 答:正常情况下,客户端暂时把文件缓存在本地,等用完之后再同步回服务器端。CIFS采用了Oplock(机会锁)来解决这个问题,Oplock有Exclusive(允许读写缓存)、Batch(允许所有操作的缓存)和Level-2(只允许读缓存)三种形式。Oplock也是在Create中实现的。 6、同样是用SMB协议读一个文件,Windows XP和Windows 7的表现有何不同? 答:(1)Windows 7可以一口气发出多个请求;(2)Windows XP在网络丢包的情况下,更容易碰到超时重传;Windows XP发了一个读请求之后就会停下来等回复,收到回复后再发下一个读请求。 7、利用Windows Explorer从CIFS共享下复制文件,为什么比Robocopy和EMCopy之类的工具慢很多? 答:Windows Explorer是逐个文件复制的(单线程),而这些工具能同时复制多个文件(多线程)。 8、从CIFS共享里复制一个文件,然后粘贴到同一个目录里,为什么还不如粘贴到客户端的本地硬盘快? 答:前者需要把数据从服务器复制到客户端的内存里,然后再从客户端的内存写到服务器上,相对于读+写两个操作。而后者只是从服务器读到客户端内存里,然后写到本地硬盘,相当于网络上只有读写操作。(SMB3已完全实现了服务器端的本地复制) 9、在CIFS共享上剪切一个文件,然后粘贴到同一共享的子目录里,为什么就比粘贴到本地硬盘快呢? 答:在相同的文件系统上剪切、粘贴,本质上只有"rename"操作,并没有读和写,所以是非常快的。