1 NFS报文分析
NFS协议基于RPC协议,每个NFS报文都对应着一个RPC报文类型。除NFS报文外,PORTMAP,MOUNT等同NFS密切相关的报文也在分析范围内。除特别说明外,本次分析服务器IP为192.168.0.120,客户端IP为192.168.0.186。
1.1 查询远程可挂载的目录
1.1.1 NFS服务未开启
如果服务器未开启NFS功能输入
showmount –e 主机名或IP
则在终端显示:
mount clntudp_create: RPC: Program not registered
主要交互流程:
客户端通过TCP与服务器的Portmap程序建立连接,尝试通过TCP远程调用GETPORT,服务器返回MOUNT功能为开启。然后客户端再次尝试通过UDP达到此目的,服务期同样返回PROGRAM_NOT_AVAILABLE。整个过程是基于RPC的。
1.1.2 NFS服务已开启
客户端首先通过PORTMAP远程调用请求MOUNT的端口。后面又重传两次,重传报文的XID相同的,而服务器就是通过XID来判断一个报文是否是另一个的REPLY。服务器得到请求后返回端口号33394。客户端使用33394端口来进行EXPORT类型MOUNT请求。服务器返回请求,内容如下:
Procedure:EXPORT下面的Value Follows代表List 是否还有内容。
在获取到这个List后会在终端显示:
1.2 挂载远程目录
挂载远程目录的过程最本质的是如何获得此目录在服务器上的文件句柄,我们在分析下面的交互时始终以此为中心。
1.2.1 挂载不存在的目录
首先通过客户端通过一个基于TCP的RPC获得MOUNT的端口32771,之后,客户端试图通过MOUNT请求来获得/home/work_ro的句柄,从而实现远程挂载。但由于目录不存在,服务器会当作权限不够来处理,所以返回ERR_ACCESS。
1.2.2 成功挂载
前面的交互和目录不存在的情况基本相同,只是服务器在MOUNT请求后返回了要挂在目录句柄。此后通过PORTMAP得到NFS的端口,
挂载成功后,客户端还要通过PORTMAP得到NFS端口,NFS端口这一部分请参看RFC1094。
完成上面的交互后,请求的文件目录已经成功挂载到了本地。
通过TYPE为GETATTR类型的NFS报文得到挂载目录的属性,其中包括:文件类型,访问权限,文件大小,文件的归属者以及上次的访问时间等,如下图:
然后,客户端发出了FSSTAT请求,这个请求的内容为此目录的动态信息。如下图:
目录的动态信息包括,总大小,可用的小等。
客户端发送FSINFO请求,服务器返回目录的静态的信息。
1.2.3 挂载多个目录到本地
现在,向服务器
可以看到,在请求第一个目录时,我们可以看到在一个基于TCP的PORTMAP请求后,服务器返回了一个PORTMAP报文。但在后面的两个目录的请求过程中却只有请求,没有回复。
1.3 管理远程目录
1.3.1 管理远程目录包括:获取列表,新建目录,新建文件,删除目录,删除文件,修改文件,修改属性等。
1.3.2 获取远程目录
通过ll命令来查看目录下面的文件列表,目录root_ro(0x75ec0804)下有以下文件或目录:
aaa hello bbb ccc test test2
我们可以看到客户端会首先进行一次GETATTR的请求,来确认挂载的是目录或者是文件。在Type字段说明了类型。
请求GETATTR后,客户端发出对root_ro的ACCESS的请求,得到的报文主要内容如下:
说明客户端可以读root_ro但不可进行创建等操作。作为挂载的顶级目录,root_ro同样是不可LOOKUP的。除非挂载了root_ro的上一级目录。
在客户端得到allow READ的消息后,通过发送NFS的READDIR请求,得到目录内容列表。
通过这个报文的内容,我们可以看到,root_ro目录下的内容。
然后,客户端开始又一次请求对root_ro的ACCESS报文,这个动作贯穿于NFS的所有交互中。当前请求的目的是看是否有权限进行下面的对子目录的LOOK UP操作。
得到allow READ之后,开始逐个发送子目录或文件的LOOKUP报文。在服务器发回的Reply报文中包含了这个目录或文件的句柄File Handle。
“NFS中一个基本概念是文件句柄(file handle)。它是一个不透明(opaque)的对象,用来引用服务器上的一个文件或目录。不透明是指服务器创建文件句柄,把它传递给客户,然后客户访问文件时,使用对应的文件句柄。客户不会查看文件句柄的内容——它的内容,只对服务器有意义。
“每次一个客户进程打开一个世纪位于一个NFS服务器上的文件时,NFS客户就会NFS服务器那里获得该文件的一个文件句柄。每次NFS客户为用户进程读或写时,文件句柄就会传给服务器以指定被访问的文件。
一般情况下,用户进程不会和文件句柄打交道——之有NFS客户和NFS服务器将文件句柄传来传去。在第2版的NFS中,一个文件句柄占据32个字节,第3版中增加为64个字节。”
——TCP/IP详解:卷1
1.3.3 新建目录
在挂载根目录下,新建目录test1
新建目录时,首先进行两次ACCESS请求,获得对挂载根目录的操作权限。
经过上面两次请求,客户端向服务器查询要建立的目录是否存在。服务器回复不存在。
客户端再经过一次ACCESS请求后,发送NFS的MKDIR报文。服务器在返回Reply时,同时返回新建目录的file handle。如下图:
图 1?1
1.3.4 改变文件属性
主要操作为:首先客户端请求对挂载根目录的权限,和根目录的属性来判断是否可以改变test1的属性。再进行一次权限的请求,然后获得test1的属性。最后通过SETATTR请求来改变test1的属性。
1.3.5 删除目录
主要交互过程和新建目录大致相同,不做冗述。
1.3.6 卸载远程目录
先获得MOUNT的端口32771,在通过此端口卸载远程目录。
第二篇:CIFS与NFS协议分析
NFS CIFS协议
1、 CIFS
Microsoft推出SMB(server message block)后,进一步发展,使其扩展到Internet上,成为common internet file system。
CIFS采用C/S模式,基本网络协议:TCP/IP和IPX/SPX;
两种资源访问模式:
(1) share level security:所有用户的共享资源访问口令是相同的,主要在win9x中
使用;
(2) user level securyt:Win NT以后的OS只提供ULS,用于必须提供正确的U/P,
并且每个用户权限可以是不同的。
C/S的交互模式:类似与三次握手;三个交互:
(1) 协议选择:双方选择合适的协议进行交互;
(2) 身份验证:按选定的协议登录server,由server对client进行身份验证;
(3) 资源获取:认证通过后,server和client进行交互,进行文件读写等操作。 注意:相同win OS中,所有机器都是对等的,扮演双重角色,可以作server,也可以是client。
CIFS是一种协议,和具体的OS关系不大,Unix在安装samba后可以使用CIFS;
2、 CIFS和NFS对比
(1) CIFS面向网络连接的共享协议,对网络传输的可靠性要求高,常使用TCP/IP;NFS
是独立于传输的,可使用TCP或UDP;
(2) NFS缺点之一,是要求client必须安装专用软件;而CIFS集成在OS内部,无需额
外添加软件;
(3) NFS属无状态协议,而CIFS属有状态协议;NFS受故障影响小,可以自恢复交互
过程,CIFS不行;从传输效率上看,CIFS优于NFS,没有太多冗余信息传送;
(4) 两种协议都需要文件格式转换,NFS保留了unix的文件格式特性,如所有人、组
等等;CIFS则完全安装win的风格来作。
NAS之文件系统之NFS
NFS:sun公司19xx年推出,基于RPC构建,依靠Unix OS。
目的:通过网络连接来共享servers上的Files和Data。
基本原理:server借助NFS导出一个或多个可供远程客户端共享的目的,客户端mount server上的目录,实现对文件资源的共享。客户端借助RPC对服务器提出服务请求。
NFS是带Cache的,提高访问效率。
NFS的服务器提供三个关键守护进程:portmap,mounted,nfsd
(1) portmap ―― 监听固定端口,提供RPC服务,将TCP/IP的协议端口映射为RPC
程序号;
(2) nfsd ―― 根据客户需求启动文件系统请求服务守护进程,处理用户需求;
(3) mounted ―― 发送文件句柄给客户端的mount进程。
其它进程nfsiod:用于提供IO吞吐率。
NFS特点:
(1) 无状态协议;
(2) 支持故障自恢复功能;可实现容错、容灾功能;
3、 NFS和CIFS网络文件系统
NFS(Network File System,网络文件系统)是当前主流异构平台共享文件系统之一。主要应用在UNIX环境下。最早是由SUN microsystem开发,现在能够支持在不同类型的系统之间通过网络进行文件共享,广泛应用在FreeBSD、SCO、Solaris等等异构操作系统平台,允许一个系统在网络上与他人 共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件一样访问远端系统上的文件,使得每个计算机的节点能够像使用本地资源一样方便的使用网上资源。换言之,NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。
NFS的工作原理是使用客户端/服务器架构,由一个客户端程序和服务器程序组成。服务器程序向其它计算机提供对文件系统的访问,其过程就叫做“输出”。NFS客户端程序对共享文件系统进行访问时,把它们从NFS服务器“输送”出来。文件通常以“块”为单位进行传输,其尺寸是8K(虽然它可能会将操作分成更小尺寸的分片)。NFS传输协议用于服务器和客户机之间的文件访问和共享的通信,从而使客户机远程的访问保存在存储设备上的数据。
CIFS(Common Internet File System,公共互联网文件系统)是当前主流异构平台共享文件系统之一。主要应用在NT/Windows环境下,是由Microsoft公司开发。其工作原理是让CIFS协议运行与TCP/IP通信协议之上,让Unix计算机可以在网络邻居上被Windows计算机看到。
共享文件系统特点:
1、 异构平台下的文件共享:不同平台下的多个客户端可以很容易的共享NAS中的同
一个文件。
2、 充分利用现有的LAN网络结构,保护现有投资。
3、 冗余安装,使用和管理都很方便,实现即插即用。
4、 广泛的连接性:由于基于IP/Ethernet以及标准的NFS和CIFS,可以适应复杂的网
络环境。
5、 内部资源的整合:可以将内部的磁盘整合成一个统一的存储池,以卷的方式提供给
不同的用户,每一个卷可以格式化成不同的文件系统。
6、 允许应用进程打开一个远地文件,并能够在该文件的某一个特定的位置上开始读写
数据。NFS可使用户只复制一个大文件中的一个很小的片段,而不需要复制整个大文件,在网络上传送的只是少量的修改数据。
需要注意的是,CIFS和NFS虽然统一也是文件系统(File System),但它并不能用于在磁盘中存储和管理数据,它定义的是通过TCP/IP网络传输文件时的文件组织格式和数据传
输方式。利用CIFS和NFS共享文件实际涉及到两次的文件系统转换。客户端从服务器端申请一个文件时,服务器端首先从本地读出文件(本地文件系统格式),并以NFS/CIFS的格式封装成IP报文并发送给客户端。客户端收到IP报文以后,把文件存储于本地磁盘中(本地文件系统格式)。
4、 存储系统与文件系统
提到NAS,通常会想到传统的NAS设备,它具有自己的文件系统,具有较大的存储容量,具有一定的文件管理和服务功能。NAS设备和客户端之间通过IP网络连接,基于NFS/CIFS协议在不同平台之间共享文件,数据的传输以文件为组织单位。虽然NAS设备常被认为是一种存储架构,但NAS设备最核心的东西实际上在存储之外,那就是文件管理服务。从功能上来看,传统NAS设备就是一个带有DAS存储的文件服务器。从数据的IO路径来看,它的数据IO发生在NAS设备内部,这种架构与DAS毫无分别。而事实上,很多NAS设备内部的文件服务模块与磁盘之间是通过SCSI总线连接的。至于通过NFS/CIFS共享文件,完全属于高层协议通信,根本就不在数据IO路径上,所以数据的传输不可能以块来组织。正是由于这种功能上的重叠,在SAN出现以后,NAS头设备(或NAS网关)逐渐发展起来,NAS over SAN的方案越来越多,NAS回归了其文件服务的本质。
由此可知,NAS与一般的应用主机在网络层次上的位置是相同的,为了在磁盘中存储数据,就必须要建立文件系统。有的NAS设备采用专有文件系统,而有的NAS设备则直接借用其操作系统支持的文件系统。由于不同的OS平台之间文件系统不兼容,所以NAS设备和客户端之间就采用通用的NFS/CIFS来共享文件。至于SAN,它提供给应用主机的就是一块未建立文件系统的“虚拟磁盘”。在上面建立什么样的文件系统,完全由主机操作系统确定。