CIFS协议文档.docx

上传人:b****3 文档编号:11747348 上传时间:2023-06-02 格式:DOCX 页数:23 大小:46.34KB
下载 相关 举报
CIFS协议文档.docx_第1页
第1页 / 共23页
CIFS协议文档.docx_第2页
第2页 / 共23页
CIFS协议文档.docx_第3页
第3页 / 共23页
CIFS协议文档.docx_第4页
第4页 / 共23页
CIFS协议文档.docx_第5页
第5页 / 共23页
CIFS协议文档.docx_第6页
第6页 / 共23页
CIFS协议文档.docx_第7页
第7页 / 共23页
CIFS协议文档.docx_第8页
第8页 / 共23页
CIFS协议文档.docx_第9页
第9页 / 共23页
CIFS协议文档.docx_第10页
第10页 / 共23页
CIFS协议文档.docx_第11页
第11页 / 共23页
CIFS协议文档.docx_第12页
第12页 / 共23页
CIFS协议文档.docx_第13页
第13页 / 共23页
CIFS协议文档.docx_第14页
第14页 / 共23页
CIFS协议文档.docx_第15页
第15页 / 共23页
CIFS协议文档.docx_第16页
第16页 / 共23页
CIFS协议文档.docx_第17页
第17页 / 共23页
CIFS协议文档.docx_第18页
第18页 / 共23页
CIFS协议文档.docx_第19页
第19页 / 共23页
CIFS协议文档.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

CIFS协议文档.docx

《CIFS协议文档.docx》由会员分享,可在线阅读,更多相关《CIFS协议文档.docx(23页珍藏版)》请在冰点文库上搜索。

CIFS协议文档.docx

CIFS协议文档

1CIFS协议3

协议概述3

协议头格式3

头域3

命令域3

错误类域5

错误代码域5

域5

域6

填充或安全签名域8

域8

域8

域8

域8

Wordcount和Parameterwords(参数域)8

和buffer域(缓冲)9

协议的安全机制9

用户级安全9

共享级安全9

加密9

协议的完整性10

机会锁10

协议包交换流程10

包交换的第一部分——协商和参数传递10

建立NetBIOS会话11

协议版本协商11

用户登录12

连接特定资源12

包交换的第二部分——数据交换13

属性、操作等参数传递13

数据交换14

2NetBIOS协议15

概述15

名称服务15

名称15

名称属性和格式15

名称解析方式15

名称识别策略16

名称管理16

会话服务16

概述16

会话原语17

数据报服务17

1、CIFS协议

CIFS协议概述

通用网际文件系统(CIFS)是微软服务器消息块协议(SMB)的增强版本,是计算机用户在企业内部网和因特网上共享文件的标准方法。

CIFS通过定义一种与应用程序在本地磁盘和网络文件服务器上共享数据的方式相兼容的远程文件访问协议使之能够在因特网上进行协作。

定义了客户端向服务器端的请求和服务器端得应答报文。

CIFS数据包格式为标准头部+2个可变长区域。

CIFS协议有很多版本,每个协议的版本称为一种方言,并分配一个唯一的字符串来识别。

当客户端希望访问远程服务器上的文件时,第一次发送的CIFS数据包是一个协商版本的数据包。

在这个数据包中,客户端列出了自己可以提供的版本字符串。

服务器在响应数据包中选择其中一种版本字符串发送给客户端。

这样两者就协商出一个CIFS协议的版本。

协议头格式

0

1

2

3

4

5

6

7

0

1

2

3

4

5

6

7

0

1

2

3

4

5

6

7

0

1

2

3

4

5

6

7

0xFF

'S'

'M'

'B'

Command

Errorclass

Mustbezero

Errorcode

Errorcode(continued)

Flags

Flags2

填充或者安全签名,通常标准的填充是0

树ID(TID)

进程ID(PID)

用户ID(UID)

多重识别码(MID)

wordcount

