NFS协议分析 - rfc1813
Introduction
NFS协议实现基于RPC(Remote Procedure Call)和XDR(eXternal Data Representation)
XDR:a standard way of representing a set of data types on a network
该文档定义了NFSv3协议;mount协议;NLM(Network Lock Manager)v3和v4的差异
NFSv3较v2的几点重要变化:
1、NFSv3协议扩展支持64位的文件和文件系统大小
2、支持异步读写
RPC Information
基本数据类型说明,包括错误码等
Server Procedures
描述了NFSv3协议下的22种操作,分别是
0 NFSPROC3_NULL
客户端连接服务端时,首先尝试test,测试连通性
1 NFSPROC3_GETATTR
客户端获取指定FH(file handle)的元数据信息
2 NFSPROC3_SETATTR
客户端设置指定FH(file handle)的元数据信息
3 NFSPROC3_LOOKUP
客户端通过路径或者文件名称查询FH,服务端返回FH和FH对应的元数据信息
4 NFSPROC3_ACCESS
客户端想要获取FH对应的权限,服务端返回是否可以获取到
5 NFSPROC3_READLINK
6 NFSPROC3_READ
客户端读取数据,发送FH、数据大小、数据偏移量到服务端。客户端等待服务端返回具体数据。
7 NFSPROC3_WRITE
客户端写入数据,发送FH、数据大小、数据偏移量、stable(FILE_SYNC(元数据和数据)、DATA_SYNC(仅数据)或者UNSTABLE),服务端负责写入数据
file_wcc是什么东西?
8 NFSPROC3_CREATE
客户端请求服务端创建一个普通文件,发送目录的FH,文件名称等参数。其中mode(One of UNCHECKED, GUARDED, and EXCLUSIVE)有待进一步研究
尤其是verifier的概念?
9 NFSPROC3_MKDIR
客户端请求服务端创建一个目录
10 NFSPROC3_SYMLINK
11 NFSPROC3_MKNOD
客户端请求创建特殊文件,比如socket,管道FIFO等,NAS业务一般不关心
12 NFSPROC3_REMOVE
客户端请求删除一个目录下的entry(文件或者目录等)
13 NFSPROC3_RMDIR
客户端请求删除一个目录
14 NFSPROC3_RENAME
15 NFSPROC3_LINK
16 NFSPROC3_READDIR
17 NFSPROC3_READDIRPLUS
18 NFSPROC3_FSSTAT
客户端获取文件系统的相关信息(volatile)如挂载点FH,文件系统总大小等,类似FSINFO
19 NFSPROC3_FSINFO
客户端获取文件系统的相关信息(novolatile)
20 NFSPROC3_PATHCONF
21 NFSPROC3_COMMIT
客户端通知服务端强制下刷之前WRITE后没有落盘的数据,Procedure COMMIT forces or flushes data to stable storage that was previously written with a WRITE procedure call with the stable field set to UNSTABLE
支持下刷文件的部分偏移量数据,即使下刷部分数据,但是该文件对应的元数据均要下刷后服务端才能返回
Implementation issues
重传请求
服务端需要解决客户端发起的多次非幂等请求(多次操作的结果不一致,如创建文件,删除文件),大多数会使用缓存最近请求的方式(called the duplicate request cache)
最近相同请求返回第一次处理的原始结果
缓存策略
详细讨论见论文:Synchronization and Caching Issues in the Andrew File System [ML Kazar]
MOUNT协议
包含消息:NULL, MNT, DUMP, UMNT, UMNTALL, EXPORT
NLM(Network Lock Manager)协议
NFSv3协议配套使用NLM version 4版本
+----------+-----------+
| NFS | NLM |
| Version | Version |
+=============+
| 2 | 1, 3 |
+----------+-----------+
| 3 | 4 |
+----------+-----------+
包含的消息有: