超详细的CIFS协议详解!

4,283 阅读3分钟

这是我参与更文挑战的第13天,活动详情查看: 更文挑战

前文介绍过一个文件共享协议,即Sun设计的NFS。理论上NFS可以应用在任何操作系统上,但是因为历史原因,现实中只在Linux/UNIX上流行。那Windows上一般使用什么共享协议呢?它就是微软维护的SMB协议,也叫Common Internet File System(CIFS)。CIFS协议有三个版本:SMBSMB2SMB3,目前SMB和SMB2比较普遍。

在Windows上创建CIFS共享非常简单,只要在一个目录上右键单击,在弹出的菜单中选择**属性****->**共享,再配置一下权限就可以了。如图所示,在其他电脑上只要输入IP和共享名就可以访问它了。

CIFS在企业环境中应用非常广泛,比如映射网络盘或者共享打印机;同事间共享资料也可以采用这种方式。

首先,CIFS只能基于TCP,所以必定是以三次握手开始的。从图可见,CIFS服务器上的端口号为445

接下来的第一个CIFS操作是Negotiate****(协商)。协商些什么呢?请关注图的底部,可见客户端把自己支持的所有CIFS版本,比如SMB2NT LM 0.12(为了便于和SMB2对比,接下来我们称它为SMB)等都发给服务器。

服务器从中挑出自己所支持的最高版本回复给客户端。从图中可知,服务器选择的是SMB2,这说明了该服务器支持****SMB2

协商好版本之后,就可以建立CIFS Session了,如图5所示。

Session Setup过后,意味着已经打开了。接下来要做的是打开**\**Users共享。如图所示,这个操作称为Tree Connect

点开这两个Tree Connect包,最有价值的信息当属服务器返回的Tree ID。从此之后客户端就能利用这个ID去访问/dest共享的子目录和子文件。这一步看似简单,但初学者也会有一些疑问。

常见问题1:如果用户无权访问此目录,会不会在Tree Connect这一步失败?

答案:不会。Tree Connect并不检查权限,所以即便是无权访问的用户也能得到Tree ID,检查权限的工作由接下来的Create操作完成。

常见问题2:某用户已经打开了\a\1.txt,如果还想再打开\b\1.txt,需要再建一个TCP连接吗?

答案:没有必要,在一个TCP连接上能维持多个打开的Tree Connect

过了Tree Connect是不是该开始读文件了?其实还差很多步骤,接下来客户端还要在服务器上查询很多信息。看了图7你就能理解为什么人们都嫌CIFS协议哕嗦了。

Create是CIFS中非常重要的一个操作。无论是新建文件、打开目录,还是读写文件,都需要Create。有时候我们因为没有权限遭遇"Access Denied"错误,或者覆盖文件时收到"File Already Exists"提醒,都是来自Create这个操作。