Parameterwords[wordcount]

Bytecount

Buffer[bytecount]

头域

每个CIFS数据包的开始包含4个字节的头。

第一个字节是0xFF,第二个字节是字母‘S’的ASCII表示,第三个字节和第四个字节分别为‘M’和‘B’。

命令域

命令域为1个字节,用来表示CIFS数据包的类型。

其各种命令对应的数值见下:

SMB_COM_CREATE_DIRECTORY0x00

SMB_COM_DELETE_DIRECTORY0x01

SMB_COM_OPEN0x02

SMB_COM_CREATE0x03

SMB_COM_CLOSE0x04

SMB_COM_FLUSH0x05

SMB_COM_DELETE0x06

SMB_COM_RENAME0x07

SMB_COM_QUERY_INFORMATION0x08

SMB_COM_SET_INFORMATION0x09

SMB_COM_READ0x0A

SMB_COM_WRITE0x0B

SMB_COM_LOCK_BYTE_RANGE0x0C

SMB_COM_UNLOCK_BYTE_RANGE0x0D

SMB_COM_CREATE_TEMPORARY0x0E

SMB_COM_CREATE_NEW0x0F

SMB_COM_CHECK_DIRECTORY0x10

SMB_COM_PROCESS_EXIT0x11

SMB_COM_SEEK0x12

SMB_COM_LOCK_AND_READ0x13

SMB_COM_WRITE_AND_UNLOCK0x14

SMB_COM_READ_RAW0x1A

SMB_COM_READ_MPX0x1B

SMB_COM_READ_MPX_SECONDARY0x1C

SMB_COM_WRITE_RAW0x1D

SMB_COM_WRITE_MPX0x1E

SMB_COM_WRITE_COMPLETE0x20

SMB_COM_SET_INFORMATION20x22

SMB_COM_QUERY_INFORMATION20x23

SMB_COM_LOCKING_ANDX0x24

SMB_COM_TRANSACTION0x25

SMB_COM_TRANSACTION_SECONDARY0x26

SMB_COM_IOCTL0x27

SMB_COM_IOCTL_SECONDARY0x28

SMB_COM_COPY0x29

SMB_COM_MOVE0x2A

SMB_COM_ECHO0x2B

SMB_COM_WRITE_AND_CLOSE0x2C

SMB_COM_OPEN_ANDX0x2D

SMB_COM_READ_ANDX0x2E

SMB_COM_WRITE_ANDX0x2F

SMB_COM_CLOSE_AND_TREE_DISC0x31

SMB_COM_TRANSACTION20x32

SMB_COM_TRANSACTION2_SECONDARY0x33

SMB_COM_FIND_CLOSE20x34

SMB_COM_FIND_NOTIFY_CLOSE0x35

SMB_COM_TREE_CONNECT0x70

SMB_COM_TREE_DISCONNECT0x71

SMB_COM_NEGOTIATE0x72

SMB_COM_SESSION_SETUP_ANDX0x73

SMB_COM_LOGOFF_ANDX0x74

SMB_COM_TREE_CONNECT_ANDX0x75

SMB_COM_QUERY_INFORMATION_DISK0x80

SMB_COM_SEARCH0x81

SMB_COM_FIND0x82

SMB_COM_FIND_UNIQUE0x83

SMB_COM_NT_TRANSACT0xA0

SMB_COM_NT_TRANSACT_SECONDARY0xA1

SMB_COM_NT_CREATE_ANDX0xA2

SMB_COM_NT_CANCEL0xA4

SMB_COM_OPEN_PRINT_FILE0xC0

SMB_COM_WRITE_PRINT_FILE0xC1

SMB_COM_CLOSE_PRINT_FILE0xC2

SMB_COM_GET_PRINT_QUEUE0xC3

SMB_COM_READ_BULK0xD8

SMB_COM_WRITE_BULK0xD9

SMB_COM_WRITE_BULK_DATA0xDA

错误类域

服务器用来指明请求是否成功。

通常情况下为0表示成功,如果不为零,这个域表示该错误代码是什么类。

错误类为以下值之一:

ERRDOS(0X01)-错误是从核心DOS操作系统设置

ERRSRV(0x02)-错误是由服务器的网络文件管理器

ERRHRD(0x03)-硬件错误

ERRCMD(0xFF)-命令没有在“SMB”格式

错误代码域

该域为2字节长度,表示已发生的错误的类型。

通常为0表示没有错误。

各种错误对应的数值见下:

长度为1字节,此域包含了8个独立的标志。

没有设置的标志客户端必须设定为0,服务器需要忽略该标志。

编号从最低位到最高位其定义如下:

0:

为过时的请求保留位(LOCK_AND_READ,LOCK_AND_CLOSE);

1:

保留位。

(必须为0);

2:

保留位。

(必须为0);

3:

设置为1时,路径名无视大小写,设置为0时,路径名是区分大小写的。

4:

保留位。

(客户端必须设置为0,服务器端忽略该位);

5:

为过时的请求保留位(SMB_COM_OPEN,SMB_COM_CREATE,

SMB_COM_CREATE_NEW);

6:

为过时的请求保留位(SMB_COM_OPEN,SMB_COM_CREATE,

SMB_COM_CREATE_NEW);

7:

设置为1时,表示是服务器对客户端请求的应答,其命令域常与客户端请求的命令域相同。

该域可以通过设置为0和1明确区分是请求还是应答。

2字节,定义了更多的标志位。

0:

设置为1,表示服务器可能在响应中返回长文件名。

(KNOWS_LONG_NAMES)

1:

设置为1,表示客户端知道扩展属性。

(KNOWS_EAS)

2:

设置为1,表示SMB需要验证。

(诚信检查?

)(SECURITY_SIGNATURE)

3:

保留位。

6:

设置为1,任何请求的路径名为长路径名。

(IS_LONG_NAME)

11:

设置为1,客户端知道扩展安全协商。

(EXT_SEC)

12:

设置为1,SMB中的任何请求的路径名需在分布式文件系统中解决。

(DFS)

13:

设置为1,表明如果客户端没有读权限但有执行权限,读命令被允许。

这个标志只对读请求有效。

14:

设置为1,返回的错误代码为32位。

否则错误类和错误域包含DOS-style错误信息。

当传输协商的NT状态代码时,该域在每个SMB中都必须为1。

16:

设置为1,表示数据包中的字符编码为UNICODE,设置为0,表示数据包中的字符编码为ASCII。

填充或安全签名域

通常标准的填充是0,此栏通常设置为0。

TID是一个16位的数字,用来标识这个CIFS数据包指的是什么资源(通常为磁盘共享或者打印机)。

当数据包交换没有牵涉到某个资源时,这个域是无意义的,可以忽略的。

如果某客户端希望对某资源进行访问,则该客户端发送的CIFS数据包中的命令域设置为SMB_COM_TREE_CONNECT_ANDX。

在这个包中就指定共享或者打印机的名称。

然后服务器将对该资源和客户端进行验证,然后发送应答表示成功。

在这个应答数据包中,服务器可以将TID域设置为任何数字。

而从那时起,如果客户端希望对该资源提出请求,TID就会被设置为上次客户端给定的TID数字。

PID是一个16位的数字,用来标识客户端上的哪个进程发出的CIFS请求。

服务器使用这个数字来检查并发问题(通常是为了保证文件不会被竞争中的客户端进程所损坏)。

UID是一个16位的数字,迎来标识在客户端发出CIFS请求的用户。

客户端必须发送一个包含用户名和密码的CIFS数据包请求来获得服务器给定的UID。

服务器在验证了用户名和密码之后会应答该请求,该应答中包含一个服务器生成的UID。

之后该客户端在未来的CIFS请求中均使用该UID。

