<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-shenzhihong-dacp-01" category="exp" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="DACP Protocol">DACP: Data Access and Collaboration Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-shenzhihong-dacp-01"/>
    <author initials="Z." surname="Shen" fullname="Zhihong Shen">
      <organization>CNIC, Chinese Academy of Sciences</organization>
      <address>
        <email>bluejoe@cnic.cn</email>
      </address>
    </author>
    <date year="2025" month="November" day="03"/>
    <area>General</area>
    <abstract>
      <?line 32?>

<t>This document describes the Data Access and Collaboration Protocol (DACP), a communication protocol designed to support cross-node, cross-process data access in scientific and distributed computing environments. DACP provides standardized streaming-based data interactions over the Arrow Flight protocol and defines a unified Streaming DataFrame (SDF) model, which acts as a high-performance abstraction for accessing and processing both structured and unstructured data.</t>
    </abstract>
  </front>
  <middle>
    <?line 36?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Modern data processing, particularly in scientific and distributed computing, requires unified and low-latency data access that spans across different domains, nodes, and processes. However, the inherently fragmented, heterogeneous, and siloed nature of scientific data impedes effective data sharing and collaboration.</t>
      <t>The <strong>Data Access and Collaboration Protocol (DACP)</strong> is designed to enable secure, high-performance, and auditable streaming of data across distributed systems. DACP builds upon <strong>Apache Arrow Flight</strong> <xref target="Apache-Arrow-Flight"/> to provide zero-copy, columnar data transfer, while introducing an end-to-end provenance tracking mechanism for data access.</t>
      <t>Traditional data access methods, such as REST over JSON, not only incur high serialization overhead but also lack native support for both data stream transport across processes and nodes and multi-hop auditing of data access. To address these limitations, DACP defines Streaming DataFrame (SDF) as a standardized data unit.</t>
      <t>Key features include:</t>
      <ul spacing="normal">
        <li>
          <t>Unified &amp; consistent data representation</t>
        </li>
        <li>
          <t>High-performance stream-framed data transport</t>
        </li>
        <li>
          <t>Strict authentication and access control</t>
        </li>
        <li>
          <t>End-to-end tracking of data flow paths and provenance</t>
        </li>
      </ul>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",<br/>
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and<br/>
"OPTIONAL" in this document are to be interpreted as described in<br/>
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all<br/>
capitals, as shown here.</t>
      <ul spacing="normal">
        <li>
          <t><strong>DACP</strong>: Data Access and Collaboration Protocol</t>
        </li>
        <li>
          <t><strong>Streaming DataFrame (SDF)</strong>: The fundamental data unit in DACP.</t>
        </li>
        <li>
          <t><strong>Dataset</strong>: A logical container used to organize and manage multiple named SDFs.</t>
        </li>
        <li>
          <t><strong>DACP Server</strong>: A server that hosts datasets/SDFs and responds to DACP requests.</t>
        </li>
        <li>
          <t><strong>DACP Client</strong>: A client that initiates a DACP connection to request data or metadata.</t>
        </li>
        <li>
          <t><strong>DACP Proxy</strong>: An optional but recommended intermediary service that acts as a secure gateway, enabling clients from an external network (e.g., the public internet) to access DACP Servers located within a private network.</t>
        </li>
      </ul>
    </section>
    <section anchor="architecture-overview">
      <name>Architecture Overview</name>
      <section anchor="protocol">
        <name>Protocol</name>
        <t>DACP is an application-layer protocol that governs the communication between a <strong>DACP Client</strong> and <strong>DACP Server</strong>. Its primary purpose is to provide a standardized way to request, query, and stream data across different processes and network nodes.</t>
        <t>To achieve this, DACP introduces the <strong>Streaming DataFrame (SDF)</strong> as the unified model for all data streams transmitted by the protocol. The SDF provides a consistent, structured representation for data. The <strong>Dataset</strong> acts as an optional logical container for organizing and sharing related SDFs. While the Dataset (an optional logical container) serves as a key unit for organized data sharing, the SDF remains the fundamental unit for analysis and processing.</t>
        <t>Instead of defining a new transport layer from scratch, DACP is built directly on top of <strong>Apache Arrow Flight</strong>. It maps its application-level concepts onto Arrow's proven capabilities.</t>
      </section>
      <section anchor="uri-format">
        <name>URI Format</name>
        <t>DACP resources use this URI scheme:</t>
        <t><tt>dacp://host:port/[dataset_name]/path</tt></t>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>host</tt>: Domain name or IP address (required)</t>
          </li>
          <li>
            <t><tt>port</tt>: Optional port number</t>
          </li>
          <li>
            <t><tt>dataset_name</tt>: Optional unique name within the host, identifying a specific dataset</t>
          </li>
          <li>
            <t><tt>path</tt>: Slash-separated path used to identify a specific SDF within the context of the specified Dataset (may include file extensions if applicable; required)</t>
          </li>
        </ul>
        <t>Examples:</t>
        <ul spacing="normal">
          <li>
            <t><tt>dacp://10.0.0.1:8587</tt></t>
          </li>
          <li>
            <t><tt>dacp://10.0.0.1:8587/weather_db</tt></t>
          </li>
          <li>
            <t><tt>dacp://10.0.0.1:8587/weather_db/sensors/temperature.csv</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="communication-model">
        <name>Communication Model</name>
        <t>DACP uses a client-initiated request-response model with streaming support:</t>
        <ol spacing="normal" type="1"><li>
            <t>Client establishes a secure (TLS) connection.</t>
          </li>
          <li>
            <t>Client establishes connection using DACP URI, presenting its long-term credentials (e.g., username/password).</t>
          </li>
          <li>
            <t>Server validates the credentials and, if successful, returns a short-lived Authentication Token (AuthToken). This token serves as proof of identity for all subsequent requests.</t>
          </li>
          <li>
            <t>Client sends a data request to the server. The DACP Application Payload of this request must contain the AuthToken.</t>
          </li>
          <li>
            <t>Server validates the token on every incoming request to ensure the client is authenticated. Large SDFs use streaming in chunks. Link information is updated at each hop.</t>
          </li>
          <li>
            <t>The connection is maintained until closed by the client or server.</t>
          </li>
        </ol>
        <sourcecode type="artwork"><![CDATA[
DACP Client                                    DACP Server
    |                                                |
    |--- 1. Establish Secure Connection (TLS) ------>|
    |                                                |
    |<-- (Connection Established) -------------------|
    |                                                |
    |-- 2. Request with Authentication Credentials ->|
    |             (Authentication OK)                |
    |                                                |
    |<-- 3. Return AuthToken ------------------------|
    |                                                |
    |--- 4. Request Data Stream  ------------------->|
    |    (Payload includes Auth Token)               |
    |                                                |
    |           (Server: validates token again,      |
    |            starts stream)                      |
    |                                                |
    |<-- 5. Stream Chunk 1 (RecordBatch) ------------|
    |<-- 6. Stream Chunk 2 (RecordBatch) ------------|
    |<-- ... (more chunks) ... ----------------------|
    |<-- 7. End of Stream ---------------------------|
    |                                                |
]]></sourcecode>
      </section>
    </section>
    <section anchor="sdf">
      <name>Streaming DataFrame (SDF)</name>
      <t>The Streaming DataFrame (SDF) is the fundamental logical data unit in the DACP protocol. It represents a large-scale, two-dimensional table of columnar data, which is not necessarily derived from a single file.</t>
      <t>Key Characteristics:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Schema-Driven and Ordered</strong>: Every SDF is defined by a strict schema that includes column names and their corresponding data types. The positions of columns within the schema are fixed, allowing columns to be accessed by their positional index (e.g., <tt>_1</tt>, <tt>_2</tt>, <tt>_3</tt>). To ensure semantic interoperability across different systems, schema registration (via the DACP server's metadata interface, including fields like schema ID, creation time, and type compatibility rules) is <strong>RECOMMENDED</strong>. If a schema is not registered, the server will default to Apache Arrow's native type mapping for interoperability.</t>
        </li>
        <li>
          <t><strong>Immutable</strong>: SDFs are immutable by design. A transformation operation does not change the original SDF but instead defines a new logical SDF as its result.</t>
        </li>
        <li>
          <t><strong>Data Representation and Types</strong>: All values within an SDF conform to the Apache Arrow specification, which defines their type and binary on-the-wire representation.
          </t>
          <ul spacing="normal">
            <li>
              <t><strong>Null</strong> is a valid and supported value for any data type.</t>
            </li>
            <li>
              <t>The Binary data type is explicitly supported, allowing an SDF to act as a container for unstructured or semi-structured data (e.g., images, documents, blobs).</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>Streaming Native</strong>: An SDF is not a monolithic in-memory object but a logical stream composed of one or more sequential data chunks, typically represented as Arrow RecordBatches. This design is fundamental to DACP, allowing it to handle datasets that vastly exceed the memory capacity of any single node.</t>
        </li>
        <li>
          <t><strong>Addressability and Naming</strong>: SDFs are addressable at two levels:
          </t>
          <ul spacing="normal">
            <li>
              <t><strong>Host-Local Identifier</strong>: Each SDF has an identifier (e.g., <tt>a00001</tt> or <tt>ds0001/a/b/1.cdf</tt>) that is unique within the scope of its host DACP server. The naming convention is determined by the host.</t>
            </li>
            <li>
              <t><strong>Globally Unique URI</strong>: A host-local identifier is combined with the server's address to form a globally unique DACP Uniform Resource Identifier (URI), such as <tt>dacp://10.0.0.1/a00001</tt>. This URI is the canonical way for clients to request a specific SDF.</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>Rich Metadata</strong>: Each SDF can be accompanied by a metadata block that provides critical context about the data. This <strong>MAY</strong> include standardized fields such as <tt>rows</tt>, <tt>totalBytes</tt>, <tt>lastModified</tt>, etc.</t>
        </li>
      </ul>
    </section>
    <section anchor="sdf-operations">
      <name>SDF Operations</name>
      <t>The DACP protocol defines a computational model for processing SDFs based on the principles of immutability and lazy evaluation. This allows clients to build complex queries that are executed efficiently on the server.</t>
      <section anchor="core-principles">
        <name>Core Principles</name>
        <ul spacing="normal">
          <li>
            <t><strong>Immutability</strong>: A source SDF is never modified. A <strong>transformation</strong> operation does not change the original data but instead defines a new, logical SDF as its result.</t>
          </li>
          <li>
            <t><strong>Deferred Execution (Lazy Evaluation)</strong>: Transformations are not executed immediately. They are accumulated client-side into a logical execution plan called a <strong>Transformation Chain</strong>. The entire computation is triggered only when a result-triggering <strong>Action</strong> is invoked. This model naturally supports method chaining, such as <tt>df.select("xx").limit(10).collect()</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="operation-categories">
        <name>Operation Categories</name>
        <t>SDF operations are categorized by how they interact with the server.</t>
        <section anchor="transformations">
          <name>Transformations</name>
          <t>Transformations are operations that create a new logical SDF. Common transformations supported by the protocol <strong>SHOULD</strong> include:</t>
          <ul spacing="normal">
            <li>
              <t><tt>select</tt>: Selects a subset of columns.</t>
            </li>
            <li>
              <t><tt>map</tt>: Applies a function to each row.</t>
            </li>
            <li>
              <t><tt>union</tt>: Combines two DataFrames.</t>
            </li>
            <li>
              <t><tt>sample</tt>: Returns a random sample of the data.</t>
            </li>
            <li>
              <t><tt>limit</tt>: Restricts the result to the first N rows.</t>
            </li>
            <li>
              <t><tt>filter</tt>: Selects rows that satisfy a given predicate. The filter operation <strong>SHOULD</strong> support two distinct types of predicate expressions, allowing for flexibility in how conditions are specified:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t><strong>SQL-style String</strong>: A string containing a standard SQL WHERE clause expression.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t><em>Example</em>: <tt>filter("AAA &gt; 1 and BBB = 2")</tt></t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t><strong>Functional Expression</strong>: A string representing a functional or lambda-style expression that evaluates to a boolean for each row.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t><em>Example</em>: <tt>filter("row =&gt; row('AAA') &gt; 1 &amp;&amp; row('BBB') == 2")</tt></t>
                    </li>
                  </ul>
                </li>
              </ol>
            </li>
          </ul>
        </section>
        <section anchor="actions">
          <name>Actions</name>
          <t>Actions trigger the execution of the Transformation Chain and produce a final result. Common actions <strong>SHOULD</strong> include:</t>
          <ul spacing="normal">
            <li>
              <t><tt>collect</tt>: Gathers all rows (or the first N rows) of the result and returns them to the client.</t>
            </li>
            <li>
              <t><tt>count</tt>: Returns the total number of rows in the result.</t>
            </li>
            <li>
              <t><tt>first</tt>: Returns the first row of the result.</t>
            </li>
            <li>
              <t><tt>reduce</tt>: Aggregates the elements of the DataFrame.</t>
            </li>
            <li>
              <t><tt>foreach</tt>: Applies a function to each row (typically for side effects on the server).</t>
            </li>
            <li>
              <t><tt>write</tt>: Saves the result to a storage system.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="rpc-mapping">
        <name>RPC Mapping</name>
        <t>Transformations <strong>MUST NOT</strong> trigger network requests. They only append a new entry to the actions array in the client's local DataFrame state representation. Actions trigger server-side execution. The choice of RPC is determined by the action's return type.</t>
        <ul spacing="normal">
          <li>
            <t><strong>Data-Returning Actions (via DoGet)</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t><strong>Operations</strong>: <tt>collect</tt>, <tt>first</tt>, <tt>reduce</tt>, <tt>foreach</tt>, <tt>write</tt>.</t>
              </li>
              <li>
                <t><strong>Result</strong>: The server executes the Transformation Chain and streams back the resulting SDF as an Arrow IPC Stream.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Computation-Returning Actions (via DoAction)</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t><strong>Operations</strong>: <tt>sum</tt>, <tt>mean</tt>, <tt>count</tt>.</t>
              </li>
              <li>
                <t><strong>Result</strong>: The server executes the query and returns a small result (e.g., a JSON object) in the Result stream.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Metadata-Returning Actions (via GetFlightInfo)</strong>
            </t>
            <ul spacing="normal">
              <li>
                <t><strong>Operations</strong>: <tt>schema</tt>, <tt>num_rows</tt>, <tt>shape</tt>.</t>
              </li>
              <li>
                <t><strong>Result</strong>: The server plans the query, determines the properties of the result (schema, row count), and returns them in a FlightInfo message without sending any data.</t>
              </li>
            </ul>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="dataset">
      <name>Dataset</name>
      <t>To facilitate logical organization and data sharing, DACP introduces the optional concept of a <strong>Dataset</strong>. A Dataset is not a physical container but a logical grouping that functions like a dictionary or namespace for one or more related SDFs.</t>
      <t>Key characteristics of a Dataset are:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Logical, Not Physical</strong>: A Dataset is a metadata construct. An SDF is not required to belong to a Dataset. The fundamental unit of analysis remains the SDF.</t>
        </li>
        <li>
          <t><strong>Flat Namespace</strong>: A Dataset contains a collection of named SDFs. This namespace is flat, not hierarchical; a tree-like folder structure <strong>SHOULD NOT</strong> be assumed. This simplifies data access, as each SDF can be directly addressed.</t>
        </li>
        <li>
          <t><strong>Naming</strong>: A Dataset has a name that is unique within the scope of its host DACP server (e.g., <tt>human_face_images</tt>).</t>
        </li>
        <li>
          <t><strong>Metadata Inheritance</strong>: One of Dataset's roles is to provide descriptive metadata. Metadata defined at the Dataset level can be inherited by the SDFs it contains, providing a convenient way to apply common context.</t>
        </li>
        <li>
          <t><strong>Unit of Sharing vs. Unit of Analysis</strong>: In a typical workflow, the <strong>Dataset serves as the basic unit for data sharing</strong>, providing a complete, context-rich package of related data. The <strong>SDF remains the basic unit for data analysis</strong>, representing the actual data to be processed.</t>
        </li>
      </ul>
    </section>
    <section anchor="data-stream-framing">
      <name>Data Stream Framing</name>
      <t>Data Stream Framing is the process by which a DACP server maps files, folders, and databases into the DACP's Streaming DataFrame (SDF) model. This process makes diverse data accessible through a unified protocol.</t>
      <section anchor="framing-strategies">
        <name>Framing Strategies</name>
        <t>The framing strategy depends on the nature of the source data.</t>
        <section anchor="framing-structured">
          <name>Framing Structured and Semi-Structured Data</name>
          <t>Sources with inherent tabular or relational structure are mapped directly into one or more SDFs.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Single Tabular File (e.g., CSV)</strong>: Mapped to a single SDF where rows and columns correspond to the file's content.</t>
            </li>
            <li>
              <t><strong>Hierarchical/Scientific File (e.g., NetCDF)</strong>: Mapped to one SDF representing the variables and dimensions within the file.</t>
            </li>
            <li>
              <t><strong>Relational Database (RDBMS)</strong>: Mapped to a Dataset where each table or view becomes a distinct SDF.</t>
            </li>
            <li>
              <t><strong>Knowledge Graph (e.g., RDF)</strong>: Mapped to a Dataset containing separate SDFs for vertices and edges.</t>
            </li>
          </ul>
        </section>
        <section anchor="framing-files">
          <name>Framing Files and File Collections</name>
          <t>Not all files can be meaningfully parsed into a multi-row, multi-column SDF (e.g., a JPEG image). For these "opaque" files, or for any collection of files, DACP uses a powerful alternative: <strong>framing the file list itself</strong>.</t>
          <ul spacing="normal">
            <li>
              <t><strong>File List Framing</strong>: A list of files (e.g., from a folder or a ZIP archive) is mapped into a single, structured SDF. In this SDF:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Each <strong>row</strong> represents a single file.</t>
                </li>
                <li>
                  <t><strong>Columns</strong> describe the file's metadata, such as <tt>name</tt>, <tt>path</tt>, <tt>suffix</tt>, <tt>type</tt>, <tt>size</tt>, and <tt>modification_time</tt>. The schema for this is often referred to as a <tt>FileListSchema</tt>.</t>
                </li>
                <li>
                  <t>A special column, typically named <tt>blob</tt> and of type Binary, is included. This column represents the file's raw binary content.</t>
                </li>
                <li>
                  <t>A url column provides a direct, navigable link to access the content of the item.</t>
                </li>
              </ul>
            </li>
            <li>
              <t><strong>Lazy Loading of Binary Content</strong>: A critical feature of this model is that the <tt>blob</tt> column <strong>MUST</strong> be lazy-loaded. The binary content of a file is only read from storage and streamed to the client when that specific column for that specific row is explicitly accessed. This prevents the costly operation of loading all file contents into memory upfront.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="example-mixed-content">
        <name>Example: A Mixed-Content Folder</name>
        <t>Consider a folder containing <tt>results.csv</tt> and <tt>plot.png</tt>. A DACP server could frame this folder as a single SDF with the following structure:</t>
        <table>
          <thead>
            <tr>
              <th align="left">name</th>
              <th align="left">path</th>
              <th align="left">type</th>
              <th align="left">size</th>
              <th align="left">time</th>
              <th align="left">url</th>
              <th align="left">blob</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">results.csv</td>
              <td align="left">/results.csv</td>
              <td align="left">File</td>
              <td align="left">10240</td>
              <td align="left">(datetime)</td>
              <td align="left">dacp://.../dataset-x/results.csv</td>
              <td align="left">(...)</td>
            </tr>
            <tr>
              <td align="left">plot.png</td>
              <td align="left">/plot.png</td>
              <td align="left">File</td>
              <td align="left">204800</td>
              <td align="left">(datetime)</td>
              <td align="left">dacp://.../dataset-x/plot.png</td>
              <td align="left">(...)</td>
            </tr>
            <tr>
              <td align="left">logs</td>
              <td align="left">/logs</td>
              <td align="left">Dir</td>
              <td align="left">4096</td>
              <td align="left">(datetime)</td>
              <td align="left">dacp://.../dataset-x/logs</td>
              <td align="left">null</td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>url</tt> column is the key to interacting with the folder's contents. Accessing a URL triggers a new DACP request, and the server's response depends on the <tt>type</tt> of the item:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Accessing a Directory URL</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>If a client accesses the URL for the <tt>logs</tt> directory (<tt>dacp://.../dataset-x/logs</tt>), the server responds with a <strong>new SDF</strong>.</t>
              </li>
              <li>
                <t>This new SDF represents the contents of the <tt>logs/</tt> sub-folder, having the exact same structure (name, type, size, url, etc.). This enables recursive, drill-down navigation through the file system.</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Accessing a File URL</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>The behavior depends on whether the file is structured or opaque.</t>
              </li>
              <li>
                <t><strong>Structured File (e.g., <tt>results.csv</tt>)</strong>: When accessing the URL for <tt>results.csv</tt>, the server responds with an <strong>SDF representing the parsed content of the CSV file</strong>. The client receives a ready-to-use, multi-row, multi-column DataFrame.</t>
              </li>
              <li>
                <t><strong>Opaque File (e.g., <tt>plot.png</tt>)</strong>: When accessing the URL for <tt>plot.png</tt>, which cannot be meaningfully parsed into a tabular SDF, the server returns a raw binary stream, which can be saved to a file or loaded into an image library.</t>
              </li>
            </ul>
          </li>
        </ol>
        <t><strong>Lazy Loading of Binary Content:</strong></t>
        <t>A critical feature of this model is that the <tt>blob</tt> column in the initial folder listing <strong>MUST</strong> be lazy-loaded. The binary content of a file is only read from storage and streamed to the client when that specific column for that specific row is explicitly requested (e.g., <tt>df[1]['blob']</tt>).</t>
      </section>
    </section>
    <section anchor="auth">
      <name>Authentication and Authorization</name>
      <t>Security is a fundamental aspect of the DACP protocol. The security model is designed around the principles of unified authentication and distributed, request-based authorization.</t>
      <section anchor="authentication">
        <name>Authentication</name>
        <t>DACP mandates a unified authentication system for all actors (users and services) to ensure a consistent identity layer across the entire ecosystem.</t>
        <ul spacing="normal">
          <li>
            <t><strong>Unified Authentication Service</strong>: All hosts <strong>MUST</strong> integrate with a central, unified authentication service. This service is responsible for verifying user credentials and issuing identity tokens.</t>
          </li>
          <li>
            <t><strong>Authentication Flow (OAuth 2.0)</strong>: The standard mechanism for authentication <strong>MAY</strong> be an OAuth 2.0 flow. End-users authenticate with the central service to obtain a short-lived <strong>Bearer Token</strong> (e.g., a JWT).</t>
          </li>
          <li>
            <t><strong>Token Transmission</strong>: This Bearer Token <strong>MUST</strong> be included in the <tt>Authorization</tt> header of DACP requests sent to a server or proxy.
            </t>
            <ul spacing="normal">
              <li>
                <t><strong>Format</strong>: <tt>Authorization: Bearer &lt;token&gt;</tt></t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Token Validation</strong>: Upon receiving a request, every DACP endpoint (Proxy or Server) <strong>MUST</strong> validate the token. This includes verifying its signature, checking that it has not expired, and confirming that it was issued by the trusted central authentication service.</t>
          </li>
        </ul>
      </section>
      <section anchor="authorization">
        <name>Authorization and Access Control</name>
        <t>While authentication is centralized, authorization is distributed and managed by the administrators of each individual host. This allows data owners to have full control over their resources.</t>
        <t>The authorization model follows a dynamic, request-and-approval workflow:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Default State</strong>: The host administrator explicitly defines which resources are publicly accessible and which require specific authorization.</t>
          </li>
          <li>
            <t><strong>Access Request</strong>: To access a restricted resource, a user must submit an access request. This request specifies the user, the target dataset(s), and the expiration time.</t>
          </li>
          <li>
            <t><strong>Administrative Approval</strong>: The administrator of the host that owns the resource reviews the request. If approved, the administrator's action triggers the issuance of a new, permission-scoped token for the user.</t>
          </li>
          <li>
            <t><strong>Scoped Token Issuance</strong>: Upon approval, the central system issues a new token to the user. This token contains scopes that explicitly grant the approved permissions (e.g., <tt>dacp://host-a/dataset-b</tt>).</t>
          </li>
          <li>
            <t><strong>Policy Enforcement</strong>: When a user makes a request using this new token, the DACP server validates that the token's scopes (e.g., <tt>dacp://host-a/dataset-b</tt>) match the requested resource and operation (e.g., read, stream), ensuring the user has the necessary permissions for the requested operation on the target resource. Access is granted only if all these checks pass.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="provenance">
      <name>Provenance Tracking</name>
      <t>DACP maintains a provenance trail that records critical information for each hop in the connection chain, including machine identifiers, timestamps, and traffic metrics. This is particularly crucial for auditability in multi-hop environments involving proxies and gateways, tracking the full request path (e.g., <tt>client_ip -&gt; proxy_server_ip -&gt; server_ip -&gt; storage_server_ip</tt>).</t>
      <t>Each intermediate node MUST append its own entry to the provenance trail. The trail ensures auditability even in untrusted network environments.</t>
      <sourcecode type="artwork"><![CDATA[
+--------+   +--------------+   +--------------+   +---------------+
| Client |-->| Proxy Server |-->| DACP Server  |-->| Storage Server|
+--------+   +--------------+   +--------------+   +---------------+
         ↘ link trace: client → proxy → DACP Server → backend
]]></sourcecode>
    </section>
    <section anchor="message-structure">
      <name>DACP Message Structure</name>
      <section anchor="message-transport">
        <name>The Message Transport: FlightData</name>
        <t>DACP defines a single, unified application payload that encapsulates all control, security, and metadata information. All DACP data and metadata are transported within standard Arrow Flight <tt>FlightData</tt> messages. A <tt>FlightData</tt> message logically separates application-level metadata from the raw data payload, consisting of two primary components:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>app_metadata</tt></strong>: A byte field intended for use by higher-level protocols. DACP places its <strong>application payload</strong>, including headers and provenance information, into this field. The Arrow Flight framework treats this data as opaque and simply transports it from sender to receiver.</t>
          </li>
          <li>
            <t><strong><tt>data_body</tt></strong>: A byte field that contains the raw, serialized Arrow <strong>columnar data (RecordBatch)</strong>. This design enables zero-copy data access on the receiving end, as the data can be used directly without parsing or transformation.</t>
          </li>
        </ul>
        <sourcecode type="artwork"><![CDATA[
+------------------------------------------------------------------+
| Arrow Flight `FlightData` Message                                |
|                                                                  |
| +------------------------------+  +----------------------------+ |
| |        `app_metadata`        |  |       `data_body`          | |
| |                              |  |                            | |
| | +--------------------------+ |  |  +----------------------+  | |
| | | DACP Application Payload | |  |  |  Arrow RecordBatch   |  | |
| | +--------------------------+ |  |  +----------------------+  | |
| |                              |  |                            | |
| +------------------------------+  +----------------------------+ |
+------------------------------------------------------------------+
]]></sourcecode>
      </section>
      <section anchor="payload-structure">
        <name>DACP Application Payload Structure</name>
        <t>A DACP payload is structured as follows:</t>
        <t>The DACP Application Payload is a single, contiguous block of bytes that contains header, auth token and link information for a DACP message. It is designed to be self-describing, allowing any recipient to parse it by first reading a fixed-size header.</t>
        <sourcecode type="artwork"><![CDATA[
  +---------------+---------------+-------------------------------+
  | Protocol Ver. |     Flags     |         Message Type          |
  +---------------------------------------------------------------+
  |                     Total Payload Length (PL)                 |
  +---------------------------------------------------------------+
  |          Auth Token Length    |       LinkInfo Length         |
  +---------------------------------------------------------------+
  |                           Reserved                            |
  +---------------------------------------------------------------+
  |                                                               |
  /                 Authentication Token (Variable)               /
  /                  (Length = ATL bytes)                         /
  |---------------------------------------------------------------|
  |                                                               |
  /                Link Information (Variable)                    /
  /                  (Length = LIL bytes)                         /
  |---------------------------------------------------------------|
  |                                                               |
  /                SDF Specific Payload(Variable)                /
  /             (Length = PL - (Header + ATL + LIL))              /
  |---------------------------------------------------------------+
]]></sourcecode>
        <t>DACP Header fields:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Protocol Version (1 byte)</strong>: Allows evolution (e.g. 0x01).</t>
          </li>
          <li>
            <t><strong>Flags (1 byte)</strong>: 8 bits for control flags (e.g., 0x02 for End of Stream).</t>
          </li>
          <li>
            <t><strong>Message Type (2 bytes)</strong>: An identifier for the DACP operation (e.g., SDF Request/Response).</t>
          </li>
          <li>
            <t><strong>Total Payload Length (4 bytes)</strong>: The total size in bytes of the entire DACP Application Payload.</t>
          </li>
          <li>
            <t><strong>Auth Token Length (2 bytes)</strong>: The size in bytes of the Authentication Token block.</t>
          </li>
          <li>
            <t><strong>Link Info Length (2 bytes)</strong>: The size in bytes of the Link Information block.</t>
          </li>
          <li>
            <t><strong>Reserved (4 bytes):</strong> Reserved for future use, such as a token expiry timestamp.</t>
          </li>
        </ul>
        <t><strong>Authentication Token:</strong> A variable-length field containing the security token required for authentication. This is the first component to be processed by a receiving node.</t>
        <t><strong>Link Information:</strong> A variable-length field containing the serialized provenance trail. The trail is a serialized <tt>LinkInfo</tt> message, which is a list of <tt>HopInfo</tt> entries. A <tt>HopInfo</tt> SHOULD contain the following fields:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>proxy/server id</tt></strong>: A unique identifier for the DACP proxy/server that processed the message (e.g., hostname).</t>
          </li>
          <li>
            <t><strong><tt>proxy ip</tt></strong>: The IP address of the proxy.</t>
          </li>
          <li>
            <t><strong><tt>timestamp</tt></strong>: A high-precision UTC timestamp.</t>
          </li>
          <li>
            <t><strong><tt>authenticated_user</tt></strong>: The identity of the user as authenticated by this hop.</t>
          </li>
          <li>
            <t><strong><tt>bytes_transferred</tt></strong>: The number of bytes of the primary payload (e.g., SDF data) processed or forwarded.</t>
          </li>
        </ul>
        <t><strong>SDF Specific Payload:</strong> A JSON object that encapsulates a complete SDF query. The SDF Specific Payload MUST contain the following keys:</t>
        <ul spacing="normal">
          <li>
            <t><strong><tt>id</tt></strong>: A string representing the URI of the source SDF upon which the operations are based.</t>
          </li>
          <li>
            <t><strong><tt>actions</tt></strong>: An ordered array representing the chain of transformations. Each element in the array is a tuple <tt>[operation_name, parameters_object]</tt>.</t>
          </li>
        </ul>
        <t>Example SDF Specific Payload:</t>
        <sourcecode type="json"><![CDATA[
{
  "id": "dacp://10.0.0.1/weather_db/sensors",
  "actions": [
    ["filter", {"expression": "temperature > 25.0"}],
    ["select", {"columns": ["location", "temperature"]}],
    ["limit", {"n": 100}]
  ]
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>This document requests that IANA perform the following actions.</t>
      <t>This document requests the registration of the "dacp" Uniform Resource Identifier (URI) scheme in the "Uniform Resource Identifier (URI) Schemes" registry.</t>
      <ul spacing="normal">
        <li>
          <t><strong>Scheme name:</strong> dacp</t>
        </li>
        <li>
          <t><strong>Status:</strong> Permanent</t>
        </li>
        <li>
          <t><strong>Applications/protocols that use this scheme:</strong> Data Access and Collaboration Protocol (DACP).</t>
        </li>
        <li>
          <t><strong>URI Scheme Syntax:</strong> The syntax is specified in Section 3.2 of this document.</t>
        </li>
        <li>
          <t><strong>Reference:</strong> This document.</t>
        </li>
      </ul>
      <t>This document requests the assignment of a TCP port number in the "Service Name and Transport Protocol Port Number Registry".</t>
      <ul spacing="normal">
        <li>
          <t><strong>Service Name:</strong> dacp</t>
        </li>
        <li>
          <t><strong>Port Number:</strong> 8587 (Suggested)</t>
        </li>
        <li>
          <t><strong>Transport Protocol(s):</strong> TCP</t>
        </li>
        <li>
          <t><strong>Description:</strong> Data Access and Collaboration Protocol</t>
        </li>
        <li>
          <t><strong>Reference:</strong> This document.</t>
        </li>
      </ul>
      <t>This document requests the registration of the <tt>application/dacp+arrow</tt> media type in the "Media Types" registry.</t>
      <ul spacing="normal">
        <li>
          <t><strong>Type name:</strong> application</t>
        </li>
        <li>
          <t><strong>Subtype name:</strong> dacp+arrow</t>
        </li>
        <li>
          <t><strong>Required parameters:</strong> None</t>
        </li>
        <li>
          <t><strong>Optional parameters:</strong> None</t>
        </li>
        <li>
          <t><strong>Encoding considerations:</strong> binary</t>
        </li>
      </ul>
    </section>
    <section anchor="Security">
      <name>Security Considerations</name>
      <t>The DACP protocol relies on the security of the underlying transport, Apache Arrow Flight, which in turn uses TLS (typically TLS 1.3 <xref target="RFC8446"/>) for connection security. All security considerations applicable to TLS and gRPC apply to DACP. Implementations MUST support TLS 1.3 or a subsequent version.</t>
      <t>Authentication is managed via Bearer Tokens, as described in <xref target="authentication"/>. Implementers must be aware of the security risks associated with Bearer Tokens, such as interception and replay attacks. The use of short-lived tokens and secure storage on the client side is strongly RECOMMENDED.</t>
      <t>Authorization policies are enforced at each DACP server, as described in <xref target="authorization"/>. Administrators of DACP hosts are responsible for correctly configuring access control policies to prevent unauthorized data access.</t>
      <t>The provenance tracking mechanism described in <xref target="provenance"/> is designed for auditability but does not, by itself, prevent malicious actors from tampering with the provenance trail if they compromise an intermediate node. The integrity of the trail relies on the security of each hop in the chain.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <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. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="Apache-Arrow-Flight" target="https://arrow.apache.org/docs/format/Flight.html">
          <front>
            <title>Apache Arrow Flight</title>
            <author>
              <organization>Apache Arrow Community</organization>
            </author>
            <date year="2023"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 440?>

<section anchor="appendix-1">
      <name>Appendix 1. Python Client Usage Example</name>
      <t>This appendix provides a practical example of how to use the DACP Python sdk (<tt>DacpClient</tt>) to connect to a server, explore datasets, and perform common data manipulation tasks on a Streaming DataFrame (SDF).</t>
      <sourcecode type="python"><![CDATA[
import logging
from dacp_client import DacpClient, Principal

# Configure logging for demonstration purposes
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

print("--- 1. Connecting to the dacp Service ---")

# Connect using username and password via OAuth
url = "dacp://60.245.194.25:8587"
username = "your_username"  # Replace with actual username
password = "your_password"  # Replace with actual password
conn = DacpClient.connect(url, Principal.oauth(username, password))

print("\n--- 2. Discovering Datasets and DataFrames ---")
# List all available datasets
datasets = conn.list_datasets()
print(f"Found datasets: {datasets}")

# Get metadata for the first dataset
dataset_metadata = conn.get_dataset(datasets[0])
print(f"Metadata for '{datasets[0]}': {dataset_metadata}")

# List all DataFrames within that dataset
dataframes = conn.list_dataframes(datasets[0])
print(f"DataFrames in '{datasets[0]}': {dataframes}")

# Get the name of the first DataFrame to work with
dataframe_name = dataframes[0]['dataframeName']
print(f"Opening DataFrame: '{dataframe_name}'")

# Open the DataFrame to create a client-side handle
df = conn.open(dataframe_name)

print("\n--- 3. Inspecting DataFrame Properties ---")
logger.info(f"Schema: {df.schema}")
logger.info(f"Shape (rows, cols): {df.shape}")
logger.info(f"Number of rows: {df.num_rows}")  # Or len(df)
logger.info(f"Number of columns: {df.num_cols}")
logger.info(f"Column names: {df.column_names}")
logger.info(f"Total size in bytes: {df.total_bytes}")

print("\n--- 4. Previewing and Printing Data ---")
# Generate a formatted string representation of 
# the DataFrame's head and tail
data_preview_str = df.to_string(head_rows=5, tail_rows=5, 
                                    first_cols=3, last_cols=3)
logger.info(f"DataFrame Preview:\n{data_preview_str}\n")
# Note: Simply printing the object might also provide a summary
# logger.info(df)

print("\n--- 5. Streaming Data in Chunks ---")
# Iterate over the data in chunks of up to 100 rows at a time
for chunk in df.get_stream(max_chunksize=100):
    logger.info(f"Processing chunk with {chunk.num_rows} rows...")
    # logger.info(chunk) # You can print or process the chunk here

print("\n--- 6. Selecting and Filtering Data ---")
## Column Selection
logger.info(f"Selecting a single column:
                {df['col1']}\n")
logger.info(f"Selecting multiple columns:
                {df.select('col1', 'col2', 'col3')}\n")

## Row Selection and Slicing
logger.info(f"Selecting the first row (index 0):
                {df[0]}\n")
logger.info(f"Selecting a specific cell (row 0, column 'col1'):
                {df[0]['col1']}\n")
logger.info(f"Selecting the first 10 rows:
                {df.limit(10)}\n")
logger.info(f"Selecting rows from index 2 up to 
                (but not including) 4:{df.slice(2, 4)}\n")

## Conditional Filtering using expressions
# Example 1: Filter rows where 'col1' is less than or equal to 30
expression1 = "col1 <= 30"
# Example 2: Filter rows where 'col2' equals a specific string
expression2 = "col2 == 'example_string'"
# Example 3: Combine conditions on multiple columns
expression3 = "(col1 > 10) & (col3 < 50)"
# Example 4: Filter rows where 'col4' is in a list of values
expression4 = "col4.isin([1, 2, 3])"
# Example 5: Filter rows where 'col5' is not null
expression5 = "col5.notnull()"
# Example 6: A more complex combination of conditions
expression6 = "((col1 < 10) | (col2 == 'example_string')) 
                                & (col3 != 0)"

logger.info(f"Result of filtering with '{expression1}':
                {df.filter(expression1)}\n")

print("\n--- 7. Performing SQL Queries ---")
sql_query = (
    "SELECT OBJECTID, start_l, end_l "
    "FROM dataframe "
    "WHERE OBJECTID <= 30 "
    "ORDER BY OBJECTID DESC"
)
sql_result = df.sql(sql_query)
logger.info(f"SQL query result:\n{sql_result}")
]]></sourcecode>
    </section>
    <section anchor="references">
      <name>References</name>
      <section anchor="normative-references">
        <name>Normative References</name>
        <t><xref target="RFC2119"/><br/>
          <xref target="RFC8174"/><br/>
          <xref target="RFC8446"/></t>
      </section>
      <section anchor="informative-references">
        <name>Informative References</name>
        <t><xref target="RFC6838"/><br/>
          <xref target="Apache-Arrow-Flight"/></t>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
