From 1f1bcca883c6cdf719b213c7f1615f6ce4b38932 Mon Sep 17 00:00:00 2001 From: Julia Pampus <72392527+juliapampus@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:34:21 +0100 Subject: [PATCH] chore: refactor transfer process description (#238) * fix: resolve spelling mistake * chore: update TP process description and diagrams * chore: fix broken references * chore: add dataAddress to sequence diagrams * chore: apply feedback --- catalog/catalog.binding.https.md | 4 +- catalog/catalog.protocol.md | 46 +++++++++--------- catalog/message/example/catalog.json | 4 +- catalog/message/example/dataset.json | 2 +- model/model.md | 2 +- releases/v0.8/catalog/message/catalog.json | 2 +- transfer/figures/pull-transfer-process.png | Bin 21672 -> 22994 bytes transfer/figures/pull-transfer-process.puml | 42 ++++++++-------- transfer/figures/push-transfer-process.png | Bin 22208 -> 17103 bytes transfer/figures/push-transfer-process.puml | 40 +++++++--------- transfer/transfer.process.protocol.md | 50 ++++++++++++-------- 11 files changed, 98 insertions(+), 94 deletions(-) diff --git a/catalog/catalog.binding.https.md b/catalog/catalog.binding.https.md index 7ac0b2aa..ca65f4b2 100644 --- a/catalog/catalog.binding.https.md +++ b/catalog/catalog.binding.https.md @@ -52,7 +52,7 @@ Authorization: ... } ``` -- The `Authorization` header is optional if the [Catalog Service](../model/terminology.md#catalog-service) does not require authorization. If present, the contents of the `Authorization` header are detailed in the [Authorization section](#13-authorization). +- The `Authorization` header is optional if the [Catalog Service](../model/terminology.md#catalog-service) does not require authorization. If present, the contents of the `Authorization` header are detailed in the [Authorization section](../common/common.binding.https.md#2-authorization). - The `filter` property is optional. If present, the `filter` property can contain an implementation-specific filter expression or query to be executed as part of the [Catalog](../model/terminology.md#catalog) request. If a filter expression is not supported by an implementation, it must return a HTTP 400 (Bad Request) response. @@ -80,7 +80,7 @@ Authorization: ... } ``` -- The `Authorization` header is optional if the [Catalog Service](../model/terminology.md#catalog-service) does not require authorization. If present, the contents of the `Authorization` header are detailed in the [Authorization section](#13-authorization). +- The `Authorization` header is optional if the [Catalog Service](../model/terminology.md#catalog-service) does not require authorization. If present, the contents of the `Authorization` header are detailed in the [Authorization section](../common/common.binding.https.md#2-authorization). ##### Response diff --git a/catalog/catalog.protocol.md b/catalog/catalog.protocol.md index aafc0ce5..8429f115 100644 --- a/catalog/catalog.protocol.md +++ b/catalog/catalog.protocol.md @@ -2,29 +2,29 @@ This document outlines the [Catalog Protocol](../model/terminology.md#catalog-protocol). The used terms are described [here](../model/terminology.md). -- [Catalog Protocol](#catalog-protocol) - - [1 Introduction](#1-introduction) - - [1.1 DCAT Vocabulary Mapping](#11-dcat-vocabulary-mapping) - - [1.1.1 Dataset](#111-dataset) - - [odrl:hasPolicy](#odrlhaspolicy) - - [1.1.2 Distributions](#112-distributions) - - [1.1.3 Data Service](#113-data-service) - - [dspace:dataServiceType](#dspacedataservicetype) - - [dcat:servesDataset](#dcatservesdataset) - - [1.2 DCAT and ODRL Profiles](#12-dcat-and-odrl-profiles) - - [2 Message Types](#2-message-types) - - [2.1 Catalog Request Message](#21-catalog-request-message) - - [2.2 Dataset Request Message](#22-dataset-request-message) - - [3 Response Types](#3-response-types) - - [3.1 ACK - Catalog](#31-ack---catalog) - - [3.2 ACK - Dataset](#32-ack---dataset) - - [3.3 ERROR - Catalog Error](#33-error---catalog-error) - - [4 Technical Considerations](#4-technical-considerations) - - [4.1 Queries and Filter Expressions](#41-queries-and-filter-expressions) - - [4.2 Replication Protocol](#42-replication-protocol) - - [4.3 Security](#43-security) - - [4.3.1 The Proof Metadata Endpoint](#431-the-proof-metadata-endpoint) - - [4.4 Catalog Brokers](#44-catalog-brokers) +* [1 Introduction](#1-introduction) + * [1.1 DCAT Vocabulary Mapping](#11-dcat-vocabulary-mapping) + * [1.1.1 Dataset](#111-dataset) + * [odrl:hasPolicy](#odrl--haspolicy) + * [1.1.2 Distributions](#112-distributions) + * [1.1.3 Data Service](#113-data-service) + * [dspace:dataServiceType](#dspace--dataservicetype) + * [dcat:servesDataset](#dcat--servesdataset) + * [1.1.4 Participant Id](#114-participant-id) + * [1.2 DCAT and ODRL Profiles](#12-dcat-and-odrl-profiles) +* [2 Message Types](#2-message-types) + * [2.1 Catalog Request Message](#21-catalog-request-message) + * [2.2 Dataset Request Message](#22-dataset-request-message) +* [3 Response Types](#3-response-types) + * [3.1 ACK - Catalog](#31-ack---catalog) + * [3.2 ACK - Dataset](#32-ack---dataset) + * [3.3 ERROR - Catalog Error](#33-error---catalog-error) +* [4 Technical Considerations](#4-technical-considerations) + * [4.1 Queries and Filter Expressions](#41-queries-and-filter-expressions) + * [4.2 Replication Protocol](#42-replication-protocol) + * [4.3 Security](#43-security) + * [4.3.1 The Proof Metadata Endpoint](#431-the-proof-metadata-endpoint) + * [4.4 Catalog Brokers](#44-catalog-brokers) ## 1 Introduction diff --git a/catalog/message/example/catalog.json b/catalog/message/example/catalog.json index bbda4c42..1f7fe036 100644 --- a/catalog/message/example/catalog.json +++ b/catalog/message/example/catalog.json @@ -19,7 +19,7 @@ "@id": "urn:uuid:4aa2dcc8-4d2d-569e-d634-8394a8834d77", "@type": "dcat:DataService", "dcat:endpointDescription": "dspace:connector", - "dcat:endpointURL": "https://provder-a.com/connector" + "dcat:endpointURL": "https://provider-a.com/connector" } ], "dcat:dataset": [ @@ -64,7 +64,7 @@ { "@id": "urn:uuid:4aa2dcc8-4d2d-569e-d634-8394a8834d77", "@type": "dcat:DataService", - "dcat:endpointURL": "https://provder-a.com/connector" + "dcat:endpointURL": "https://provider-a.com/connector" } ] } diff --git a/catalog/message/example/dataset.json b/catalog/message/example/dataset.json index d8e48844..29d581d6 100644 --- a/catalog/message/example/dataset.json +++ b/catalog/message/example/dataset.json @@ -37,7 +37,7 @@ "dcat:accessService": [ { "@id": "urn:uuid:4aa2dcc8-4d2d-569e-d634-8394a8834d77", - "dcat:endpointURL": "https://provder-a.com/connector" + "dcat:endpointURL": "https://provider-a.com/connector" } ] } diff --git a/model/model.md b/model/model.md index 088fa647..efdc6407 100644 --- a/model/model.md +++ b/model/model.md @@ -21,7 +21,7 @@ The relationships between the primary [Dataspace](./terminology.md#dataspace) en Note that all relationships are multiplicities unless specified. `Dataspace Authority` and `Dataspace Registry` are non-normative entities. - A [Dataspace Authority](./terminology.md#dataspace-authority) manages one or more [Dataspaces](./terminology.md#dataspace). This will include [Participant](./terminology.md#participant) registration and may entail mandating business and/or technical requirements. For example, a [Dataspace Authority](./terminology.md#dataspace-authority) may require [Participants](./terminology.md#participant) to obtain some form of business certification. A [Dataspace Authority](./terminology.md#dataspace-authority) may also impose technical requirements such as support for the technical enforcement of specific usage policies. -- A [Dataspace Registry](./terminology.md#dataspace-registration-service-dataspace-registry) records dataspace participants. +- A [Dataspace Registry](./terminology.md#dataspace-registration-service--dataspace-registry-) records dataspace participants. - A [Participant](./terminology.md#participant) is a member of one or more [Dataspaces](./terminology.md#dataspace). A [Participant](./terminology.md#participant) registers [Participant Agents](./terminology.md#participant-agent) that perform tasks on its behalf. - A [Participant Agent](./terminology.md#participant-agent) performs tasks such as publishing a [Catalog](./terminology.md#catalog) or engaging in a [Transfer Process](./terminology.md#transfer-process). In order to accomplish these tasks, a [Participant Agent](./terminology.md#participant-agent) may use a _**verifiable presentation**_ generated from a _**credential**_ obtained from a third-party [Credential Issuer](./terminology.md#credential-issuer). A [Participant Agent](./terminology.md#participant-agent) may also use an _**ID token**_ issued by a third-party [Identity Provider](./terminology.md#identity-provider). Note that a [Participant Agent](./terminology.md#participant-agent) is a logical construct and does not necessarily correspond to a single runtime process. - An [Identity Provider](./terminology.md#identity-provider) is a trust anchor that generates `ID tokens` used to verify the identity of a [Participant Agent](./terminology.md#participant-agent). Multiple identity providers may operate in a [Dataspace](./terminology.md#dataspace). The types and semantics of ID tokens are not part of this specification. An [Identity Provider](./terminology.md#identity-provider) may be a third-party or a [Participant](./terminology.md#participant) itself (for example, in the case of decentralized identifiers). diff --git a/releases/v0.8/catalog/message/catalog.json b/releases/v0.8/catalog/message/catalog.json index 4be9a8e5..06e72945 100644 --- a/releases/v0.8/catalog/message/catalog.json +++ b/releases/v0.8/catalog/message/catalog.json @@ -16,7 +16,7 @@ "@id": "urn:uuid:4aa2dcc8-4d2d-569e-d634-8394a8834d77", "@type": "dcat:DataService", "dcat:endpointDescription": "dspace:connector", - "dcat:endpointURL": "https://provder-a.com/connector" + "dcat:endpointURL": "https://provider-a.com/connector" } ], "dcat:dataset": [ diff --git a/transfer/figures/pull-transfer-process.png b/transfer/figures/pull-transfer-process.png index 2507d1fb0e7eb5fb382888d9fb2ddc9de4d32785..ed925de1d3c60054a5d579b3e61b7872180df7b0 100644 GIT binary patch literal 22994 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 z zmZN-xoCeatTNRng^ohDA3frfxE?2bvR4V*!X{Vc;@X)am(_Z#te)@-7dJ&jxad*tmKmoJ45RL5?4^f+Gofa?<` zItM-;Q+8bbb<~Poc^mwr*Y^;^UhwHqX69dg?_$rw(kRP146#RX& z*kyf~oY;|&oZ{3naeV@Y#7E$mczmz$@jHJ^?e9F+y+6-)@eb}oUny|lEbbl3)`~bj z+-;^OIKQ$Ky=~7pZunIl(!1}7ZGWKhNhmxN^Y!1B7He<|FW^w1rk#k3PFIBLN?jjjiki;UCk#zyJxWS+u_i$*ucy<6W4fOJDeeVk)oCBf36J zCRmB4{La~5XUTkU^?3W5=I8Mu;gR4t8KKL)`={ebu0FDYyIecvo9)W-MeRgA%dCxt zEA)=RUMrRBtWE*tHN*}CMcA&|0*>xuf0?-cz_WMj5&z$KU*502L5%gO)zxXRgzP5% z>Bm%0{{J5ye0JHysqfXjNch3m=eOm*x7u9p;cMIeV68R(#GlFeJzl@Sj(PT`GVt-? z<%d_>#{8Q6AyZ3tUPRcrqYKpM&oWY0vVEOXc5mrXLv8KQb)QO4`6GwXa~GG*@lQDU zGQA!FQ_rBk>JAjK2-lxEO(QVwAhSqPun*;!r4p=TZGj`#bT%;~RY? z;KVNcJbv}Z(kkG2AMLQ?tGd(wF#qMaJy8pE{)l1u#ve=Uf#-vCfld#hq_P55-iw8Q z&UV|pbz(Lb_*4$qiCITl|0G{w+xs>-5q3@qumb+~Z`JN}{ZHR}kKMY-UH(rl{)D=p zy21ZlvzLL6JyF(s!YsTFcoxTEM@Ofst-Idv9zTEpI%8zfp`Q8J6US~%^&;D}$ z_xs4*W6Pt&n@yaIj>=~OtKkrzY*4f0z`@7Ue;v8+?e)~2S?bA>>zAa_k5dD>*dgoL zO}o?Y9t6iaHM2MY&k(7pD+Qj2mT}Z$-#Mpw^XH$Bcbp461tgcyDImLwpYz#Q3Rq_d zeY(@`y?4)2`+rsyUxCN8btg_R@sL#!xO5`@8fU`B2<@^@rDC7D#a-){^()Ao1`bvM z>&~5JZ>8otvN%d4^lb=Uw!|qeAfVvenl^b3g${P6_q&0Mk+2-oIdc-1pEHgjJ8OO#m5H)!WPQeZhA(g5l#mnk`oCJmGA#EwDtG7_=&y_0 z`|H6$=DJ%7tAI--_HWoAu$!xC!-1ZL%EaG~ZDm_zb^zxtfTIdrTwHpu9G1X?P@5F;7=h>J39vY-09RR~(9ixeFZP*x V^jK8dGT`CL44$rjF6*2Ung9yovhDx? literal 21672 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 PLlK?|OFYgNRCoIys4oG2 diff --git a/transfer/figures/pull-transfer-process.puml b/transfer/figures/pull-transfer-process.puml index 6d015474..d2074426 100644 --- a/transfer/figures/pull-transfer-process.puml +++ b/transfer/figures/pull-transfer-process.puml @@ -1,42 +1,42 @@ @startuml "pull-transfer-process" !pragma layout smetana -!include ../common/style/diagram.styles.puml +!include ../../common/style/diagram.styles.puml hide empty description skinparam defaultTextAlignment center box Consumer -participant DataPlane1 -participant ControlPlane1 +participant DataPlane_C +participant ControlPlane_C end box box Provider -participant ControlPlane2 -participant DataPlane2 +participant ControlPlane_P +participant DataPlane_P end box -activate ControlPlane1 -activate ControlPlane2 +activate ControlPlane_C +activate ControlPlane_P -ControlPlane1 -> ControlPlane2 : TransferRequestMessage -ControlPlane2 --> ControlPlane1 : ACK +ControlPlane_C -> ControlPlane_P : TransferRequestMessage -ControlPlane2 -> ControlPlane1 : TransferStartMessage(dataAddress) -ControlPlane1 --> ControlPlane2 : ACK +ControlPlane_P -> ControlPlane_C : TransferStartMessage(dataAddress) -activate DataPlane1 -DataPlane1 -> DataPlane2 : pullData -activate DataPlane2 -DataPlane2 --> DataPlane1 : data -deactivate DataPlane2 -deactivate DataPlane1 +activate DataPlane_C +activate DataPlane_P +DataPlane_C -> DataPlane_P : pull data +deactivate DataPlane_P +deactivate DataPlane_C -ControlPlane1 -> ControlPlane2 : TransferCompletionMessage -ControlPlane2 --> ControlPlane1 : ACK +alt "Consumer ends TP" + ControlPlane_C -> ControlPlane_P : TransferCompletionMessage +else "Provider ends TP" + ControlPlane_P -> ControlPlane_C : TransferCompletionMessage +end -deactivate ControlPlane1 -deactivate ControlPlane2 +deactivate ControlPlane_C +deactivate ControlPlane_P @enduml diff --git a/transfer/figures/push-transfer-process.png b/transfer/figures/push-transfer-process.png index f861f8d007f96465c00c01599f962517dc33a6a0..8b53c23d15355605da067b439cf22791ee2feab4 100644 GIT binary patch literal 17103 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 literal 22208 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 H+TQ;Qh8OYk diff --git a/transfer/figures/push-transfer-process.puml b/transfer/figures/push-transfer-process.puml index e5c76ec6..55ac336f 100644 --- a/transfer/figures/push-transfer-process.puml +++ b/transfer/figures/push-transfer-process.puml @@ -1,42 +1,38 @@ @startuml "push-transfer-process" !pragma layout smetana -!include ../common/style/diagram.styles.puml +!include ../../common/style/diagram.styles.puml hide empty description skinparam defaultTextAlignment center box Consumer -participant DataPlane1 -participant ControlPlane1 +participant DataPlane_C +participant ControlPlane_C end box box Provider -participant ControlPlane2 -participant DataPlane2 +participant ControlPlane_P +participant DataPlane_P end box -activate ControlPlane1 -activate ControlPlane2 +activate ControlPlane_C +activate ControlPlane_P -ControlPlane1 -> ControlPlane2 : TransferRequestMessage(dataAddress) -ControlPlane2 --> ControlPlane1 : ACK +ControlPlane_C -> ControlPlane_P : TransferRequestMessage(dataAddress) -ControlPlane2 -> ControlPlane1 : TransferStartMessage -ControlPlane1 --> ControlPlane2 : ACK +ControlPlane_P -> ControlPlane_C : TransferStartMessage -activate DataPlane2 -DataPlane2 -> DataPlane1 : pushData(data) -activate DataPlane1 -DataPlane1 --> DataPlane2 : ACK -deactivate DataPlane2 -deactivate DataPlane1 +activate DataPlane_C +activate DataPlane_P +DataPlane_P -> DataPlane_C : push data +deactivate DataPlane_P +deactivate DataPlane_C -ControlPlane2 -> ControlPlane1 : TransferCompletionMessage -ControlPlane1 --> ControlPlane2 : ACK +ControlPlane_P -> ControlPlane_C : TransferCompletionMessage -deactivate ControlPlane1 -deactivate ControlPlane2 +deactivate ControlPlane_C +deactivate ControlPlane_P -@enduml +@enduml \ No newline at end of file diff --git a/transfer/transfer.process.protocol.md b/transfer/transfer.process.protocol.md index a87f8470..61683443 100644 --- a/transfer/transfer.process.protocol.md +++ b/transfer/transfer.process.protocol.md @@ -3,13 +3,14 @@ This document outlines the key elements of the [Transfer Process Protocol](../model/terminology.md#transfer-process-protocol). The used terms are described [here](../model/terminology.md). * [1 Introduction](#1-introduction) - * [1.1 Control and Data Planes](#11-control-and-data-planes) - * [1.2 Dataset Transfer Types](#12-dataset-transfer-types) - * [1.2.1 Push Transfer](#121-push-transfer) - * [1.2.2 Pull Transfer](#122-pull-transfer) - * [1.2.3 Finite and Non-Finite Data](#123-finite-and-non-finite-data) - * [1.3 States](#13-states) - * [1.4 State Machine](#14-state-machine) + * [1.1 Prerequisites](#11-prerequisites) + * [1.1.1 Control and Data Planes](#111-control-and-data-planes) + * [1.1.2 Data Transfer Types](#112-data-transfer-types) + * [Push Transfer](#push-transfer) + * [Pull Transfer](#pull-transfer) + * [Finite and Non-Finite Data](#finite-and-non-finite-data) + * [1.2 States](#12-states) + * [1.3 State Machine](#13-state-machine) * [2 Message Types](#2-message-types) * [2.1 Transfer Request Message](#21-transfer-request-message) * [2.2 Transfer Start Message](#22-transfer-start-message) @@ -22,36 +23,43 @@ This document outlines the key elements of the [Transfer Process Protocol](../mo ## 1 Introduction -A [Transfer Process](../model/terminology.md#transfer-process) (TP) involves two parties, a [Provider](../model/terminology.md#provider) that offers one or more [Datasets](../model/terminology.md#dataset) under a [Usage Policy](../model/terminology.md#policy) and [Consumer](../model/terminology.md#consumer) that requests [Datasets](../model/terminology.md#dataset). A TP progresses through a series of states, which are controlled by the [Provider](../model/terminology.md#provider) and [Consumer](../model/terminology.md#consumer) using messages. A TP transitions to another state as a result of an exchanged message. +A [Transfer Process](../model/terminology.md#transfer-process) (TP) involves two parties, a [Provider](../model/terminology.md#provider) that offers one or more [Datasets](../model/terminology.md#dataset) under a [Usage Policy](../model/terminology.md#policy) and a [Consumer](../model/terminology.md#consumer) that requests [Datasets](../model/terminology.md#dataset). A TP progresses through a series of states, which are controlled by the [Provider](../model/terminology.md#provider) and [Consumer](../model/terminology.md#consumer) using messages. A TP transitions to another state as a result of an exchanged message. -A TP is managed by a [Connector](../model/terminology.md#connector--data-service-). The [Connector](../model/terminology.md#connector--data-service-) serves as a coordinating technical entity that receives counter-party messages and manages its local state of the TP. It may as well also operate the hosting of the [Datasets](../model/terminology.md#dataset), or control their offering through another system. +### 1.1 Prerequisites -### 1.1 Control and Data Planes -A TP is managed by a [Connector](../model/terminology.md#connector--data-service-). The [Connector](../model/terminology.md#connector--data-service-) consists of two logical components, a _Control Plane_ and a _Data Plane_. The Control Plane serves as a coordinating layer that receives counter-party messages and manages the TP state. The Data Plane performs the actual transfer of [Datasets](../model/terminology.md#dataset) using a wire protocol. Both participants run Control and Data Planes. +To put the document into the right context, some non-normative descriptions of the core concepts follow in this subsection. -It is important to note that the Control and Data Planes are logical constructs. Implementations may choose to deploy both components within a single process or across heterogeneous clusters. +#### 1.1.1 Control and Data Planes -### 1.2 Dataset Transfer Types +A TP involves two logical constructs, a control plane and a data plane. Serving as a coordinating layer, services on the _control plane_ receive messages and manage the local state of the TP (same as for the [Catalog Protocol](../model/terminology.md#catalog-protocol) and the [Contract Negotiation Protocol](../model/terminology.md#contract-negotiation-protocol)). On the _data plane_, the actual transfer of data takes place using a wire protocol. Both participants in a data sharing scenario run services logically regarded as control and/or data plane services. + +The specification of data plane interfaces and interaction patterns are not in scope of this document. + +#### 1.1.2 Data Transfer Types [Dataset](../model/terminology.md#dataset) transfers are characterized as `push` or `pull` transfers and it's data is either `finite` or `non-finite`. This section describes the difference between these types. -#### 1.2.1 Push Transfer +##### Push Transfer -A push transfer is when the [Provider's](../model/terminology.md#provider) Data Plane initiates sending of data to a [Consumer](../model/terminology.md#consumer) endpoint. For example, after the [Consumer](../model/terminology.md#consumer) has issued a [Transfer Request Message](#21-transfer-request-message), the [Provider](../model/terminology.md#provider) begins data transmission to an endpoint specified by the [Consumer](../model/terminology.md#consumer) using an agreed-upon wire protocol. +A push transfer is when the [Provider's](../model/terminology.md#provider) data plane initiates sending data to a [Consumer](../model/terminology.md#consumer) endpoint. For example, after the [Consumer](../model/terminology.md#consumer) has issued a [Transfer Request Message](#21-transfer-request-message), the [Provider](../model/terminology.md#provider) begins data transmission to an endpoint specified by the [Consumer](../model/terminology.md#consumer) using an agreed-upon wire protocol. ![](./figures/push-transfer-process.png) -#### 1.2.2 Pull Transfer +_Note that the illustration of the sequence is only exemplary. The activation of actors is not determined, also, responses, parameters, possible recursions, and interactions between the components of one participant are not shown._ -A pull transfer is when the [Consumer](../model/terminology.md#consumer) Data Plane initiates retrieval of data from a [Provider](../model/terminology.md#provider) endpoint. For example, after the [Provider](../model/terminology.md#provider) has issued a [Transfer Start Message](#22-transfer-start-message), the [Consumer](../model/terminology.md#consumer) can request the data from the [Provider](../model/terminology.md#provider)-specified endpoint. +##### Pull Transfer + +A pull transfer is when the [Consumer's](../model/terminology.md#consumer) data plane initiates retrieval of data from a [Provider](../model/terminology.md#provider) endpoint. For example, after the [Provider](../model/terminology.md#provider) has issued a [Transfer Start Message](#22-transfer-start-message), the [Consumer](../model/terminology.md#consumer) can request the data from the [Provider](../model/terminology.md#provider)-specified endpoint. ![](./figures/pull-transfer-process.png) -#### 1.2.3 Finite and Non-Finite Data +_Note that the illustration of the sequence is only exemplary. The activation of actors is not determined, also, responses, parameters, possible recursions, and interactions between the components of one participant are not shown._ + +##### Finite and Non-Finite Data -Data may be `finite` or `non-finite.` Finite data is data that is defined by a finite set, for example, machine learning data or images. After finite data transmission has finished, the TP is completed. Non-finite data is data that is defined by an infinite set or has no specified end, for example streams or an API endpoint. With non-finite data, a TP will continue indefinitely until either the [Consumer](../model/terminology.md#consumer) or [Provider](../model/terminology.md#provider) explicitly terminates the transmission. +Data may be `finite` or `non-finite`. This applies to either push and pull transfers. Finite data is data that is defined by a finite set, for example, machine learning data or images. After finite data transmission has finished, the TP is completed. Non-finite data is data that is defined by an infinite set or has no specified end, for example, streams or an API endpoint. With non-finite data, a TP will continue indefinitely until either the [Consumer](../model/terminology.md#consumer) or [Provider](../model/terminology.md#provider) explicitly terminates the transmission. -### 1.3 States +### 1.2 States The TP states are: @@ -61,7 +69,7 @@ The TP states are: - **SUSPENDED**: The transfer has been suspended by the [Consumer](../model/terminology.md#consumer) or the [Provider](../model/terminology.md#provider). - **TERMINATED**: The [Transfer Process](../model/terminology.md#transfer-process) has been terminated by the [Consumer](../model/terminology.md#consumer) or the [Provider](../model/terminology.md#provider). -### 1.4 State Machine +### 1.3 State Machine The TP state machine is represented in the following diagram: