Wireshark网络分析就这么简单——NFS
本文引用部分为从原书中摘抄或者整理改写的部分
在正式阅读之前———NFS解释
什么是NFS
NFS(Network File System)顾名思义,就是网络文件系统,最大的功能就是可以通过网络,在不同的机器,不同的操作系统共享彼此的文件。
在使用上,可以将远程服务器上的目录挂载到客户端的文件系统中,在使用上像一个本地磁盘,非常方便。
挂载原理
可以用一张图比较直白的说明
客户端连接NFS中间发生了什么?
- 客户端向服务器的portmap(RPC服务)进程询问端口号,portmap维护一张进程与端口号的对应关系表,而portmap的端口号111是已知的(NFS的端口号默认为2049,所以其实这部有时候可以跳过portmap直接连接NFS)
- 客户端尝试连接NFS进程判断是否能够成功连接(没有被防火墙拦截,确保NFS服务已经启动)
- 客户端再次询问portmap,询问mount进程的端口号(mount进程端口号比较随机,所以改步询问不能跳过)
- 客户端尝试连接mount进程判断是否能够成功连接(没有被防火墙拦截,确保mount进程已经启动)
- 挂载目录。挂载成功后,服务器将该目录的file handle告诉客户端
- 再次测试NFS进程(这一步是否有必要?从询问mount到挂载目录NFS是否有挂掉的可能?)
- 客户端获得了该文件系统的大小和使用率等属性
NFS的安全机制
访问控制
- 通过IP地址实现,哪些IP允许读写,哪些IP允许读,哪些IP不允许挂载。
用户权限
- NFS只认UID不认用户名,由于用户名与UID的对应关系是由/etc/passwd来决定的,所以如果passwd不对应会造成用户名及owner显示不同的情况出现。
NFS读写过程
NFS读过程
- 客户端校验是否能进入某目录,服务器同意请求
- 客户端请求获取文件以及File Handle,服务器返回客户端需要的信息(NFS操作文件用的是file handle)
- 客户端请求服务器获取目标文件属性
- 客户端请求打开打开文件,重复发起多个READ Call(等上一个READ Call收到回复后发送),直到读完整个文件。
在高性能环境下需要手动指定每次READ Call发送的数据大小mount -o rsize=num server:path
NFS写过程
- 客户端校验是否能进入某目录,服务器同意请求
- 校验文件是否存在,如果存在会询问是否覆盖源文件
- 客户端请求创建文件,服务器创建完返回file Handle
- 开始多次写入
async写入时,在WRITE Call之后就会回复WRITE Reply,实际上存盘操作未完成,只有在commit操作时才会有
sync写入,WRITE Call与WRITE Replay交替出现,必须等到WRITE Call收到Replay之后才会发送下一个
wsize限制发送的长度- commit操作,询问服务器是否已经保存
- 客户端申请查看文件属性
noac参数
使用noac参数发现了明显的性能下降问题,在RFC中有说明,noac让客户端不缓存文件属性,并没有进一步的说明。经过抓包可以分析出原因。
- 写性能
- noac把写操作强制变成了sync方式,所以导致性能下降。
- 读性能
- 开启noac后,客户端平凡通过GETATTR查询文件属性,所以读性能也受到了影响。