NFS客户端RPC请求封装过程

本文介绍了NFS客户端如何将用户操作封装为RPC请求发送给服务器,重点关注RPC相关数据结构如rpc_clnt、rpc_xprt、rpc_rqst和rpc_task,并详细讲述了RPC报文的组装过程,包括RPC报文头的编码和净荷信息的封装。
摘要由CSDN通过智能技术生成

        挂载NFS文件系统后,客户端就可以像访问本地文件一样访问服务器端的文件。NFS客户端根据RFC中的规定将用户操作封装到RPC请求报文中发送给服务器端,服务器端接收到RPC请求后进行处理,将处理结果封装到RPC应答报文中返还给客户端。这篇文章中我们讲讲客户端RPC请求报文的封装过程。LInux中RPC的代码位于net/sunrpc/中,客户端和服务器端的代码都在这个目录中。首先介绍几个数据结构,只说明每个数据结构的含义,不详细介绍数据结构中每个字段的含义。

(1) struct rpc_clnt  这个数据结构表示一个RPC客户端,客户端挂载文件系统时会创建一个nfs_server结构,表示挂载的文件系统,同时需要为这个文件系统创建一个RPC客户端,这个文件系统中所有的RPC请求都通过这个RPC客户端发送,这个客户端保存在nfs_server结构的client字段中。

(2) struct rpc_xprt  这是通过socket建立起来的一个链接,每个rpc_clnt关联一个rpc_xprt,rpc_clnt中所有的报文通过这个链接发送出去。

(3) struct rpc_rqst  这是一个RPC请求的数据结构,包含了一个RPC请求的所有信息。不仅包括RPC报文中的信息,还包括超时重发策略等控制信息,以及归属的rpc_xprt(这个请求从哪个socket链路发送出去)。

(4) struct rpc_task  这是一个RPC任务的数据结构。一个RPC请求的发送过程非常复杂,需要组装RPC报文、创建rpc_rqst、选择合适的rpc_xprt、失败后需要进行处理。因此Linux将一个RPC请求的整个处理过程作为一个RPC任务对待,每个RPC任务用一个rpc_task结构表示。由于一个RPC任务的处理比较复杂,如果处理完一个RPC任务再处理另一个RPC任务不太合适。一个RPC任务的处理过程分成了多个步骤,Linux创建了一个有限状态机,每次只处理RPC任务的一个步骤,这个步骤处理完毕后就调度其他的RPC任务。

        现在这个阶段我只想讲解NFS(因为这一部分内容已经很多了),所有关于RPC的代码全部跳过不讲,以后可能会专门开个专题讲解RPC代码,那是以后的事情了。因此这篇文章中就不讲解RPC请求的整个处理流程了,只讲解一个NFS请求是如何封装成RPC报文的。

        现将两个数据结构 rpc_procinfo和rpc_message。rpc_procinfo是一个RPC例程的数据结构,包含了RPC例程编号、编码函数和解码函数。

struct rpc_procinfo {
    // 这是RPC例程编号
        u32                     p_proc;         /* RPC procedure number */
    // 参数编码函数,这个函数负责将RPC请求中的信息封装到RPC报文中
        kxdreproc_t             p_encode;       /* XDR encode function */
    // 返回值解码函数,这个函数负责解码RPC应答报文中的信息
        kxdrdproc_t             p_decode;       /* XDR decode function */
    // 参数长度,以四字节为单位
        unsigned int            p_arglen;       /* argument hdr length (u32) */
    // 返回值长度,以四字节为单位
        unsigned int            p
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值