<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
  <!ENTITY RFC2119 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
  <!ENTITY RFC3629 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3629.xml">
  <!ENTITY RFC3986 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml">
  <!ENTITY RFC3987 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3987.xml">
  <!ENTITY RFC7230 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7230.xml">
  <!ENTITY RFC7530 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7530.xml">
  <!ENTITY SFTP SYSTEM 'https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-secsh-filexfer.xml'>
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocindent="no"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc comments="yes" ?>
<?rfc inline="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc category="bcp" docName="draft-williams-filesystem-18n-00" ipr="trust200902">
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN" 
     they will automatically be output with "(if approved)" -->

  <front>
    <title abbrev="Accept-Auth &amp; Redirect">Internationalization Considerations for Filesystems and Filesystem Protocols</title>
    <author fullname="Nico Williams" initials="N.W." surname="Williams" role="editor">
      <organization>Cryptonector, LLC</organization>
      <address>
        <postal>
          <street></street>
          <city>Austin</city>
          <region>TX</region>
          <code></code>
          <country>USA</country>
        </postal>
        <phone></phone>
        <email>nico@cryptonector.com</email>
        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>
    <date year="2020" />
    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
	 in the current day and month for you. If the year is not the current one, it is 
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to 
	 specify just the year. -->
    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.  
	 If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <keyword>Filesystem</keyword>
    <keyword>FS</keyword>
    <keyword>Internationalziation</keyword>
    <keyword>I18N</keyword>

    <abstract>
      <t>
        This document describes requirements for internationalization
        (I18N) of filesystems specifically in the context of Internet
        protocols, the architecture for filesystems in most currently
        popular general purpose operating systems, and their
        implications for filesystem I18N.  From the I18N requirements
        for filesystems and the architecture of running code we derive
        requirements and recommendations for implementors of operating
        systems and/or filesystems, as well as for Internet remote
        filesystem protocols.
      </t>
    </abstract>

  </front>

  <middle>
    <section anchor="intro" title="Introduction">
      <t>
        [TBD: Add references galore.  How to reference Unicode?  How to
        reference US-ASCII?  How best to reference HFS+?  How best to
        reference ZFS?  May have to find useful references for POSIX and
        WIN32.  Various blog entries may be of interest -- can they be
        referenced?]
      </t>

      <t>
        We, the Internet community, have long concluded that we must
        internationalize all our protocols.  This is generally not an
        easy task, as often we are constrained by the realities of what
        can be achieved while maintaining backwards compatibility.
      </t>

      <t>
        In this document we focus on filesystem internationalization
        (I18N), specifically only for file names and file paths.  Here
        we address the two main issues that arise in filesystem I18N:
        <list style="symbols">
          <t>Unicode equivalence</t>
          <t>Case foldings for case-insensitivity</t>
        </list>
      </t>

      <t>
        These two issues are different flavors of the same generic
        issue: that there can be more than one way to write text with
        the same rendering and/or semantics.
      </t>

      <t>
        Only I18N issues relating to file names and paths are addressed
        here.  In particular, I18N issues related to representations of
        user identities and groups, for use in access control lists
        (ACLs) or other authorization systems, are out of scope for this
        document.  Also out of scope here are I18N issues related to
        Uniform Resource Identifiers (URIs) <xref target="RFC3986"/> or
        Internationalized Resource Identifiers (IRIs) <xref
          target="RFC3987"/>.
      </t>

      <section anchor="rfc2119_terms" title="Requirements Language">
        <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">RFC 2119</xref>.
        </t>
      </section>

      <section anchor="intro_fs_i18n" title="Filesystem Internationalization">
        <t>
          We must address two issues:
          <list style="symbols">
            <t>Unicode equivalence</t>
            <t>Case foldings for case-insensitivity</t>
          </list>
        </t>

        <t>
          Unicode can represent certain character strings in multiple
          visually- and semantically-equivalent ways.  For example, there
          are two ways to express LATIN SMALL LETTER A WITH ACUTE
          (á):
          <list style="symbols">
            <t>U+00E1</t>
            <t>U+0061 U+0301</t>
          </list>
        </t>

        <t>
          For some glyphs there is a single way to write them.  For
          others there are two.  And for yet others there can be many more
          than two.
        </t>

        <t>
          To deal with the equivalence problem, Unicode defines Normal
          Forms (NFs), of which there are two basic ones: Normal Form
          Composed (NFC), and Normal Form Decomposed (NFD).  There are
          also NFs that use "compatibility" Foldings, NFKC and NFKD.
          Unicode-aware applications can normalize text to avoid
          ambiguities, or they can use form-insensitive string
          comparisons, or both.
        </t>

        <t>
          Some filesystems support case-insensitivity, which is trivial
          to define and implement for US-ASCII, but non-trivial for
          Unicode, requiring not only larger case-folding tables, but
          also localized case-folding tables as case-folding rules might
          differ from locale to locale.
        </t>

        <section anchor="intro_norm" title="Canonical Equivalence (Normalization)">
          <t>
            For case-sensitive filesystems, only Unicode equivalence
            issues arise as to file names and file paths.  These can be
            addressed in one of two ways:
            <list style="symbols">
              <t>normalize file names when created and when looked up,</t>
              <t>perform form-insensitive string comparisons on lookup.</t>
            </list>
          </t>

          <t>
            The first option yields normalized file names on-disk and on
            the wire (e.g., when listing directories).  We shall term this
            "normalize-on-CREATE", or sometimes
            "normalize-on-CREATE-and-LOOKUP", or even just "NoCL".
          </t>

          <t>
            The second option preserves form as originally produced by
            the user or on their behalf by their system's text input
            modes, but otherwise is form-insensitive.  That is, this
            option permits either encoding of, e.g., LATIN SMALL LETTER
            A WITH ACUTE on-disk and on the wire, but permits only one
            form of any string, whether normal or not.  We shall term
            this option "form-insensitive", or sometimes
            "form-insensitive and form-preserving", or just "FIP".
          </t>

          <t>
            Unicode compatibility equivalence allows equivalence between
            different representations of the same abstract character
            that may nonetheless have different visual appearance of
            behavior.  There are two canonical forms that support
            compatibility equivalence: NFKC and NFKD.  Using NoCL with
            NFKC or NFKD may be surprising to users in a visual way.
            While form-insensitivity with NFKC or NFKD may surprise
            users who might consider two file names distinct even when
            Unicode considers them equivalent under compatibility
            equivalence.  The latter seems less likely and less
            surprising, though that is an entirely subjective judgement.
          </t>

          <t>
            We do not recommend either of NoCL or FIP over the other.
          </t>
        </section>

        <section anchor="intro_case" title="Case Foldings for Case-Insensitivity">
          <t>
            Case-insensitivity implies folding characters of one case to
            another for comparison purposes, typically to lower-case.
            These case foldings are defined by Unicode.  Generally,
            case-insensitive filesystems preserve original case just
            form-insensitive filesystems preserve original form.
          </t>

          <t>
            It is possible that some case foldings may have to vary by
            locale.  A commonly used example of character where case
            foldings that varies by locale is LATIN SMALL LETTER DOTLESS I
            (U+0131).
          </t>
          
          <t>
            In some cases it may be possible to construct case-folding
            tailorings that are locale-neutral.  For example, all of the
            following conuld be considered equivalent:
            <list style="symbols">
              <t>LATIN CAPITAL LETTER I (U+0049)</t>
              <t>LATIN SMALL LETTER I (U+0069)</t>
              <t>LATIN CAPITAL LETTER I WITH DOT ABOVE (U+0130)</t>
              <t>LATIN SMALL LETTER DOTLESS I (U+0131)</t>
            </list>
            which might satisfy a mix of users including those familiar
            with Turkish and those not, using the same filesystem.
          </t>
        </section>

        <section title="Caching Clients">
          <t>
            Remote filesystem protocols often involve caching on
            clients, which caching may require knowledge of filesystem
            I18N settings in order to permit local operations to be
            performed using cached directory listings that work the same
            way as on the server.  We do not specify any case foldings
            here.  Instead we will either create a registry of case
            folding tailorings, or use the Common Locale Data Repository
            (CLDR), then require that filesystems and servers be able to
            identify what case foldings are in effect for
            case-insensitive filesystems.
          </t>
        </section>
      </section>

      <section anchor="arch_notes" title="Running Code Architecture Notes">
        <t>
          Surprisingly, almost all if not all general purpose operating
          systems in common use today have a "virtual filesystem switch"
          (VFS) <xref target="McKusick86"/> <eref
            target='https://en.wikipedia.org/wiki/Virtual_file_system'>[wikipedia]</eref>
          interface that permits the use of multiple different
          filesystem types on one system, all accessed through the same
          filesystems application programming interfaces (APIs).  The
          VFS is essentially a pluggable layer that includes
          functionality for routing calls from user processes to the
          appropriate filesystems.  The VFS has even been generalized
          and extended to support isolation, thus we have the Filesystem
          in Userspace (FUSE), which is akin to a remote filesystem
          protocol, but for use over local inter-process communications
          (IPC) facilities.
        </t>

        <t>
          The VFS architecture was developed in the 1980s, before Unicode
          adoption.  It is not surprising then that in general -if not
          simply always today- the code path from the interface between a
          user application and the operating system all the way to the
          filesystem implements no I18N functionality whatsoever, and
          does the absolute minimum of character data interpretation:
          <list style="symbols">
            <t>use of US-ASCII NUL (for "C string" termination),</t>
            <t>use of US-ASCII '/' and/or <![CDATA['\']]> (for file path
              component delimiting).</t>
          </list>
        </t>

        <t>
          For example, the 4.4BSD operating system and derivatives have
          a VFS <xref target="BSD4.4"/>, as do Solaris and derivatives
          <xref target="SolarisInternals"/>, Windows <eref
            target="https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/"/>,
          OS X, and Linux.  A VFS of a sort, including FUSE, may well be
          the only reasonable way to support more than one kind of
          filesystem while retaining compatibility with
          previously-existing filesystem APIs.  This explains why so
          many modern operating systems have a VFS.
        </t>

        <t>
          Thus in most if not all general purpose operating systems
          today, the code path from the boundary between the application
          and the operating system, and the boundary between the VFS and
          the filesystem, is "just-use-8" or "just-use-16" (as in
          UTF-16 <xref target="UNICODE"/>), with no attempt at
          normalization or case folding done anywhere in between.
        </t>

        <t>
          There are filesystem servers that access raw storage directly
          and implement the filesystem and the remote filesystem
          protocol server in one monolythic stack without a VFS in the
          way, but it is very common to have remote filesystem protocol
          servers implemented on top of the VFS or on top of the system
          calls.  Even monolythic servers tend to support a notion of
          multiple filesystems in a server or volume, and may have
          different I18N settings for each filesystem.  Thus it's common
          to leave I18N handling to code layers close to the filesystem
          even in monolythic server implementations.
        </t>

        <t>
          In practice all of foregoing has led to I18N functionality
          residing strictly in the filesystem.  Two filesystems have
          defined the best current practices in this regard:
          <list style="symbols">
            <t>
              HFS+, which does normalize-on-CREATE (and LOOKUP),
              normalizing to a form that is very close to NFD and is
              case-sensitive;
            </t>
            <t>
              ZFS, which implements form-insensitive, form-preserving
              behavior and optionally implements case-insensitive,
              case-preserving behavior on a per-filesystem basis.
            </t>
          </list>
        </t>

        <t>
          Altogether, these circumstances make it very difficult to
          reliably and always locate I18N functionality above the VFS,
          or to not use a VFS at all: there are too many places to
          alter, and all must agree exactly on I18N choices.  Moreover,
          implementing case-insensitive but case-preserving behavior
          above the VFS requires fully reading each directory, and so
          does implementing form-insensitive and form-preserving
          behavior at the VFS layer itself.  The only behaviors that can
          be reliably implemented at or above the VFS are normalize- and
          case-fold-on-CREATE (and LOOKUP).
        </t>

        <t>
          Consider the set of already-running code that must all be
          modified in order to reliably implement I18N above the
          filesystem on general purpose operating systems:
          <list style="symbols">
            <t>
              filesystem protocol servers, including but not limited to:
              <list style="symbols">
                <t>Network File System (NFSv4) <xref target="RFC7530"/>;</t>
                <t>
                  Hypertext Transfer Protocol (HTTP) servers serving
                  resources hosted on filesystems<xref target="RFC7230"/>;
                </t>
                <t>
                  SSH File Transfer Protocol (SFTP)
                  <xref target="I-D.ietf-secsh-filexfer"/>;
                </t>
                <t>
                  various remote filesystem protocols that are not
                  Internet Protocols (i.e., not standards-track Internet
                  RFCs);
                </t>
              </list>
            </t>
            <t>POSIX system call layers or user process system call stub libraries;</t>
            <t>WIN32 system call layers or user process system call stub libraries.</t>
          </list>
        </t>

        <t>
          Regarding system calls and system call stubs in user process
          system libraries, the continued use of statically-linked
          executables means that these cannot reliably be modified.
          Indeed, on some systems the Application Binary Interface (ABI)
          between user-space applications and the operating system
          kernel is well-defined and long-term stable.  The system call
          handlers cannot reliably inspect the calling process to
          determine any attributes of its locale.  Adding new system
          calls is possible, but existing running code wouldn't use
          them.  For similar reasons, the VFS layer is generally
          (always) completely unaware of any attributes of the locale of
          applications calling it, whether via system calls or any other
          path.
        </t>

        <t>
          Unix-like operating systems are generally (always)
          "just-use-8", assuming only that file names and paths are C
          strings (i.e., terminated by zero-valued bytes) and
          sufficiently compatible with US-ASCII that the file path
          component separator character, US-ASCII '/', is meaningful.
          As a result, it is possible to find I18N-unaware filesystems
          with one or more non-Unicode, non-ASCII codesets in use for
          file names!  We leave non-ASCII and non-Unicode file names out
          of scope here.
        </t>

        <t>
          For these reasons it is simply not practical to implement I18N
          at any layer above the VFS.
        </t>

        <t>
          Even in the VFS, form- and case-insensitive and -preserving
          behaviors would be difficult to implement as performantly as
          in the filesystem.  The VFS would have to list a directory
          completely before being able to apply those behaviors.  It
          is reasonable to expect caching clients of remote filesystems
          to cache directory listings (especially for offline
          operation), but it isn't reasonable to expect the same of the
          VFS.  Compare to the filesystem itself, which can maintain a
          fast index (e.g., hash table or b-tree) where the keys are
          normalized and possibly case-folded file names and thus may
          not need to read directories in order to perform fast lookups
          that are form- and even case-insensitive.
        </t>

        <t>
          The only way to implement I18N behaviors in the VFS layer
          rather than at the filesystem is to abandon form- and
          case-preserving behaviors.  For case-insensitivity this would
          require using sentence-case, or all lower-case, perhaps, and
          all such choices would surely be surprising to users.  At any
          rate, that approach would also render much running code
          "non-compliant" with any Internet filesystem protocol I18N
          specification.
        </t>

        <t>
          Therefore, generally speaking, only the filesystem can
          reliably, interoperably, and performantly implement I18N
          behaviors in general purpose operating systems.
        </t>

        <t>
          Note that variations in I18N behaviors can happen even on the
          same server with multiple filesystems of the same type.  This
          can happen because of
          <list>
            <t>different Unicode versions being used at the times of
              creation of various filesystems, and</t>
            <t>different locale settings on various filesystems.</t>
          </list>
        </t>

        <t>
          Locale variations are only relevant to case-folding for
          case-insensitivity.  Running code mostly uses default
          case-folding rules, but there is no reason to assume that
          locale-specific case-folding rules won't be supported by
          running code in the future.
        </t>

        <t>
          It may not be possible or easy for a filesystem to adopt new
          Unicode versions, or adopt backwards-incompatible case
          foldings, after content has been created in it that would be
          ambiguous under new rules.  This implies that where a client
          for a remote filesystem must know what I18N functionality to
          implement for use with cached directory listings, the client
          must know specifically what profile of I18N functionality each
          cached filesystem implements.
        </t>
      </section>
    </section>

    <section anchor="guidelines_fs" title="Filesystem I18N Guidelines">
      <t>
        We begin be recognizing and accepting that much running code
        implements I18N functionality at the filesystem.  Given this, we
        catalogue the range of acceptable behaviors.  Filesystems
        adhering to this specification MUST implement only acceptable
        I18N behaviors as specified here.  Acceptable variations may be
        registered in a to-be-determined (IANA?) registry of filesystem
        I18N behaviors.
      </t>

      <section anchor="guidelines_fs_equiv" title="Filesystem I18N Guidelines: Non-Unicode File names">
        <t>
          <list style="symbols">
            <t>
              Filesystems SHOULD reject attempts to create new
              non-Unicode file names.
            </t>

            <t>
              Filesystems either MUST normalize on CREATE (and LOOKUP),
              or MUST be form-insensitive and form-preserving.
            </t>

            <t>
              Filesystems MUST specify a Unicode version for their
              equivalence behaviors.
            </t>
          </list>
        </t>
      </section>

      <section anchor="guidelines_fs_case" title="Filesystem I18N Guidelines: Case-Insensitivity">
        <t>
          <list style="symbols">
            <t>
              Filesystems MAY support case-insensitivity, in which case
              they SHOULD be case-preserving.  Filesystems that are
              case-insensitive but not case-preserving either MUST
              specify a case form, such as title case or sentence case.
            </t>

            <t>
              Case foldings for case-insensitive filesystems MUST be
              identified.  The Unicode default case foldings SHOULD be
              the default case algorithms for the identified Unicode
              version without additional tailorings.  Filesystems that
              use case algorithms tailored to specific locales SHOULD
              use case foldings registered in a to-be-determined (IANA?)
              registry.
            </t>

            <t>
              Case-insensitive filesystems MUST specify a Unicode
              version for their case-insensitive behavior.
            </t>
          </list>
        </t>
      </section>

      <section anchor="guidelines_fs_i18n_versioning" title="I18N Versioning">
        <t>
          Each filesystem MUST identify a Unicode version for their I18N
          behaviors.  Filesystem implementations SHOULD adopt new
          Unicode versions as they are produced, though it is understood
          that it may be difficult to migrate non-empty filesystems to
          new Unicode versions.
        </t>
      </section>
    </section>

    <section anchor="guidelines_proto" title="Filesystem Protocol I18N Guidelines">
      <t>
        Remote filesystem protocols that allow clients to perform
        lookups against cached directory listings MUST allow clients to
        discover all relevant I18N behaviors of the filesystem whence
        any given directory listing:
        <list style="symbols">
          <t>whether the filesystem normalizes on CREATE (and LOOKUP),
            and if so, to what NF in what Unicode version;</t>
          <t>whether the filesystem is form-insensitive and
            form-preserving, and if so, in what Unicode version;</t>
          <t>whether the filesystem is case-insensitive and
            case-preserving, and if so, with what foldings (default or
            tailured, and if tailored provide an identifier for the set
            of foldings), and a Unicode version.</t>
        </list>
        Foldings are identified via a folding set name as registered in
        a to-be-determined (IANA?) registry.
      </t>

      <t>
        Because some filesystems might allow for different I18N settings
        on a per-directory basis, remote filesystem protocols MUST allow
        those settings to be discoverable on a per-directory basis.
      </t>

      <t>
        Internet filesystem servers MUST reject attempts to create new
        non-Unicode file names.  (Note that this requirement is weaker
        ("SHOULD") for the actual filesystems, since those might have to
        allow non-Unicode content for legacy reasons via interfaces
        other than Internet filesystem protocols.)
      </t>

      <section anchor="guidelines_caching" title="I18N and Caching in Filesystem Protocol Clients">
        <t>
          Caching clients of remote filesystems either MUST NOT perform
          lookups against cached directory listings, or MUST query the
          directories' filesystems' I18N profiles and apply the same
          I18N equivalent form policis and case-insensitivity case
          foldings.
        </t>
      </section>
    </section>

    <section anchor="cons_i18n" title="Internationalization Considerations">
      <t>
        This document deals in internationalization throughout.
      </t>
    </section>

    <section anchor="cons_iana" title="IANA Considerations">
      <t>
        [ALTERNATIVELY use locale names and CLDR?  Need to determine
        the stability of CLDR locales...  Basically, we need stable
        locale names, and stable case-folding mappings.]
      </t>

      <t>
        We hereby request the creation of a new IANA registry with
        Expert Review registration rules with the following fields:
        <list style="symbols">
          <t>name, an identifier-like name</t>
          <t>Unicode version number</t>
          <t>listing of case folding tailorings and/or references to
            external case folding tailoring specifications</t>
        </list>
      </t>

      <t>
        The case foldings registered here will be used by
        case-insensitive filesystems and filesystem protocols to
        identify tailored case foldings so that caching clients can
        implement the same case-insensitive behavior using cached
        directory listings.
      </t>
    </section>

    <section anchor="cons_sec" title="Security Considerations">
      <t>
        Security considerations of Unicode and filesystem protocols
        apply.  No new security considerations are added or need be
        noted here.
      </t>

      <t>
        The methods of handling equivalent Unicode strings cause
        aliasing.  This is not expected to be a security problem.
      </t>

      <t>
        Case-insensitivity causes aliasing.  This is not expected to be
        a security problem.
      </t>

      <t>
        No effort is made here to handle confusables.  This is not
        expected to be a serious security problem in the context of file
        servers.
      </t>
    </section>
  </middle>
  <back>

    <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
        (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included files in the same
     directory as the including file. You can also define the XML_LIBRARY environment variable
     with a value containing a set of directories to search.  These can be either in the local
     filing system or remote ones accessed by http (http://domain/dir/... ).-->
    <references title="Normative References">
      <!--?rfc include="http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->
      &RFC2119;
      &RFC3629;
      <reference anchor="UNICODE" target="https://www.unicode.org/versions/Unicode12.1.0/">
        <front>
          <title>The Unicode Standard, Version 12.1.0</title>
          <author>
            <organization>The Unicode Consortium</organization>
          </author>
          <date year="2019" month="May"/>
        </front>
      </reference>
    </references>

    <references title="Informative References">
      &RFC3986;
      &RFC3987;
      &RFC7230;
      &RFC7530;
      &SFTP;
      <reference anchor="McKusick86">
        <front>
          <title>Towards a Compatible File System Interface</title>
          <author fullname="Marshall McKusick" initials="M.K." surname="McKusik"/>
          <author fullname="Michael Karels" initials="M.J." surname="Karels"/>
          <date year="1986" month='Jun'/>
        </front>
      </reference>
      <reference anchor="BSD4.4">
        <front>
          <title>The Design and Implementation of the 4.4BSD Operating System</title>
          <author fullname="Marshall McKusick" initials="M.K." surname="McKusik"/>
          <author fullname="Keith Bostic" initials="K." surname="Bostic"/>
          <author fullname="Michael Karels" initials="M.J." surname="Karels"/>
          <author fullname="John Quarterman" initials="J.S." surname="Quarterman"/>
          <date year="1996"/>
        </front>
        <seriesInfo name= 'DOI' value= '10.5555/231070'/>
      </reference>
      <reference anchor="SolarisInternals">
        <front>
          <title>Solaris Internals -- Solaris 10 and OpenSolaris Kernel Architecture</title>
          <author fullname="Richard" initials="R." surname="McDougal"/>
          <author fullname="Jim" initials="J." surname="Mauro"/>
          <date year="2007"/>
        </front>
      </reference>
    </references>
  </back>
</rfc>
