<?xml version='1.0' encoding='ascii'?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes" ?>
<?rfc tocdepth="2" ?
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes" ?>
<?rfc iprnotified="no" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc category="std" ipr="trust200902" docName="draft-ietf-nfsv4-rpcrdma-bidirection-05" obsoletes="" updates="" submissionType="IETF" xml:lang="en">
  <front>
    <title abbrev="Bidirectional RPC-over-RDMA">Bi-directional Remote Procedure Call On RPC-over-RDMA Transports </title>
    <author initials="C.E.L." surname="Lever" fullname="Charles Lever">
      <organization abbrev="Oracle">Oracle Corporation </organization>
      <address>
        <postal>
          <street>1015 Granger Avenue</street>
          <city>Ann Arbor</city>
          <region>MI</region>
          <code>48104</code>
          <country>USA</country>
        </postal>
        <phone>+1 734 274 2396</phone>
        <email>chuck.lever@oracle.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup>Network File System Version 4</workgroup>
    <keyword>NFS-Over-RDMA</keyword>
    <abstract>
      <t>Minor versions of NFSv4 newer than NFSv4.0 work best when ONC RPC transports can send Remote Procedure Call transactions in both directions on the same connection.  This document describes how RPC-over-RDMA transport endpoints convey RPCs in both directions on a single connection.  </t>
    </abstract>
  </front>
  <middle>
    <section title="Introduction" toc="default">
      <t>The purpose of this document is to enable concurrent operation in both directions on a single transport connection using RPC-over-RDMA protocol versions that do not have specific facilities for backward direction operation.  </t>
      <t>Backward direction RPC transactions are necessary for the operation of NFSv4.1, and in particular, of pNFS, though any Upper Layer Protocol implementation may make use of them.  An Upper Layer Binding for NFSv4.x callback operation is additionally required (see <xref target="considerations-for-upper-layer-binding" pageno="false" format="default"/>), but is not provided in this document.  </t>
      <t>For example, using the approach described herein, RPC transactions can be conveyed in both directions on the same RPC-over-RDMA Version One connection without changes to the the XDR description of RPC-over-RDMA Version One.  This document does not modify the XDR or protocol described in <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/>.  Future versions of RPC-over-RDMA may adopt the approach described herein, or may replace it with a different approach.  </t>
      <section title="Requirements Language" toc="default">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119" pageno="false" format="default"/>.  </t>
      </section>
    </section>
    <section title="Understanding RPC Direction" toc="default">
      <t>The ONC RPC protocol as described in <xref target="RFC5531" pageno="false" format="default"/> is architected as a message-passing protocol between one server and one or more clients.  ONC RPC transactions are made up of two types of messages.  </t>
      <t>A CALL message, or "Call", requests work. A Call is designated by the value CALL in the message's msg_type field. An arbitrary unique value is placed in the message's xid field. A host that originates a Call is referred to in this document as a "Requester." </t>
      <t>A REPLY message, or "Reply", reports the results of work requested by a Call. A Reply is designated by the value REPLY in the message's msg_type field. The value contained in the message's xid field is copied from the Call whose results are being returned. A host that emits a Reply is referred to as a "Responder." </t>
      <t>Typically, a Call results in a corresponding Reply.  A Reply is never sent without a corresponding Call.  </t>
      <t>RPC-over-RDMA is a connection-oriented RPC transport.  In all cases, when a connection-oriented transport is used, ONC RPC client endpoints are responsible for initiating transport connections, while ONC RPC service endpoints passively await incoming connection requests.  </t>
      <t>RPC direction on connectionless RPC transports is not addressed in this document.  </t>
      <section title="Forward Direction" toc="default">
        <t>Traditionally, an ONC RPC client acts as a Requester, while an ONC RPC service acts as a Responder.  This form of message passing is referred to as "forward direction" operation.  </t>
      </section>
      <section title="Backward Direction" toc="default">
        <t>The ONC RPC specification <xref target="RFC5531" pageno="false" format="default"/> does not forbid passing messages in the other direction.  An ONC RPC service endpoint can act as a Requester, in which case an ONC RPC client endpoint acts as a Responder.  This form of message passing is referred to as "backward direction" operation.  </t>
        <t>During backward direction operation, the ONC RPC client is responsible for establishing transport connections, even though ONC RPC Calls come from the ONC RPC server.  </t>
        <t>ONC RPC clients and services are optimized to perform and scale well while handling traffic in the forward direction, and may not be prepared to handle operation in the backward direction.  Not until NFSv4.1 <xref target="RFC5661" pageno="false" format="default"/> has there been a strong need to handle backward direction operation.  </t>
      </section>
      <section title="Bi-directional Operation" toc="default">
        <t>A pair of connected RPC endpoints may choose to use only forward or only backward direction operations on a particular transport.  Or, these endpoints may send Calls in both directions concurrently on the same transport.  </t>
        <t>"Bi-directional operation" occurs when both transport endpoints act as a Requester and a Responder at the same time.  </t>
        <t>Bi-directionality is an extension of RPC transport connection sharing.  Two RPC endpoints wish to exchange independent RPC messages over a shared connection, but in opposite directions.  These messages may or may not be related to the same workloads or RPC Programs.  </t>
      </section>
      <section title="XID Values" anchor="xid" toc="default">
        <t>Section 9 of <xref target="RFC5531" pageno="false" format="default"/> introduces the ONC RPC transaction identifier, or "xid" for short.  The value of an xid is interpreted in the context of the message's msg_type field.  <list style="symbols"><t>The xid of a Call is arbitrary but is unique among outstanding Calls from that Requester.  </t><t>The xid of a Reply always matches that of the initiating Call.  </t></list> </t>
        <t>When receiving a Reply, a Requester matches the xid value in the Reply with a Call it previously sent.  </t>
        <section title="XID Generation" toc="default">
          <t>During bi-directional operation, forward and backward direction XIDs are typically generated on distinct hosts by possibly different algorithms.  There is no co-ordination between forward and backward direction XID generation.  </t>
          <t>Therefore, a forward direction Requester MAY use the same xid value at the same time as a backward direction Requester on the same transport connection. Though such concurrent requests use the same xid value, they represent distinct ONC RPC transactions.  </t>
        </section>
      </section>
    </section>
    <section title="Immediate Uses Of Bi-Directional RPC-over-RDMA" toc="default">
      <section title="NFSv4.0 Callback Operation" toc="default">
        <t>An NFSv4.0 client employs a traditional ONC RPC client to send NFS requests to an NFSv4.0 server's traditional ONC RPC service <xref target="RFC7530" pageno="false" format="default"/>. NFSv4.0 requests flow in the forward direction on a connection established by the client. This connection is referred to as a "forechannel" connection.  </t>
        <t>An NFSv4 "delegation" is simply a promise made by a server that it will notify a client before another client or program running on the server is allowed access to a file.  With this guarantee, that client can operate as sole accessor of the file.  In particular, it can manage the file's data and metadata caches aggressively.  </t>
        <t>To administer file delegations, NFSv4.0 introduces the use of callback operations, or "callbacks", in Section 10.2 of <xref target="RFC7530" pageno="false" format="default"/>.  An NFSv4.0 server sets up a traditional ONC RPC client, and an NFSv4.0 client sets up a traditional ONC RPC service.  Callbacks flow in the forward direction on a connection established between the server's callback client, and the client's callback server.  This connection is distinct from connections being used as forechannels, and is referred to as a "backchannel connection." </t>
        <t>When an RDMA transport is used as a forechannel, an NFSv4.0 client typically provides a TCP callback service. The client's SETCLIENTID operation advertises the callback service endpoint with a "tcp" or "tcp6" netid. The server then connects to this service using a TCP socket.  </t>
        <t>NFSv4.0 implementations can function without a backchannel in place.  In this case, the server does not grant file delegations.  This might result in a negative performance effect, but correctness is not affected.  </t>
      </section>
      <section title="NFSv4.1 Callback Operation" toc="default">
        <t>NFSv4.1 supports file delegation in a similar fashion to NFSv4.0, and extends the callback mechanism to manage pNFS layouts, as discussed in Section 12 of <xref target="RFC5661" pageno="false" format="default"/>.  </t>
        <t>To facilitate operation through NAT routers, all NFSv4.1 transport connections are initiated by NFSv4.1 clients.  Therefore NFSv4.1 servers send callbacks to clients in the backward direction on connections established by NFSv4.1 clients.  </t>
        <t>NFSv4.1 clients and servers indicate to their peers that a backchannel capability is available on a given transport in the arguments and results of NFS CREATE_SESSION or BIND_CONN_TO_SESSION operations.  </t>
        <t>NFSv4.1 clients may establish distinct transport connections for forechannel and backchannel operation, or they may combine forechannel and backchannel operation on one transport connection using bi-directional operation.  </t>
        <t>Without a backward direction RPC-over-RDMA capability, an NFSv4.1 client must additionally connect using a transport with backward direction capability to use as a backchannel.  TCP is the only choice for an NFSv4.1 backchannel connection in this case.  </t>
        <t>Implementations often find it more convenient to use a single combined transport (ie. a transport that is capable of bi-directional operation). This simplifies connection establishment and recovery during network partitions or when one endpoint restarts.  This can also enable better scaling by using fewer transport connections to perform the same work.  </t>
        <t>As with NFSv4.0, if a backchannel is not in use, an NFSv4.1 server does not grant delegations.  Because NFSv4.1 relies on callbacks to manage pNFS layout state, pNFS operation is not possible without a backchannel.  </t>
      </section>
    </section>
    <section title="Flow Control" anchor="credits" toc="default">
      <t>For an RDMA Send operation to work properly, the receiving peer must have posted a receive buffer in which to accept the incoming message.  If a receiver hasn't posted enough buffers to accommodate each incoming Send operation, the receiving RDMA provider is allowed to terminate the RDMA connection.  </t>
      <t>RPC-over-RDMA transport protocols provide built-in send flow control to prevent overrunning the number of pre-posted receive buffers on a connection's receive endpoint. For RPC-over-RDMA Version One, this is discussed in Section 4.3 of <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/>.  </t>
      <section title="Backward Credits" toc="default">
        <t>RPC-over-RDMA credits work the same way in the backward direction as they do in the forward direction.  However, forward direction credits and backward direction credits on the same connection are accounted separately.  </t>
        <t>The forward direction credit value retains the same meaning whether or not there are backward direction resources associated with an RPC-over-RDMA transport connection.  This is the number of RPC requests the forward direction responder (the RPC server) is prepared to receive concurrently.  </t>
        <t>The backward direction credit value is the number of RPC requests the backward direction responder (the RPC client) is prepared to receive concurrently.  The backward direction credit value MAY be different than the forward direction credit value.  </t>
        <t>During bi-directional operation, each receiver has to decide whether an incoming message contains a credit request (the receiver is acting as a responder) or a credit grant (the receiver is acting as a requester) and apply the credit value accordingly.  </t>
        <t>When message direction is not fully determined by context (e.g., suggested by the definition of the RPC-over-RDMA version that is in use) or by an accompanying RPC message payload with a call direction field, it is not possible for the receiver to tell with certainty whether the header credit value is a request or grant.  In such cases, the receiver MUST NOT use the header's credit value.  </t>
      </section>
      <section title="Inline Thresholds" toc="default">
        <t>Forward and backward operation on the same connection share the same receive buffers.  Therefore the inline threshold values for the forward direction and the backward direction are the same.  The call inline threshold for the backward direction is the same as the reply inline threshold for the forward direction, and vice versa.  For more information, see Section 4.3.2 of <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/>.  </t>
      </section>
      <section title="Managing Receive Buffers" toc="default">
        <t>An RPC-over-RDMA transport endpoint must pre-post receive buffers before it can receive and process incoming RPC-over-RDMA messages. If a sender transmits a message for a receiver which has no posted receive buffer, the RDMA provider is allowed to drop the RDMA connection.  </t>
        <section title="Client Receive Buffers" toc="default">
          <t>Typically an RPC-over-RDMA Requester posts only as many receive buffers as there are outstanding RPC Calls.  A client endpoint without backward direction support might therefore at times have no pre-posted receive buffers.  </t>
          <t>To receive incoming backward direction Calls, an RPC-over-RDMA client endpoint must pre-post enough additional receive buffers to match its advertised backward direction credit value. Each outstanding forward direction RPC requires an additional receive buffer above this minimum.  </t>
          <t>When an RDMA transport connection is lost, all active receive buffers are flushed and are no longer available to receive incoming messages. When a fresh transport connection is established, a client endpoint must re-post a receive buffer to handle the Reply for each retransmitted forward direction Call, and a full set of receive buffers to handle backward direction Calls.  </t>
        </section>
        <section title="Server Receive Buffers" toc="default">
          <t>A forward direction RPC-over-RDMA service endpoint posts as many receive buffers as it expects incoming forward direction Calls. That is, it posts no fewer buffers than the number of credits granted in the rdma_credit field of forward direction RPC replies.  </t>
          <t>To receive incoming backward direction replies, an RPC-over-RDMA server endpoint must pre-post a receive buffer for each backward direction Call it sends.  </t>
          <t>When the existing transport connection is lost, all active receive buffers are flushed and are no longer available to receive incoming messages. When a fresh transport connection is established, a server endpoint must re-post a receive buffer to handle the Reply for each retransmitted backward direction Call, and a full set of receive buffers for receiving forward direction Calls.  </t>
        </section>
      </section>
    </section>
    <section title="Sending And Receiving Backward Operations" toc="default">
      <t>The operation of RPC-over-RDMA transports in the forward direction is defined in <xref target="RFC5531" pageno="false" format="default"/> and <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/>.  In this section, a mechanism for backward direction operation on RPC-over-RDMA is defined.  Backward operation used in combination with forward operation enables bi-directional communication on a common RPC transport connection.  </t>
      <t>Certain fields in the RPC-over-RDMA header are fixed for all versions of RPC-over-RDMA.  The XDR description of these fields is contained in Section 5.1 of <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/>.  </t>
      <section title="Sending A Backward Direction Call" toc="default">
        <t>To form a backward direction RPC-over-RDMA Call message, an ONC RPC service endpoint constructs an RPC-over-RDMA header containing a fresh RPC XID in the rdma_xid field (see <xref target="xid" pageno="false" format="default"/> for full requirements).  </t>
        <t>The rdma_vers field MUST contain the same value in backward and forward direction Call messages on the same connection.  </t>
        <t>The number of requested backward direction credits is placed in the rdma_credit field (see <xref target="credits" pageno="false" format="default"/>).  </t>
        <t>Whether presented inline or as a separate chunk, the ONC RPC Call header MUST start with the same XID value that is present in the RPC-over-RDMA header, and the RPC header's msg_type field MUST contain the value CALL.  </t>
      </section>
      <section title="Sending A Backward Direction Reply" toc="default">
        <t>To form a backward direction RPC-over-RDMA Reply message, an ONC RPC client endpoint constructs an RPC-over-RDMA header containing a copy of the matching ONC RPC Call's RPC XID in the rdma_xid field (see <xref target="xid" pageno="false" format="default"/> for full requirements).  </t>
        <t>The rdma_vers field MUST contain the same value in a backward direction Reply message as in the matching Call message.  </t>
        <t>The number of granted backward direction credits is placed in the rdma_credit field (see <xref target="credits" pageno="false" format="default"/>).  </t>
        <t>Whether presented inline or as a separate chunk, the ONC RPC Reply header MUST start with the same XID value that is present in the RPC-over-RDMA header, and the RPC header's msg_type field MUST contain the value REPLY.  </t>
      </section>
      <section title="Backward Direction Chunks" toc="default">
        <t>Chunks MAY be used in the backward direction.  They operate the same way as in the forward direction (see <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/> for details).  </t>
        <t>An implementation might not support any Upper Layer Protocol that has DDP-eligible data items.  The Upper Layer Protocol may also use only small messages, or it may have a native mechanism for restricting the size of backward direction RPC messages, obviating the need to handle Long Messages in the backward direction.  </t>
        <t>When there is no Upper Layer Protocol requirement for chunks, implementers can choose not to provide support for chunks in the backward direction.  This avoids the complexity of adding support for performing RDMA Reads and Writes in the backward direction.  </t>
        <t>When chunks are not implemented, RPC messages in the backward direction are always sent using RDMA_MSG, and therefore can be no larger than what can be sent inline (that is, without chunks).  Sending an inline message larger than the inline threshold can result in loss of connection.  </t>
        <t>If a backward direction requester provides a non-empty chunk list to a responder that does not support chunks, the responder MUST reply with an RDMA_ERROR message with rdma_err field set to ERR_CHUNK.  </t>
      </section>
      <section title="Backward Direction Retransmission" toc="default">
        <t>In rare cases, an ONC RPC transaction cannot be completed within a certain time. This can be because the transport connection was lost, the Call or Reply message was dropped, or because the Upper Layer consumer delayed or dropped the ONC RPC request.  Typically, the Requester sends the transaction again, reusing the same RPC XID. This is known as an "RPC retransmission".  </t>
        <t>In the forward direction, the Requester is the ONC RPC client. The client is always responsible for establishing a transport connection before sending again.  </t>
        <t>In the backward direction, the Requester is the ONC RPC server. Because an ONC RPC server does not establish transport connections with clients, it cannot send a retransmission if there is no transport connection.  It must wait for the ONC RPC client to re-establish the transport connection before it can retransmit ONC RPC transactions in the backward direction.  </t>
        <t>If an ONC RPC client has no work to do, it may be some time before it re-establishes a transport connection. Backward direction Requesters must be prepared to wait indefinitely for a connection to be established before a pending backward direction ONC RPC Call can be retransmitted.  </t>
        <t>Forward direction Requesters are responsible for maintaining a transport connection as long as there is the possibility of backward direction requests.  For example, an NFSv4.1 client with open delegated files or active pNFS layouts should maintain a transport connection so the server can send callback operations.  </t>
      </section>
    </section>
    <section title="In the Absence of Backward Direction Support" toc="default">
      <t>An RPC-over-RDMA transport endpoint might not support backward direction operation (and thus bi-directional operation).  There might be no mechanism in the transport implementation to do so.  Or in an implementation that can support operation in the backward direction, the Upper Layer Protocol consumer might not yet have configured or enabled the transport to handle backward direction traffic.  </t>
      <t>If an endpoint is not prepared to receive an incoming backward direction message, loss of the RDMA connection might result.  Thus denial of service could result if a sender continues to send backward direction messages after every transport reconnect to an endpoint that is not prepared to receive them.  </t>
      <t>When dealing with the possibility that the remote peer has no transport level support for backward direction operation, the Upper Layer Protocol becomes responsible for informing peers when backward direction operation is supported.  Otherwise even a simple backward direction NULL probe from a peer could result in a lost connection.  </t>
      <t>Therefore, an Upper Layer Protocol consumer MUST NOT perform backward direction ONC RPC operations unless the peer consumer has indicated it is prepared to handle them. A description of Upper Layer Protocol mechanisms used for this indication is outside the scope of this document.  </t>
      <t>For example, an NFSv4.1 server does not send backchannel messages to an NFSv4.1 client before the NFSv4.1 client has sent a CREATE_SESSION or a BIND_CONN_TO_SESSION operation. As long as an NFSv4.1 client has prepared appropriate backchannel resources before sending one of these operations announcing support for backchannel operation, denial of service is avoided.  </t>
    </section>
    <section title="Considerations For Upper Layer Bindings" anchor="considerations-for-upper-layer-binding" toc="default">
      <t>An Upper Layer Protocol that operates on RPC-over-RDMA transports may have procedures that include DDP-eligible data items.  DDP-eligibility is specified in an Upper Layer Binding.  Direction of operation does not obviate the need for DDP-eligibility statements.  </t>
      <t>Backward-only operation requires the client endpoint to establish a fresh connection.  The Upper Layer Binding can specify appropriate RPC binding parameters for such connections.  </t>
      <t>Bi-directional operation occurs on an already-established connection.  Specification of RPC binding parameters is usually not necessary in this case.  </t>
      <t>For bi-directional operation, other considerations about sharing an RPC-over-RDMA transport with another ULP may apply.  Consult Section 7 of <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/> for details about what else may be contained in an Upper Layer Binding.  </t>
    </section>
    <section title="Security Considerations" toc="default">
      <t>Security considerations for operation on RPC-over-RDMA transports are outlined in Section 9 of <xref target="I-D.ietf-nfsv4-rfc5666bis" pageno="false" format="default"/>.  </t>
    </section>
    <section title="IANA Considerations" toc="default">
      <t>This document does not require actions by IANA.  </t>
    </section>
    <section title="Acknowledgements" toc="default">
      <t>Tom Talpey was an indispensable resource, in addition to creating the foundation upon which this work is based. Our warmest regards go to him for his help and support.  </t>
      <t>Dave Noveck provided excellent review, constructive suggestions, and navigational guidance throughout the process of drafting this document.  </t>
      <t>Dai Ngo was a solid partner and collaborator. Together we constructed and tested independent prototypes of the changes described in this document.  </t>
      <t>The author wishes to thank Bill Baker for his unwavering support of this work. In addition, the author gratefully acknowledges the expert contributions of Karen Deitke, Chunli Zhang, Mahesh Siddheshwar, Steve Wise, and Tom Tucker.  </t>
      <t>Special thanks go to the nfsv4 Working Group Chair Spencer Shepler and the nfsv4 Working Group Secretary Tom Haynes for their support.  </t>
    </section>
  </middle>
  <back>
    <references title="Normative References">
      <reference anchor="I-D.ietf-nfsv4-rfc5666bis">
        <front>
          <title>Remote Direct Memory Access Transport for Remote Procedure Call</title>
          <author initials="C" surname="Lever" fullname="Chuck Lever">
            <organization/>
          </author>
          <author initials="W" surname="Simpson" fullname="William Simpson">
            <organization/>
          </author>
          <author initials="T" surname="Talpey" fullname="Tom Talpey">
            <organization/>
          </author>
          <date month="March" day="4" year="2016"/>
          <abstract>
            <t>This document specifies a protocol for conveying Remote Procedure Call (RPC) messages on physical transports capable of Remote Direct Memory Access (RDMA).  It requires no revision to application RPC protocols or the RPC protocol itself.  This document obsoletes RFC 5666.</t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-nfsv4-rfc5666bis-04"/>
        <format type="TXT" target="http://www.ietf.org/internet-drafts/draft-ietf-nfsv4-rfc5666bis-04.txt"/>
        <format type="PS" target="http://www.ietf.org/internet-drafts/draft-ietf-nfsv4-rfc5666bis-04.ps"/>
        <format type="PDF" target="http://www.ietf.org/internet-drafts/draft-ietf-nfsv4-rfc5666bis-04.pdf"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title abbrev="RFC Key Words">Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="Scott Bradner">
            <organization>Harvard University</organization>
            <address>
              <postal>
                <street>1350 Mass. Ave.</street>
                <street>Cambridge</street>
                <street>MA 02138</street>
              </postal>
              <phone>- +1 617 495 3864</phone>
              <email>sob@harvard.edu</email>
            </address>
          </author>
          <date year="1997" month="March"/>
          <area>General</area>
          <keyword>keyword</keyword>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized.  This document defines these words as they should be interpreted in IETF documents.  Authors who follow these guidelines should incorporate this phrase near the beginning of their document: <list><t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.  </t></list></t>
            <t>Note that the force of these words is modified by the requirement level of the document in which they are used.  </t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <format type="TXT" octets="4723" target="ftp://ftp.isi.edu/in-notes/rfc2119.txt"/>
        <format type="HTML" octets="17491" target="http://xml.resource.org/public/rfc/html/rfc2119.html"/>
        <format type="XML" octets="5777" target="http://xml.resource.org/public/rfc/xml/rfc2119.xml"/>
      </reference>
      <reference anchor="RFC5531">
        <front>
          <title>RPC: Remote Procedure Call Protocol Specification Version 2</title>
          <author initials="R." surname="Thurlow" fullname="R. Thurlow">
            <organization/>
          </author>
          <date year="2009" month="May"/>
          <abstract>
            <t>This document describes the Open Network Computing (ONC) Remote Procedure Call (RPC) version 2 protocol as it is currently deployed and accepted.  This document obsoletes RFC 1831. [STANDARDS TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5531"/>
        <format type="TXT" octets="161720" target="ftp://ftp.isi.edu/in-notes/rfc5531.txt"/>
      </reference>
      <reference anchor="RFC5661">
        <front>
          <title>Network File System (NFS) Version 4 Minor Version 1 Protocol</title>
          <author initials="S." surname="Shepler" fullname="S. Shepler">
            <organization/>
          </author>
          <author initials="M." surname="Eisler" fullname="M. Eisler">
            <organization/>
          </author>
          <author initials="D." surname="Noveck" fullname="D. Noveck">
            <organization/>
          </author>
          <date year="2010" month="January"/>
          <abstract>
            <t>This document describes the Network File System (NFS) version 4 minor version 1, including features retained from the base protocol (NFS version 4 minor version 0, which is specified in RFC 3530) and protocol extensions made subsequently.  Major extensions introduced in NFS version 4 minor version 1 include Sessions, Directory Delegations, and parallel NFS (pNFS).  NFS version 4 minor version 1 has no dependencies on NFS version 4 minor version 0, and it is considered a separate protocol.  Thus, this document neither updates nor obsoletes RFC 3530.  NFS minor version 1 is deemed superior to NFS minor version 0 with no loss of functionality, and its use is preferred over version 0.  Both NFS minor versions 0 and 1 can be used simultaneously on the same network, between the same client and server. [STANDARDS TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5661"/>
        <format type="TXT" octets="1517771" target="http://www.rfc-editor.org/rfc/rfc5661.txt"/>
      </reference>
      <reference anchor="RFC7530">
        <front>
          <title>Network File System (NFS) Version 4 Protocol</title>
          <author initials="T." surname="Haynes" fullname="T. Haynes">
            <organization/>
          </author>
          <author initials="D." surname="Noveck" fullname="D. Noveck">
            <organization/>
          </author>
          <date year="2015" month="March"/>
          <abstract>
            <t>The Network File System (NFS) version 4 protocol is a distributed file system protocol that builds on the heritage of NFS protocol version 2 (RFC 1094) and version 3 (RFC 1813). Unlike earlier versions, the NFS version 4 protocol supports traditional file access while integrating support for file locking and the MOUNT protocol. In addition, support for strong security (and its negotiation), COMPOUND operations, client caching, and internationalization has been added. Of course, attention has been applied to making NFS version 4 operate well in an Internet environment.&lt;/t&gt;&lt;t&gt; This document, together with the companion External Data Representation (XDR) description document, RFC 7531, obsoletes RFC 3530 as the definition of the NFS version 4 protocol.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7530"/>
        <format type="TXT" octets="724613" target="http://www.rfc-editor.org/rfc/rfc7530.txt"/>
      </reference>
    </references>
  </back>
</rfc>
