NFS文件系统

NFS(Network File System,网络文件系统)最初由SUN公司于20世纪80年代设计,一种典型的基于网络的文件系统。它提供了在网络内各个设备对于共享文件操作的方式,如某一FAT文件系统物理上是存放在其他设备上的,某设备可以通过挂载这个FAT文件系统,使该系统就像是存放在本地设备上的。用户可以不加区别地对本地和非本地文件进行操作。在TCP/IP标准协议集的基础上,NFS通过一系列协议建立在TCP/IP网络环境内的文件公共享。它在提供了有效的文件共享的同时,保证了数据安全和完整性。NFS允许授权的用户对在网络中的各种文件进行操作包括读、写和执行等。另外,基于远程过程调用(remote procedure call,RPC),NFS的实现相对不依赖与存储设备、操作系统、网络结构、网络传输协议等,具有很广泛的适用性。

NFS通信协议

NFS的通信协议以RPC为基础操作方式。远程过程调用RPC是指调用远处非本地的过程,它提供了一个设备可以对在其他设备上运行的进程进行过程调用。

RPC是基于申请/答复方式工作的,所以有两种类型的RPC:申请(request)用以调用远端的一个进程;回复(reply),用以答复对应的调用。所有的RPC包都有一个交换识别号(exchange identifier, XID)用以将RPC的申请和答复相对应。

RPC包格式

一个RPC的过程调用请求报文的格式大致如下:

nfs 写入fstab nfs 文件_nfs 写入fstab

  • XID  (4字节)这是一个RPC报文的编号,每次递增1。
  • Message Type(4字节) 这是RPC报文的类型。RPC报文分为两种:请求消息用0表示,应答消息用1表示。上图是RPC请求报文的结构。
  • RPC Version (4字节)这是RPC协议本身的版本编号,目前通用的是版本2。
  • Program(4字节) 这是RPC程序编号。比如请求的是NFS服务,则这个字段为100003。
  • Version (4字节)这是RPC程序版本。比如请求的是NFSV2,则这个字段为2。
  • Procedure(4字节) 这是RPC例程编号。比如请求删除一个文件,则这个字段为10。
  • Credentials(多字节) 这是包含了用户信息,供服务器进行验证。RPC支持多种认证方式,不同认证方式中这个字段的内容不同。
  • Verifier (多字节)这是认证信息的验证值,这个字段也跟认证方式有关

 wireshark抓包查看

nfs 写入fstab nfs 文件_nfs 写入fstab_02

一个RPC的过程调用应答报文的格式大致如下:

nfs 写入fstab nfs 文件_nfs 写入fstab_03

  • XID (四字节):这是RPC报文的编号,取值与请求报文中的XID一致,客户端靠这个字段分配应答消息对应哪次RPC请求。
  • Message Type (四字节):RPC消息类型,这里取值为1,表示应答消息。
  • Reply State(四字节): 是一个应答标志。当服务器端接收到RPC请求后会对报文格式进行检查,如果格式正确,是一个有效的RPC请求,则将Reply State设置为0,表示格式正确。
  • Verifier (多字节):服务器端会解析RPC请求消息中的用户信息,对用户进行验证,根据结果填写Verifier字段,这个字段中包含了身份验证后的信息,这个字段和认证类型有关。
  • Accept State(四字节): 这个字段表示服务器是否可以处理一个RPC请求,假如服务器不支持NFS服务,那么当接收到一个Program为100003的RPC消息后,就会拒绝这个请求。如果服务器中包含RPC消息中请求的处理程序,则接收这个请求。0表示接收请求,其他值表示不接收请求。

 wireshark抓包查看

 

nfs 写入fstab nfs 文件_nfs 写入fstab_04

NFS包格式 

NFS请求包格式:

+-----+--------------+--------+-----------+-----------+-----------+--
| tag | minorversion | numops | op + args | op + args | op + args |
+-----+--------------+--------+-----------+-----------+-----------+--
  • tag(多字节):自定义,但是应答报文中和请求报文中的tag值应该相同。
  • minorversion (四字节):次要版本号
  • numops (四字节):请求命令的个数
  • op + args(定长不同的命令长度不同):请求命令和参数

wireshark 抓包查看格式:

nfs 写入fstab nfs 文件_文件系统_05

 NFS应答包格式:

+------------+-----+--------+-----------------------+--
 |last status | tag | numres | status + op + results |
 +------------+-----+--------+-----------------------+--
  • last status(四字节):状态码
  • tag (四字节):同请求中tag
  • numres (四字节):响应的个数
  • status + op + results(不定长):请求码和响应结果

抓包查看报文格式:

nfs 写入fstab nfs 文件_字段_06

 具体详细格式参阅:RFC3530