如果客户端的请求需要检查权限,服务器将验证请求的UID有没有必须的权限。

一个UID只为已形成的NetBIOS会话有效。

服务器和不同的用户的其他会话可能使用相同的UID。

注意:

如果服务器是在共享级的安全模式下,UID是无意义的,可以忽略。

MID是一个16位数字,用来标识多个客户端的要求。

每当客户端发送一个CIFS数据包,服务器就检查MID来看它是否还有没有应答的请求。

如果有,它保证了新要求会被被赋予一个新的MID以区别以前的请求。

每当服务器应答一个CIFS请求时,发送的应答包中确保和相应地请求中的MID相同。

这样,用户就知道哪些未完成的请求与收到的应答是对应的。

Wordcount和Parameterwords(参数域)

CIFS数据包使用这两个域来表示命令的具体参数数据。

Parameterwords域是一个可变长(需是16位的整数倍)。

Wordcount域实际表明parameterwords域的长度(以2字节为单位)。

每种数据包类型的wordcount域在草案中有定义。

每个单独的命令都有2个wordcount定义,一个是给客户端定义的,一个是给服务器端定义的。

这是必要的,因为

请求和应答不一定需要相同的wordcount。

Bytecount和buffer(缓冲区)

和wordcount、parameterwords的定义非常相似。

Buffer域的长度是可变的。

Bytecount表示buffer域有多少字节。

参数域和缓冲区的主要区别是存储什么类型的数据。

参数域通常包含少量的数据包命令参数选项,而缓冲区包含大量的原始数据(如共享文件中的数据)。

协议的安全机制

CIFS提供认证和授权这2种安全机制,其中认证又包括共享级认证和用户级认证。

A是一个对CIFS客户端标记为网络共享可用的共享服务器(通常是一个文件夹或者打印机)。

限制访问共享文件有两种办法:

用户级安全

希望访问该共享的客户端必须提供用户名和密码。

(windowsNT和windows2000)

用户级认证方式为不同用户提供不同的用户名,因此能提供高于共享级认证的安全性,但用户名和口令是以明文方式传送或者虽然加密也容易受到字典攻击,因此也存在被监听和破解的威胁。

进一步的改进方法可以加密用户名和口令,还可以利用服务器消息块SMB(ServerMessageBlock)的签名机制实现客户机和服务器之间的双向认证。

共享级安全

被共享的文件本身需要一个密码来访问,客户端访问不需要用户名,用户的身份不需要确认。

(windows95和windows98)

在共享级认证方式下,整个共享点只有一个单一的口令用于共享访问,提供的安全保障有限,只能用于对安全性要求不高的公共资源共享或临时资源共享等场合。

加密

用户和共享级安全性中,实际的密码是以加密格式发送到服务器的。

