nfs协议的rpc通信协议

原创 吴就业 124 0 2024-06-20

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/8b465b07e4b04964bc7a02b6ca2e745f

作者:吴就业
链接:https://wujiuye.com/article/8b465b07e4b04964bc7a02b6ca2e745f
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

继上篇:nfs协议,写文件流程分析,继续理解nfs协议的网络通信。

通过开源项目go-nfs-client理解nfsv3的rpc通信协议,从而知道怎么解析抓取的数据包,获取需要的信息。

nfs rpc请求:

截屏2024-06-20 18.13.48

uint32 4字节消息id
uint32 4字节消息类型(rpc请求的消息类型为0,rpc响应的消息类型为1)
Body  不定长NFS协议请求参数

nfs rpc响应:

uint32 4字节消息id
uint32 4字节消息类型(rpc请求的消息类型为0,rpc响应的消息类型为1)
uint32 4字节rpc状态码
如果rpc状态码为0
{
  uint32 4字节填充,没有意义
  uint32 4字节响应参数偏移量,需要跳过:res.Seek(偏移量, io.SeekCurrent)
  ..... 被跳过的字节(长度=偏移量)
  uint32 4字节rpc响应状态码,如果0为成功,其它为失败
  Body 不定长度NFS协议响应参数
}
否则
{
  uint32 4字节rpc拒绝状态码
}

nfs rpc的请求Body不只有请求参数,还有请求头,这是不同于响应Body的地方。请求头用来标识请求的是哪个操作等信息。

截屏2024-06-20 18.13.17

nfs协议通用请求头:

uint32 4字节RPC版本号。
uint32 4字节NFS程序的标识符。100003表示使用的是NFS版本3的程序标识符。
uint32 4字节NFS程序的版本号。3表示使用的是NFS版本3。
uint32 4字节NFS程序中的具体过程(操作)。例如3表示执行的是LOOKUP操作、7为WRITE操作、8为CREATE操作等,NFS协议文档有提供具体操作的值。
{
    uint32 4字节身份验证的类型或方式。不同的Flavor值对应不同的身份验证机制,例如UNIX认证、Kerberos认证等。
    []byte 不定长度的身份验证的具体内容或数据。它是一个字节切片([]byte),用于存储身份验证所需的数据。具体的内容和格式取决于所使用的身份验证机制和Flavor值。
} Cred 客户端的身份验证信息。
{
    uint32 4字节身份验证的类型或方式。不同的Flavor值对应不同的身份验证机制,例如UNIX认证、Kerberos认证等。
    []byte 不定长度的身份验证的具体内容或数据。它是一个字节切片([]byte),用于存储身份验证所需的数据。具体的内容和格式取决于所使用的身份验证机制和Flavor值。
} Verf 验证信息。rpc.AuthNull表示使用的是空验证。

验证信息Auth结构体如下:

type Auth struct {
    Flavor uint32
    Body   []byte
}

通常Verf为Null,这种情况下Auth结构体的Flavor为0,整个结构体大小为4个字节。

通常Cred为UNIX,这种情况下Auth结构体的Flavor为1,Body如下:

uint32 4字节客户端时间戳(纳秒)
string 不定长,表示客户端机器名称或主机名
uint32 4字节用户id
uint32 4字节用户组id
uint32 4字节表示附加组ID(Additional Group ID)的数量
uint32 4字节表示附加组ID的列表

rpc请求的Body在header之后就是具体操作的请求参数了。

从rpc请求头和Body请求头大部分字段都能知道长度,但是UNIX验证信息表示客户端机器名称或主机名的字段是个字符串,那么服务端反序列化怎么知道长度是多少呢?

这就要说到xdr编解码协议了,nfs的rpc协议采用xdr编解码协议来编解码数据包。

在xdr中,对于不固定长度的字段,通常会在序列化时在字段前面添加一个固定长度的字段来表示实际数据的长度。这个长度字段通常是一个整数,用于指示后续数据的长度。

我们也可以直接用github.com/rasky/go-xdr库来编解码数据包。


这里有一篇文章介绍的更专业一点(linux nfs NetworkTracing),介绍了nfs协议的rpc请求头、rpc请求、rpc响应,可以看看。

截屏2024-06-21 18.29.11

#网络

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

解决http event stream一直卡到最后一个消息才一次性返回

我在用http event stream实现类似ChatGPT的打字机效果时遇到了这个问题:浏览器打开debug模式,看http event stream请求,EventStream直到最后一个消息发完才一直显示完所有消息。并不是请求失败,也不是没有响应,只是看起来像是卡住了,一直等到响应的数据全部接收完才一次性的回调onmessage方法。

NFS协议RPC通信数据包解码发现头4个字节不知道是什么?

当我们抓包并写代码解码的过程中发现,我们解码每个TCP数据包,无论是rpc请求还是rpc响应,都是要先跳过前四个字节,才是rpc协议的消息id,这样解码才正确,为什么呢?

nfs协议,写文件流程分析

理解nfsv3协议的打开一个文件写和创建一个文件写的流程,以及相关操作的协议的理解、请求和响应的结构体的理解。

tcpdump抓包分析实战-学习网络问题排查必备技能-抓包分析,附多个案例讲解

了解网络协议、学会利用tcpdump抓包,学会利用Wireshark分析数据包,将能帮助我们解决一些仅从客户端日记分析或仅从服务端日记分析无法解决的疑难杂症。本篇结合笔者经历的一些实战案例,带大家掌握网络问题排查必备技能:tcpdump抓包分析。

tcpdump抓包分析实战-客户端接收到网关响应的body是空的

只因请求头deviceId多了一个‘\n’导致,服务端接收到的body是空的。

带宽问题排查实战-记一次线上文件下载慢问题排查

上传的文件是仅办公网络可访问,办法室网络有带宽限制,一个页面加载上百张图片,很容易达到带宽限制,所以出现下载很慢。