<?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-00" category="exp" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title abbrev="DACP Protocol">DACP: Data Access and Collaboration Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-shenzhihong-dacp-00"/>
    <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="September" day="11"/>
    <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 (defaults to 3101)</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:3101</tt></t>
          </li>
          <li>
            <t><tt>dacp://10.0.0.1:3101/weather_db</tt></t>
          </li>
          <li>
            <t><tt>dacp://10.0.0.1:3101/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 connection using DACP URI. Handshake with protocol version negotiation and authentication.</t>
          </li>
          <li>
            <t>Client sends requests (e.g., data streaming). For each request, the client must include a valid security token in the message. If the token is invalid or expired, the server will reject the request and return an error message.</t>
          </li>
          <li>
            <t>Server validates the token on every incoming request to ensure the client is authenticated and returns a flight ticket.</t>
          </li>
          <li>
            <t>Client requests data stream with the ticket. This request must also contain the security token for stateless validation.</t>
          </li>
          <li>
            <t>Server validates token and verifies the ticket. 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 Flight Ticket --------------------|
    |                                                |
    |--- 4. Request Data Stream with Ticket -------->|
    |    (Payload includes Auth Token again)         |
    |                                                |
    |           (Server: validates token again,      |
    |            verifies ticket, 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>
              </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">suffix</th>
              <th align="left">type</th>
              <th align="left">size</th>
              <th align="left">time</th>
              <th align="left">blob</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">results.csv</td>
              <td align="left">/xxx</td>
              <td align="left">csv</td>
              <td align="left">File</td>
              <td align="left">10240</td>
              <td align="left">(datetime)</td>
              <td align="left">(...)</td>
            </tr>
            <tr>
              <td align="left">plot.png</td>
              <td align="left">/yyy</td>
              <td align="left">png</td>
              <td align="left">File</td>
              <td align="left">204800</td>
              <td align="left">(datetime)</td>
              <td align="left">(...)</td>
            </tr>
          </tbody>
        </table>
        <t>A client can efficiently query the metadata (<tt>name</tt>, <tt>size</tt>) for all files. Only when the client requests <tt>df[1]['blob']</tt> will the server read <tt>plot.png</tt> from disk and stream its 204800 bytes.</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> 3101</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 425?>

<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:50201"
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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
zG1cczDf7s6O9sXjOhgEV1tsnPJF+fQ+IRsCU2qO27Po9lJmIOp5TmM70ilc
x9U7f9mozMN66o7/9mwg1/P1+wQvpqjvmt/t0MO/5AuurGIMGH+TqZpymB19
7g0U4cZ/DpRZWn3FwbYmsULnSzt4rO3cTbb3k9h2TOGtgxXqIgb6aZO+3N38
IGTw0Ezud/8se6+byl5xKTN2Df67p/99stmRFfjyMTIqHfRycwPMcDLYHlrf
KwK+H02ukLcH2dzRzhc2E1zJO4pJ+UFCmh37q6tGwH9w7q9DmAd4V2h1Pcbc
PaCfn42JnY1Z2fmeMsLKnG14PGhocmWTHbN/wGdDGI7be12zHxzEkb22kWSr
pzaxJYP7H1uu79jsHuiLApPc1yAYgSuW6o8PZ/wjRv9YyI3bT3ZafrZdmIcY
YL59Tt9sBJPvPTT53qZMVoZnJ8I0mHlPZ97DpYib6sSozN0M13ni7vgML67M
sxUyDyZ/gsnbDPd3dKYd8zuDT0/Mt+bpTiecff+hXexvSsN9kC6Ty+yDZfZ1
D/v9hE6h/dNu19CZPflQW+HpQys83XS/S4FfU/fTPtVpn/bpS3zXrk34DHkT
+dUQvQlZrtx2Ks+jKZj0GaNEcPIt4+QT42Qt/judLys3i9L/89wApQ120Cvd
5CqJKvDPN+8C6iLDci2n6Z2awZuWD2pC+Pd9xMphBPD9Mn86NX/SO6FF/Jb/
SC+lH/u5afNCG+fHp8dHF+bti3+n/+AnIvhnZC5T9LqML1MjvzW/8ers7Wtv
ntqncrupHSssYb97e/by+My8+Iv/+uXx+dFGS6DQO+HYtKDPbQfZihihTQjI
MgRGgJ8ARpNW6rswccnC4Y1krK7j2hfhL+OaVvjbuPYTRx95BpegXjfHs2+e
fKOj1v40duu/ALfL3CmngQAA

-->

</rfc>