常用两种加密方法较新的NTstyle和老的LANmanagestyle,但两种加密方法均采用挑战-应答认证,服务器向客户端发送一个随机字符串并期望得到响应,客户端将用户名和随机数合并后用HASH函数生成一个字节串发送给服务器(其在HASH函数中使用的密钥就是由口令生成的?

就是这个地方不是很明白,在HASH中,这个随机串扮演什么角色。

我理解的是:

当时用户注册时就将用户名明文存储在服务器中,而密码是经过HASH(或者其他处理)得到的长度确定的字符串存放于服务器中,这样突破服务器只知道用户名,不知道密码。

但是这个密码形成的字符串(设为m)却可以用来验证。

客户端将自己的用户名和随机串合并成一个长串,密码再次经过相同的步骤形成定长字符串作为HASH的密码使用。

即如下式:

username(用户名)key(密码)string(随机字符串)

m是处理过的key,由key可以很容易得到m,由m得到key很难

客户端发送=HASHm(username||string)

服务器将该字节串和自己的计算结果比较,若二者相同则通过认证,否则认证失败。

协议的完整性

机会锁

机会锁(数据完整性,感觉和数据库中的锁异曲同工),当CIFS数据包指定打开一个文件,就需要对该文件加一个机会锁,如果服务器将这个文件加锁后,其他客户端实体就不能再访问这个文件。

这允许客户端对这个文件进行任何它想要的修改二不需要将其立即写入服务器。

1.levelIIoplock

2.Exclusiveoplock

3.Batchoplock

协议包交换流程

CIFS数据包交换流程一共分为两个部分:

1.第一部分(当客户端启动与服务器建立连接时):

一个NetBIOS会话建立、CIFS版本协商、发送用户名和密码,这样,服务器端的一个资源被连接。

2.第二部分:

访问一个共享文件从中读取需要的数据。

注意:

客户端总是发送到服务器的TCP的139端口,而服务器应答给客户端自己选择的临时端口。

此外,以下CIFS域可设为下面的默认值,当然也可以根据自己的具体情况进行设定:

1.errorclass/errorcodes:

客户端发送时总为0,服务器端应答时也为0。

2.Flags:

所有数据包均设置成0x00。

(区分大小写路径)

3.Flags2:

所有数据包均设置成0x0001。

(支持长文件名)

4.填充和安全签名:

所有数据包均设为0.

包交换的第一部分——协商和参数传递

当CIFS客户端确定希望访问CIFS服务器上的资源,交换下面的数据包。

首先,NetBIOS会话建立,提供可靠的传输服务。

然后,客户端和服务器端协商CIFS版本。

然后客户端登录到服务器,发送用户名和密码,服务器验证成功后客户端连接到所需的资源。

建立NetBIOS会话

包1C->S请求:

目的:

建立NetBIOS会话(listen和call)

首先客户端在139端口建立一个与服务器之间的全双工TCP连接。

完成之后,客户端通过建立TCP连接和发送NetBIOS会话请求数据包。

会话的请求报文中包含客户端的NetBIOS名称,服务器的NetBIOS名称和一个整数常量表示数据包的目的是建立一个NetBIOS会话。

包2S->C应答:

目的:

NetBIOS会话确认

如果上述会话请求数据包中包含服务器的NetBIOS名称,而且数据包是正确的格式,服务器会发送一个简单的会话确认数据包(4字节)来表明会话建立成功或者失败。

协议版本协商

包3C->S请求:

目的:

CIFS协议版本协商

客户端发送一个CIFS请求数据包包含SMB_COM_NEGOTIATE命令,缓冲区中包含客户端可以解析的CIFS协议版本。

具体各个域的值为:

Command:

SMB_COM_NEGOTIATE(0x72)

TID:

在这个包中被忽略

PID:

设置为客户端处理进程的ID

UID:

在这个包中被忽略

MID:

任何唯一的编号

Wordcount:

0

Parameterwords:

Butecount:

设置为119(可根据客户端可以解析的版本数变化)

Buffer:

包含119字节的版本描述

包4S->C应答:

目的:

CIFS协议版本协商

服务器响应客户端的协商请求,从客户端给定的版本中选择一个。

应答数据包中各个域的值为:

Command:

SMB_COM_NEGOTIATE(0x72)

TID:

在这个包中被忽略

PID:

因为是从服务器发送,被忽略

UID:

在这个包中被忽略

MID:

匹配客户端发送的唯一的编号

Wordcount:

取决于选择的版本。

Parameterwords:

包含选定的版本和许多服务器属性。

比较重要的是MAXMPXCOUNT(客户端可以发起的请求最大数)和32位能力标志。

Bytecount:

可变,通常大于8

Buffer:

通常包含一个8字节的随机字符串,在以后的数据包中,客户端用来加密。

用户登录

包5C->S请求:

目的:

用户登录

客户端发送CIFS数据包,包含用户名和密码,以获得一个UID。

这个数据包也要转发客户端功能给服务器,所以即使使用共享级安全也必须发送这个数据包。

数据包各个域的值如下:

Command:

SMB_SESSION_SETUP_ANDX(0x73)

TID:

在这个包中北忽略

PID:

设置为客户端处理进程的ID

UID:

在这个包中被忽略

MID:

任何唯一的编号

Wordcount:

12

Parameterwords:

列出了客户端的功能。

也包含了要在下面缓冲区中提供的密码的大小。

Bytecount:

可变值,下面的缓冲区包含加密的用户名、密码、操作系统的名称和LANManager。

Bytecount的值取决于这些尸体的字符串的大小

Buffer:

包含用户名、密码、操作系统的名称等。

包6S->C应答:

目的:

返回给客户端UID或者返回错误,如果验证不成功的话。

一旦服务器受到加密的用户名和密码,检查后如果是正确的,发送应答数据包,包中包含UID。

如果结果是错误的,这个响应将返回错误类,并设置响应的错误代码。

数据包的各个域的值如下:

Command:

SMB_COM_SESSION_SETUP_ANDX(0x73)

TID:

在这个包中被忽略

PID:

因为是从服务器发送,被忽略

UID:

16位数字,是该服务器分配给客户端的用户身份ID

MID:

匹配客户端发送的唯一的编号

Wordcount:

3

Parameterwords:

没有和正常操作有关的内容

Bytecount:

可变值,下面的缓冲区包含说明服务器操作系统和LANManager类型的字符串

Buffer:

包含表示服务器操作系统和LANManager类型

连接特定资源

包7C->S请求:

目的:

连接到特定资源

客户端已被认证,可以连接到世界的共享文件。

在这个数据包中,客户端指定它希望访问的共享文件。

共享名为UNC格式。

数据包中各个域的值如下:

Command:

SMB_COM_TREE_CONNECT_ANDX(0x75)

TID:

在这个包中被忽略

PID:

设置为客户端处理进程的ID

UID:

为包6中服务器发送的UID

MID:

任何唯一的编号

Wordcount:

4

Parameterwords:

没有与正常操作有关的内容

Bytecount:

可变值,取决于一下要求的UNC字符串的大小

Buffer:

包含客户端希望访问的共享的名称

包8S->C应答:

目的:

返回TID或者错误,如果共享名称不存在

如果共享名称存在,也拥有访问权限,则服务器返回一个成功的响应和TID。

如果共享不存在或者用户不具有访问权限,服务器返回相应地错误类和错误代码。

如果这个数据包是一个表示成功的响应,则客户端可以访问既定的共享文件了。

这是客户端和服务器交换的最后的数据包。

数据包中各个域的值如下:

Command:

SMB_COM_SESSION_SETUP_ANDX(0x73)

TID:

16位数字代表服务器分配给指定共享资源的TID

PID:

因为是从服务器发送,被忽略

UID:

16位数字,是该服务器分配给客户端的用户身份ID

MID:

匹配客户端发送的唯一的编号

Wordcount:

3

Parameterwords:

没有与正常操作有关的内容

Bytecount:

可变值,取决于下面的缓冲区

Buffer:

包含本地文件系统和设备类型的字符串

包交换的第二部分——数据交换

以打开和读取文件数据为例。

属性、操作等参数传递

包1C->S请求:

目的:

打开一个文件

数据包中各个域的值如下:

Command:

SMB_COM_OPEN_ANDX(0x2D)

TID:

上面服务器应答给定的TID

PID:

设置为处理客户端处理进程的ID

UID:

设置为服务器返回的表示客户端的UID

MID:

任何唯一的编号

Wordcount:

15

Parameterwords:

指定模式(读、写或者读写)和共享模式(无、读、写)等许多开放的选择

Bytecount:

可变值,依赖于文件名的字符串

Buffer:

包含要打开的文件的名称

包2S->C应答:

目的:

显示文件的ID,或者如果有问题则返回错误代码

服务器检查,如果请求的文件名存在,且UID指定的用户有权访问该文件,则发送一个响应包,其

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2