<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ouroboros.rocks/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dstaesse</id>
	<title>Ouroboros - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ouroboros.rocks/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dstaesse"/>
	<link rel="alternate" type="text/html" href="https://ouroboros.rocks/wiki/Special:Contributions/Dstaesse"/>
	<updated>2026-04-26T06:18:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=187</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=187"/>
		<updated>2022-06-05T09:24:29Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* EID */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into account memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. This endpoint uniquely identifies an application/service at the destination, so this field is not identical in function to the &#039;&#039;protocol&#039;&#039; or &#039;&#039;next header&#039;&#039; field in IPv4 or IPv6, but rather it more closely resembles the function of the (ephemeral) &#039;&#039;port&#039;&#039; field in UDP or TCP. &lt;br /&gt;
&lt;br /&gt;
There is no reason for an N-layer protocol to know anything about the (N + 1)-Layer protocol it is transporting. Ouroboros does have a notion of &#039;&#039;reserved EID&#039;&#039; for functions that are &#039;&#039;internal&#039;&#039; to an N-layer, such as the [[Flow Allocator | flow allocator]] and the [[directory]].&lt;br /&gt;
&lt;br /&gt;
The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields that are not present in ODTP ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
This protocol is secure as there are no unnecessary mutable fields. For comparison with IPv4 or IPv6, all the fields that are protected by IPSec are simply not present in our protocol.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=186</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=186"/>
		<updated>2022-06-05T09:12:53Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Protocol Header */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into account memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields that are not present in ODTP ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
This protocol is secure as there are no unnecessary mutable fields. For comparison with IPv4 or IPv6, all the fields that are protected by IPSec are simply not present in our protocol.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=185</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=185"/>
		<updated>2022-06-05T09:08:55Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Notable fields not present in ODTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields that are not present in ODTP ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
This protocol is secure as there are no unnecessary mutable fields. For comparison with IPv4 or IPv6, all the fields that are protected by IPSec are simply not present in our protocol.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=184</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=184"/>
		<updated>2022-06-05T09:08:39Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Notable fields not present */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present in ODTP ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
This protocol is secure as there are no unnecessary mutable fields. For comparison with IPv4 or IPv6, all the fields that are protected by IPSec are simply not present in our protocol.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=183</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=183"/>
		<updated>2022-06-05T09:05:53Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
This protocol is secure as there are no unnecessary mutable fields. For comparison with IPv4 or IPv6, all the fields that are protected by IPSec are simply not present in our protocol.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=182</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=182"/>
		<updated>2022-06-05T09:05:21Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Notable fields not present */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
This protocol is secure as there are no unnecessary mutable fields. All the fields that are protected by IPSec are simply not present in our protocol.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=181</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=181"/>
		<updated>2022-06-05T09:04:35Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
&lt;br /&gt;
This protocol is secure as there are no unnecessary mutable fields.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=180</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=180"/>
		<updated>2022-06-05T09:01:59Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Notable fields not present */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed. None of the existing options in IPv4 or IPv6 are useful.&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed, because there are no optional fields that apply only to some flows.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=179</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=179"/>
		<updated>2022-06-05T09:00:50Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Source address */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
There is no need for a source address in the header. The source address is exchanged during [[Flow Allocation | flow allocation]], and when sending a packet, the destination can be found in the flow allocator&#039;s flow table. Intermediate forwarding functions do not need to know the source address. Routing based on a host source address can&#039;t possibly scale, routing on prefixes is questionable, and spoofing source prefixes can&#039;t be avoided.&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=178</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=178"/>
		<updated>2022-06-05T08:57:08Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
There is no need for a version of the ODTP protocol, even if future changes to the fields are made, or other fields are added. The Data Transfer protocol specification is shared between IPCPs on [[enrollment]].&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=177</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=177"/>
		<updated>2022-06-05T08:39:25Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Notable fields not present */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=176</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=176"/>
		<updated>2022-06-05T08:34:38Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Options ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=175</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=175"/>
		<updated>2022-06-05T08:34:08Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination, and is similar to IPv6, with further simplifications.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
=== Destination address === &lt;br /&gt;
&lt;br /&gt;
This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
=== Time-to-Live ===&lt;br /&gt;
&lt;br /&gt;
Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
=== QoS === &lt;br /&gt;
&lt;br /&gt;
Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
=== EID === &lt;br /&gt;
&lt;br /&gt;
The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
=== ECN ===&lt;br /&gt;
&lt;br /&gt;
This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
=== Version === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Source address ===&lt;br /&gt;
&lt;br /&gt;
Not needed&lt;br /&gt;
&lt;br /&gt;
=== Length === &lt;br /&gt;
&lt;br /&gt;
Not needed&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=174</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=174"/>
		<updated>2022-06-05T08:30:56Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
* Destination address: This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. &lt;br /&gt;
&lt;br /&gt;
* Time-to-Live: Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
* QoS: Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
* EID: The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation.&lt;br /&gt;
&lt;br /&gt;
* ECN: This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
== Rationale ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notable fields not present ==&lt;br /&gt;
&lt;br /&gt;
* version: Not needed&lt;br /&gt;
&lt;br /&gt;
* source address: Not needed&lt;br /&gt;
&lt;br /&gt;
* payload or header length: Not needed&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=173</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=173"/>
		<updated>2022-06-05T08:28:30Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment.&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
* Destination address: This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. Note that there is no source address in this packet header, this is agreed upon during flow allocation.&lt;br /&gt;
&lt;br /&gt;
* Time-to-Live: Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
* QoS: Ouroboros supports Quality of Service via a number of methods, and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field is one octet long.&lt;br /&gt;
&lt;br /&gt;
* EID: The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable, but for security, it should be reasonably long to avoid an attacker guessing valid EID values (the figure shows 64 bits, which is the value used in the prototype). For efficiency, it should be easy to map and EID to a flow descriptor at the endpoints. The value of this field is chosen by the endpoint at flow allocation. It can be thought of as similar to an ephemeral port.&lt;br /&gt;
&lt;br /&gt;
* ECN: This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value can be set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=172</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=172"/>
		<updated>2022-06-05T08:20:35Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |    PADDING    |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
* Destination address: This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. Note that there is no source address, this is agreed upon during flow allocation.&lt;br /&gt;
&lt;br /&gt;
* Time-to-Live: Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
* QoS: Ouroboros supports Quality of Service via a number of methods (out of scope for this page), and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field takes one octet.&lt;br /&gt;
&lt;br /&gt;
* EID: The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable (the figure shows 16 bits). The values of this field is chosen by the endpoints, usually at flow allocation. It can be thought of as similar to an ephemeral port. However, in Ouroboros there is no hardcoded or standardized mapping of an EID to an application. For security, this field should be sufficiently large. For efficiency, it should be easy to map to a flow descriptor at the endpoints.&lt;br /&gt;
&lt;br /&gt;
* ECN: This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value is set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=171</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=171"/>
		<updated>2022-06-05T08:20:03Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
* Destination address: This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. Note that there is no source address, this is agreed upon during flow allocation.&lt;br /&gt;
&lt;br /&gt;
* Time-to-Live: Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
* QoS: Ouroboros supports Quality of Service via a number of methods (out of scope for this page), and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field takes one octet.&lt;br /&gt;
&lt;br /&gt;
* EID: The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable (the figure shows 16 bits). The values of this field is chosen by the endpoints, usually at flow allocation. It can be thought of as similar to an ephemeral port. However, in Ouroboros there is no hardcoded or standardized mapping of an EID to an application. For security, this field should be sufficiently large. For efficiency, it should be easy to map to a flow descriptor at the endpoints.&lt;br /&gt;
&lt;br /&gt;
* ECN: This field specifies Explicit Congestion Notification (ECN), and is, strictly speaking, part of the [[Flow Allocation Protocol]]. with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value is set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=170</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=170"/>
		<updated>2022-06-05T08:18:03Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment:&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |  Time-to-Live |      QoS      |      ECN      |               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
* Destination address: This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. Note that there is no source address, this is agreed upon during flow allocation.&lt;br /&gt;
&lt;br /&gt;
* Time-to-Live: Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
* QoS: Ouroboros supports Quality of Service via a number of methods (out of scope for this page), and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field takes one octet.&lt;br /&gt;
&lt;br /&gt;
* ECN: This field specifies Explicit Congestion Notification (ECN), with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value is set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
* EID: The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable (the figure shows 16 bits). The values of this field is chosen by the endpoints, usually at flow allocation. It can be thought of as similar to an ephemeral port. However, in Ouroboros there is no hardcoded or standardized mapping of an EID to an application. For security, this field should be sufficiently large. For efficiency, it should be easy to map to a flow descriptor at the endpoints.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=169</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=169"/>
		<updated>2022-06-05T08:15:30Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;br /&gt;
&lt;br /&gt;
== Protocol Header ==&lt;br /&gt;
&lt;br /&gt;
The field widths are not that important, but an optimized version would take into memory alignment:&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 | Time-to-Live  |      QoS      |      ECN      |               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                              EID                              +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
* Destination address: This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. Note that there is no source address, this is agreed upon during flow allocation.&lt;br /&gt;
&lt;br /&gt;
* Time-to-Live: Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
* QoS: Ouroboros supports Quality of Service via a number of methods (out of scope for this page), and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field takes one octet.&lt;br /&gt;
&lt;br /&gt;
* ECN: This field specifies Explicit Congestion Notification (ECN), with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value is set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
* EID: The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable (the figure shows 16 bits). The values of this field is chosen by the endpoints, usually at flow allocation. It can be thought of as similar to an ephemeral port. However, in Ouroboros there is no hardcoded or standardized mapping of an EID to an application. For security, this field should be sufficiently large. For efficiency, it should be easy to map to a flow descriptor at the endpoints.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=168</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=168"/>
		<updated>2022-06-05T08:10:57Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;br /&gt;
&lt;br /&gt;
As Ouroboros tries to preserve privacy as much as possible, it has an absolutely minimal network protocol. The field widths are not that important:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  0                   1                   2                   3&lt;br /&gt;
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +                      Destination Address                      +&lt;br /&gt;
 |                                                               |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 | Time-to-Live  |      QoS      |     ECN       |     EID       |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                              EID                              +&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The 5 fields in the Ouroboros network protocol are:&lt;br /&gt;
&lt;br /&gt;
    Destination address: This specifies the address to forward the packet to. The width of this field is configurable based on various preferences and the size of the envisioned network. The Ouroboros default is 64 bits. Note that there is no source address, this is agreed upon during flow allocation.&lt;br /&gt;
&lt;br /&gt;
    Time-to-Live: Similar to IPv4 (in IPv6 this field is replaced by the Hop Limit), this is decremented at each hop to ensures that packets don’t get forwarded forever in the network, for instance due to (transient) loops in the forwarding path. The Ouroboros default for the width is one octet (byte), limiting the Maximum Packet Lifetime in the network to 255 seconds. The initial TTL value for a flow can be based on the maximum delay requested by the application.&lt;br /&gt;
&lt;br /&gt;
    QoS: Ouroboros supports Quality of Service via a number of methods (out of scope for this page), and this field is used to prioritize scheduling of the packets when forwarding. For instance, if the network gets congested and queues start filling up, higher priority packets (e.g. a voice call) get scheduled more often than lower priority packets (e.g. a file download). By default this field takes one octet.&lt;br /&gt;
&lt;br /&gt;
    ECN: This field specifies Explicit Congestion Notification (ECN), with similar intent as the ECN bits in the Type-of-Service field in IPv4 / Traffic Class field in IPv6. The Ouroboros ECN field is by default one octet wide, and its value is set to an increasing value as packets are queued deeper and deeper in a congested routers’ forwarding queues. Ouroboros enforces Forward ECN (FECN).&lt;br /&gt;
&lt;br /&gt;
    EID: The Endpoint Identifier (EID) field specified the endpoint for which to deliver the packet. The width of this field is configurable (the figure shows 16 bits). The values of this field is chosen by the endpoints, usually at flow allocation. It can be thought of as similar to an ephemeral port. However, in Ouroboros there is no hardcoded or standardized mapping of an EID to an application. For security, this field should be sufficiently large. For efficiency, it should be easy to map to a flow descriptor at the endpoints.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=167</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=167"/>
		<updated>2022-06-05T08:10:33Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Packet Transfer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
=== Ouroboros Library ===&lt;br /&gt;
&lt;br /&gt;
The ouroboros library Application end-to-end IPC functions&lt;br /&gt;
&lt;br /&gt;
==== Application flow allocation ====&lt;br /&gt;
&lt;br /&gt;
==== FRCT ====&lt;br /&gt;
&lt;br /&gt;
[[FRCT]], implements [[FRCP]]&lt;br /&gt;
&lt;br /&gt;
==== Encryption =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Authentication ====&lt;br /&gt;
&lt;br /&gt;
Not yet implemented.&lt;br /&gt;
&lt;br /&gt;
==== Integrity ====&lt;br /&gt;
&lt;br /&gt;
CRC&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
==== Directory ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Flow allocator ====&lt;br /&gt;
&lt;br /&gt;
[[FLAP]]&lt;br /&gt;
&lt;br /&gt;
==== Packet Transfer ====&lt;br /&gt;
&lt;br /&gt;
[[ODTP]]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12/13 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ ccmake .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX&lt;br /&gt;
| Prefix to install Ouroboros&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
| Maximum time to acknowledge a packet (s)&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
| Maximum packet lifetime (s) &lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
| Maximum time to retransmit a packet (s)&lt;br /&gt;
| &lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
| DHT_ENROLL_SLACK&lt;br /&gt;
| DHT enrollment waiting time (ms)&lt;br /&gt;
| 0-999&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_CORE_LOCK&lt;br /&gt;
| Disable locking performance threads to a core&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_DDNS&lt;br /&gt;
| Disable DDNS support for ipcpd-udp&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_FUSE  &lt;br /&gt;
| Disable FUSE support for exporting metrics (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_LIBGCRYPT&lt;br /&gt;
| Disable libgcrypt support &lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_OPENSSL&lt;br /&gt;
| Disable OpenSSL support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_RAW_SOCKETS&lt;br /&gt;
| Disable raw socket support for Ethernet IPCPs&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_ROBUST_MUTEXES&lt;br /&gt;
| Disable robust mutex support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_HEADSPACE&lt;br /&gt;
| Bytes of headspace to reserve for future headers&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_TAILSPACE&lt;br /&gt;
| Bytes of tailspace to reserve for future tails&lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| ENROLL_TIMEOUT&lt;br /&gt;
| Timeout the IRMd waits for an IPCP to complete enrollment (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_LINUX_RTT_ESTIMATOR&lt;br /&gt;
| Use Linux RTT estimator formula instead of the TCP RFC formula&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_REORDER_QUEUE_SIZE&lt;br /&gt;
| Size of the reordering queue&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_INC_FACTOR&lt;br /&gt;
| Divisor for RTO increase after ACK timeout: RTO += RTX &amp;gt;&amp;gt; X&lt;br /&gt;
|&lt;br /&gt;
| 0: Karn/Partridge&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MDEV_MULTIPLIER&lt;br /&gt;
| Multiplier for deviation term in the RTO: RTO = sRTT + (mdev &amp;lt;&amp;lt; X)&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MIN&lt;br /&gt;
| Minimum Retransmission Timeout (RTO) for FRCT (us)&lt;br /&gt;
|&lt;br /&gt;
| 250&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_START_WINDOW&lt;br /&gt;
| Start window &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_TICK_TIME&lt;br /&gt;
| Tick time for FRCT activity (retransmission, acknowledgments) (us)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PREFIX &lt;br /&gt;
| Mountpoint for FUSE filesystem (observability)&lt;br /&gt;
|&lt;br /&gt;
| /tmp/ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when an IPCP faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_BROADCAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the broadcast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_CONN_WAIT_DIR &lt;br /&gt;
| Check the running state of the directory (DHT) when adding a data transfer connection&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_LO_MTU&lt;br /&gt;
| Restrict Ethernet MTU over loopback interface&lt;br /&gt;
|&lt;br /&gt;
| 1500&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_QDISC_BYPASS&lt;br /&gt;
| Bypass the Qdisc in the kernel when using raw sockets&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_RD_THR&lt;br /&gt;
| Number of reader threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_WR_THR&lt;br /&gt;
| Number of writer threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_FLOW_STATS &lt;br /&gt;
| Enable flow statistics tracking in IPCP (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LINUX_TIMERSLACK_NS&lt;br /&gt;
| Slack value for high resolution timers on Linux systems&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LOCAL_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_MIN_THREADS&lt;br /&gt;
| Minimum number of worker threads in the IPCP&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_BE_PRIO &lt;br /&gt;
| Priority for best effort QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VIDEO_PRIO&lt;br /&gt;
| Priority for video QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VOICE_PRIO&lt;br /&gt;
| Priority for voice QoS cube (0-99) &lt;br /&gt;
|&lt;br /&gt;
| 99&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_SCHED_THR_MUL&lt;br /&gt;
| Number of scheduler threads per QoS cube&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_MPL &lt;br /&gt;
| Default maximum packet lifetime for the UDP IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_RD_THR&lt;br /&gt;
| Number of reader threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3 &lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_WR_THR&lt;br /&gt;
| Number of writer threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UNICAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the unicast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60  &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when the IRMD faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 8      &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_FLOW_TIMEOUT &lt;br /&gt;
| Timeout for a flow allocation response (ms)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| IRMD_MIN_THREADS &lt;br /&gt;
| Minimum number of worker threads in the IRMd&lt;br /&gt;
|&lt;br /&gt;
| 8    &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_REQ_ARR_TIMEOUT&lt;br /&gt;
| Timeout for an application to respond to arrival of a new flow (ms) &lt;br /&gt;
|&lt;br /&gt;
| 500&lt;br /&gt;
|-&lt;br /&gt;
| PFT_SIZE&lt;br /&gt;
| Size of the PDU forwarding (hash) table &lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROC_FLOW_STATS&lt;br /&gt;
| Enable flow statistics tracking for application flows&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FLOWS&lt;br /&gt;
| Maximum number of flows in an application&lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FQUEUES&lt;br /&gt;
| Maximum number of flow sets per application &lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| PROG_RES_FDS&lt;br /&gt;
| Number of reserved flow descriptors per application&lt;br /&gt;
|&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| PTHREAD_COND_CLOCK&lt;br /&gt;
| Clock to use for condition variable timing &lt;br /&gt;
|&lt;br /&gt;
| CLOCK_MONOTONIC&lt;br /&gt;
|-&lt;br /&gt;
| QOS_DISABLE_CRC&lt;br /&gt;
| Ignores bit-error rate (BER) setting on all QoS cubes to avoid calculating CRCs&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| QUERY_TIMEOUT&lt;br /&gt;
| Timeout to query a name with an IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 3000&lt;br /&gt;
|-&lt;br /&gt;
| REG_TIMEOUT&lt;br /&gt;
| Timeout for registering a name (ms) &lt;br /&gt;
|&lt;br /&gt;
| 10000&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BLOCKING&lt;br /&gt;
| Use blocking writes for retransmission&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BUFFER_ON_HEAP&lt;br /&gt;
| Store packets for retransmission on the heap instead of in packet buffer&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| RXM_MIN_RESOLUTION&lt;br /&gt;
| Minimum retransmission delay (ns), as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_LEVELS&lt;br /&gt;
| Number of levels in the retransmission wheel&lt;br /&gt;
|&lt;br /&gt;
| 3    &lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_MULTIPLIER&lt;br /&gt;
| Factor for retransmission wheel levels as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_SLOTS_PER_LEVEL&lt;br /&gt;
| Number of slots per level in the retransmission wheel&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| SHM_BUFFER_SIZE&lt;br /&gt;
| Number of blocks in packet buffer, &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| SHM_PREFIX&lt;br /&gt;
| String to prepend to POSIX shared memory filenames&lt;br /&gt;
|&lt;br /&gt;
| ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_LOCKLESS&lt;br /&gt;
| Enable shared memory lockless rbuff support (experimental, unstable)&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_SIZE&lt;br /&gt;
| Number of blocks in rbuff buffer&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 1024&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_BLOCK_SIZE&lt;br /&gt;
| Packet buffer block size &lt;br /&gt;
| Defaults to pagesize for performance&lt;br /&gt;
| sysconf(_SC_PAGESIZE)&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_MULTI_BLOCK&lt;br /&gt;
| Packet buffer multiblock packet support (allows packets larger than block size)&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| SOCKET_TIMEOUT&lt;br /&gt;
| Default timeout for internal responses from IPCPs (ms)&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| SOCK_BUF_SIZE&lt;br /&gt;
| Size of the buffer used by the UNIX sockets for local IPC&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|-&lt;br /&gt;
| SYS_MAX_FLOWS&lt;br /&gt;
| Maximum number of total flows for this system&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=165</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=165"/>
		<updated>2022-06-05T08:09:53Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: Dstaesse moved page DT to ODTP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=164</id>
		<title>Ouroboros Data Transfer Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Data_Transfer_Protocol&amp;diff=164"/>
		<updated>2022-06-05T08:09:36Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros Data Transfer Protocol is the &#039;&#039;hop-by-hop&#039;&#039; protocol that forwards packets to their destination.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=157</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=157"/>
		<updated>2022-06-02T08:24:43Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;This wiki is still under construction&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=156</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=156"/>
		<updated>2022-06-02T08:24:09Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Under Construction ==&lt;br /&gt;
&lt;br /&gt;
This wiki is still under construction.&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=155</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=155"/>
		<updated>2022-06-02T08:23:31Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Under Construction&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=154</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=154"/>
		<updated>2022-06-02T06:51:21Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under Construction}}&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=153</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=153"/>
		<updated>2022-06-02T06:49:21Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=152</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=152"/>
		<updated>2022-06-02T06:49:07Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;|-&lt;br /&gt;
| Page under construction&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=146</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=146"/>
		<updated>2022-06-02T06:33:57Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=145</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=145"/>
		<updated>2022-06-02T06:33:00Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Page in progress}}&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=144</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=144"/>
		<updated>2022-06-01T14:58:12Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros&#039; main objectives are not in finding solutions to any practical or academic engineering problems that may exist in network architecures such as TCP/IP, OSI or [[RINA]]. Nor is it developed to add perceived missing functionality in existing network technologies.&lt;br /&gt;
&lt;br /&gt;
Its main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=143</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=143"/>
		<updated>2022-06-01T13:26:58Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Build configuration parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ ccmake .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX&lt;br /&gt;
| Prefix to install Ouroboros&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
| Maximum time to acknowledge a packet (s)&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
| Maximum packet lifetime (s) &lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
| Maximum time to retransmit a packet (s)&lt;br /&gt;
| &lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
| DHT_ENROLL_SLACK&lt;br /&gt;
| DHT enrollment waiting time (ms)&lt;br /&gt;
| 0-999&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_CORE_LOCK&lt;br /&gt;
| Disable locking performance threads to a core&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_DDNS&lt;br /&gt;
| Disable DDNS support for ipcpd-udp&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_FUSE  &lt;br /&gt;
| Disable FUSE support for exporting metrics (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_LIBGCRYPT&lt;br /&gt;
| Disable libgcrypt support &lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_OPENSSL&lt;br /&gt;
| Disable OpenSSL support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_RAW_SOCKETS&lt;br /&gt;
| Disable raw socket support for Ethernet IPCPs&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_ROBUST_MUTEXES&lt;br /&gt;
| Disable robust mutex support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_HEADSPACE&lt;br /&gt;
| Bytes of headspace to reserve for future headers&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_TAILSPACE&lt;br /&gt;
| Bytes of tailspace to reserve for future tails&lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| ENROLL_TIMEOUT&lt;br /&gt;
| Timeout the IRMd waits for an IPCP to complete enrollment (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_LINUX_RTT_ESTIMATOR&lt;br /&gt;
| Use Linux RTT estimator formula instead of the TCP RFC formula&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_REORDER_QUEUE_SIZE&lt;br /&gt;
| Size of the reordering queue&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_INC_FACTOR&lt;br /&gt;
| Divisor for RTO increase after ACK timeout: RTO += RTX &amp;gt;&amp;gt; X&lt;br /&gt;
|&lt;br /&gt;
| 0: Karn/Partridge&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MDEV_MULTIPLIER&lt;br /&gt;
| Multiplier for deviation term in the RTO: RTO = sRTT + (mdev &amp;lt;&amp;lt; X)&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MIN&lt;br /&gt;
| Minimum Retransmission Timeout (RTO) for FRCT (us)&lt;br /&gt;
|&lt;br /&gt;
| 250&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_START_WINDOW&lt;br /&gt;
| Start window &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_TICK_TIME&lt;br /&gt;
| Tick time for FRCT activity (retransmission, acknowledgments) (us)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PREFIX &lt;br /&gt;
| Mountpoint for FUSE filesystem (observability)&lt;br /&gt;
|&lt;br /&gt;
| /tmp/ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when an IPCP faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_BROADCAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the broadcast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_CONN_WAIT_DIR &lt;br /&gt;
| Check the running state of the directory (DHT) when adding a data transfer connection&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_LO_MTU&lt;br /&gt;
| Restrict Ethernet MTU over loopback interface&lt;br /&gt;
|&lt;br /&gt;
| 1500&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_QDISC_BYPASS&lt;br /&gt;
| Bypass the Qdisc in the kernel when using raw sockets&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_RD_THR&lt;br /&gt;
| Number of reader threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_WR_THR&lt;br /&gt;
| Number of writer threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_FLOW_STATS &lt;br /&gt;
| Enable flow statistics tracking in IPCP (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LINUX_TIMERSLACK_NS&lt;br /&gt;
| Slack value for high resolution timers on Linux systems&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LOCAL_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_MIN_THREADS&lt;br /&gt;
| Minimum number of worker threads in the IPCP&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_BE_PRIO &lt;br /&gt;
| Priority for best effort QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VIDEO_PRIO&lt;br /&gt;
| Priority for video QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VOICE_PRIO&lt;br /&gt;
| Priority for voice QoS cube (0-99) &lt;br /&gt;
|&lt;br /&gt;
| 99&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_SCHED_THR_MUL&lt;br /&gt;
| Number of scheduler threads per QoS cube&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_MPL &lt;br /&gt;
| Default maximum packet lifetime for the UDP IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_RD_THR&lt;br /&gt;
| Number of reader threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3 &lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_WR_THR&lt;br /&gt;
| Number of writer threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UNICAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the unicast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60  &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when the IRMD faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 8      &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_FLOW_TIMEOUT &lt;br /&gt;
| Timeout for a flow allocation response (ms)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| IRMD_MIN_THREADS &lt;br /&gt;
| Minimum number of worker threads in the IRMd&lt;br /&gt;
|&lt;br /&gt;
| 8    &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_REQ_ARR_TIMEOUT&lt;br /&gt;
| Timeout for an application to respond to arrival of a new flow (ms) &lt;br /&gt;
|&lt;br /&gt;
| 500&lt;br /&gt;
|-&lt;br /&gt;
| PFT_SIZE&lt;br /&gt;
| Size of the PDU forwarding (hash) table &lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROC_FLOW_STATS&lt;br /&gt;
| Enable flow statistics tracking for application flows&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FLOWS&lt;br /&gt;
| Maximum number of flows in an application&lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FQUEUES&lt;br /&gt;
| Maximum number of flow sets per application &lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| PROG_RES_FDS&lt;br /&gt;
| Number of reserved flow descriptors per application&lt;br /&gt;
|&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| PTHREAD_COND_CLOCK&lt;br /&gt;
| Clock to use for condition variable timing &lt;br /&gt;
|&lt;br /&gt;
| CLOCK_MONOTONIC&lt;br /&gt;
|-&lt;br /&gt;
| QOS_DISABLE_CRC&lt;br /&gt;
| Ignores bit-error rate (BER) setting on all QoS cubes to avoid calculating CRCs&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| QUERY_TIMEOUT&lt;br /&gt;
| Timeout to query a name with an IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 3000&lt;br /&gt;
|-&lt;br /&gt;
| REG_TIMEOUT&lt;br /&gt;
| Timeout for registering a name (ms) &lt;br /&gt;
|&lt;br /&gt;
| 10000&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BLOCKING&lt;br /&gt;
| Use blocking writes for retransmission&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BUFFER_ON_HEAP&lt;br /&gt;
| Store packets for retransmission on the heap instead of in packet buffer&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| RXM_MIN_RESOLUTION&lt;br /&gt;
| Minimum retransmission delay (ns), as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_LEVELS&lt;br /&gt;
| Number of levels in the retransmission wheel&lt;br /&gt;
|&lt;br /&gt;
| 3    &lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_MULTIPLIER&lt;br /&gt;
| Factor for retransmission wheel levels as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_SLOTS_PER_LEVEL&lt;br /&gt;
| Number of slots per level in the retransmission wheel&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| SHM_BUFFER_SIZE&lt;br /&gt;
| Number of blocks in packet buffer, &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| SHM_PREFIX&lt;br /&gt;
| String to prepend to POSIX shared memory filenames&lt;br /&gt;
|&lt;br /&gt;
| ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_LOCKLESS&lt;br /&gt;
| Enable shared memory lockless rbuff support (experimental, unstable)&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_SIZE&lt;br /&gt;
| Number of blocks in rbuff buffer&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 1024&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_BLOCK_SIZE&lt;br /&gt;
| Packet buffer block size &lt;br /&gt;
| Defaults to pagesize for performance&lt;br /&gt;
| sysconf(_SC_PAGESIZE)&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_MULTI_BLOCK&lt;br /&gt;
| Packet buffer multiblock packet support (allows packets larger than block size)&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| SOCKET_TIMEOUT&lt;br /&gt;
| Default timeout for internal responses from IPCPs (ms)&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| SOCK_BUF_SIZE&lt;br /&gt;
| Size of the buffer used by the UNIX sockets for local IPC&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|-&lt;br /&gt;
| SYS_MAX_FLOWS&lt;br /&gt;
| Maximum number of total flows for this system&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=142</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=142"/>
		<updated>2022-06-01T13:25:34Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Build configuration parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX&lt;br /&gt;
| Prefix to install Ouroboros&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
| Maximum time to acknowledge a packet (s)&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
| Maximum packet lifetime (s) &lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
| Maximum time to retransmit a packet (s)&lt;br /&gt;
| &lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
| DHT_ENROLL_SLACK&lt;br /&gt;
| DHT enrollment waiting time (ms)&lt;br /&gt;
| 0-999&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_CORE_LOCK&lt;br /&gt;
| Disable locking performance threads to a core&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_DDNS&lt;br /&gt;
| Disable DDNS support for ipcpd-udp&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_FUSE  &lt;br /&gt;
| Disable FUSE support for exporting metrics (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_LIBGCRYPT&lt;br /&gt;
| Disable libgcrypt support &lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_OPENSSL&lt;br /&gt;
| Disable OpenSSL support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_RAW_SOCKETS&lt;br /&gt;
| Disable raw socket support for Ethernet IPCPs&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_ROBUST_MUTEXES&lt;br /&gt;
| Disable robust mutex support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_HEADSPACE&lt;br /&gt;
| Bytes of headspace to reserve for future headers&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_TAILSPACE&lt;br /&gt;
| Bytes of tailspace to reserve for future tails&lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| ENROLL_TIMEOUT&lt;br /&gt;
| Timeout the IRMd waits for an IPCP to complete enrollment (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_LINUX_RTT_ESTIMATOR&lt;br /&gt;
| Use Linux RTT estimator formula instead of the TCP RFC formula&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_REORDER_QUEUE_SIZE&lt;br /&gt;
| Size of the reordering queue&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_INC_FACTOR&lt;br /&gt;
| Divisor for RTO increase after ACK timeout: RTO += RTX &amp;gt;&amp;gt; X&lt;br /&gt;
|&lt;br /&gt;
| 0: Karn/Partridge&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MDEV_MULTIPLIER&lt;br /&gt;
| Multiplier for deviation term in the RTO: RTO = sRTT + (mdev &amp;lt;&amp;lt; X)&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MIN&lt;br /&gt;
| Minimum Retransmission Timeout (RTO) for FRCT (us)&lt;br /&gt;
|&lt;br /&gt;
| 250&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_START_WINDOW&lt;br /&gt;
| Start window &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_TICK_TIME&lt;br /&gt;
| Tick time for FRCT activity (retransmission, acknowledgments) (us)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PREFIX &lt;br /&gt;
| Mountpoint for FUSE filesystem (observability)&lt;br /&gt;
|&lt;br /&gt;
| /tmp/ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when an IPCP faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_BROADCAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the broadcast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_CONN_WAIT_DIR &lt;br /&gt;
| Check the running state of the directory (DHT) when adding a data transfer connection&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_LO_MTU&lt;br /&gt;
| Restrict Ethernet MTU over loopback interface&lt;br /&gt;
|&lt;br /&gt;
| 1500&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_QDISC_BYPASS&lt;br /&gt;
| Bypass the Qdisc in the kernel when using raw sockets&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_RD_THR&lt;br /&gt;
| Number of reader threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_WR_THR&lt;br /&gt;
| Number of writer threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_FLOW_STATS &lt;br /&gt;
| Enable flow statistics tracking in IPCP (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LINUX_TIMERSLACK_NS&lt;br /&gt;
| Slack value for high resolution timers on Linux systems&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LOCAL_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_MIN_THREADS&lt;br /&gt;
| Minimum number of worker threads in the IPCP&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_BE_PRIO &lt;br /&gt;
| Priority for best effort QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VIDEO_PRIO&lt;br /&gt;
| Priority for video QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VOICE_PRIO&lt;br /&gt;
| Priority for voice QoS cube (0-99) &lt;br /&gt;
|&lt;br /&gt;
| 99&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_SCHED_THR_MUL&lt;br /&gt;
| Number of scheduler threads per QoS cube&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_MPL &lt;br /&gt;
| Default maximum packet lifetime for the UDP IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_RD_THR&lt;br /&gt;
| Number of reader threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3 &lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_WR_THR&lt;br /&gt;
| Number of writer threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UNICAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the unicast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60  &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when the IRMD faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 8      &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_FLOW_TIMEOUT &lt;br /&gt;
| Timeout for a flow allocation response (ms)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| IRMD_MIN_THREADS &lt;br /&gt;
| Minimum number of worker threads in the IRMd&lt;br /&gt;
|&lt;br /&gt;
| 8    &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_REQ_ARR_TIMEOUT&lt;br /&gt;
| Timeout for an application to respond to arrival of a new flow (ms) &lt;br /&gt;
|&lt;br /&gt;
| 500&lt;br /&gt;
|-&lt;br /&gt;
| PFT_SIZE&lt;br /&gt;
| Size of the PDU forwarding (hash) table &lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROC_FLOW_STATS&lt;br /&gt;
| Enable flow statistics tracking for application flows&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FLOWS&lt;br /&gt;
| Maximum number of flows in an application&lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FQUEUES&lt;br /&gt;
| Maximum number of flow sets per application &lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| PROG_RES_FDS&lt;br /&gt;
| Number of reserved flow descriptors per application&lt;br /&gt;
|&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| PTHREAD_COND_CLOCK&lt;br /&gt;
| Clock to use for condition variable timing &lt;br /&gt;
|&lt;br /&gt;
| CLOCK_MONOTONIC&lt;br /&gt;
|-&lt;br /&gt;
| QOS_DISABLE_CRC&lt;br /&gt;
| Ignores bit-error rate (BER) setting on all QoS cubes to avoid calculating CRCs&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| QUERY_TIMEOUT&lt;br /&gt;
| Timeout to query a name with an IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 3000&lt;br /&gt;
|-&lt;br /&gt;
| REG_TIMEOUT&lt;br /&gt;
| Timeout for registering a name (ms) &lt;br /&gt;
|&lt;br /&gt;
| 10000&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BLOCKING&lt;br /&gt;
| Use blocking writes for retransmission&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BUFFER_ON_HEAP&lt;br /&gt;
| Store packets for retransmission on the heap instead of in packet buffer&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| RXM_MIN_RESOLUTION&lt;br /&gt;
| Minimum retransmission delay (ns), as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_LEVELS&lt;br /&gt;
| Number of levels in the retransmission wheel&lt;br /&gt;
|&lt;br /&gt;
| 3    &lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_MULTIPLIER&lt;br /&gt;
| Factor for retransmission wheel levels as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_SLOTS_PER_LEVEL&lt;br /&gt;
| Number of slots per level in the retransmission wheel&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| SHM_BUFFER_SIZE&lt;br /&gt;
| Number of blocks in packet buffer, &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| SHM_PREFIX&lt;br /&gt;
| String to prepend to POSIX shared memory filenames&lt;br /&gt;
|&lt;br /&gt;
| ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_LOCKLESS&lt;br /&gt;
| Enable shared memory lockless rbuff support (experimental, unstable)&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_SIZE&lt;br /&gt;
| Number of blocks in rbuff buffer&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 1024&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_BLOCK_SIZE&lt;br /&gt;
| Packet buffer block size &lt;br /&gt;
| Defaults to pagesize for performance&lt;br /&gt;
| sysconf(_SC_PAGESIZE)&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_MULTI_BLOCK&lt;br /&gt;
| Packet buffer multiblock packet support (allows packets larger than block size)&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| SOCKET_TIMEOUT&lt;br /&gt;
| Default timeout for internal responses from IPCPs (ms)&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| SOCK_BUF_SIZE&lt;br /&gt;
| Size of the buffer used by the UNIX sockets for local IPC&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|-&lt;br /&gt;
| SYS_MAX_FLOWS&lt;br /&gt;
| Maximum number of total flows for this system&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=141</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=141"/>
		<updated>2022-06-01T13:23:17Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Build configuration parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX&lt;br /&gt;
| Prefix to install Ouroboros&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
| Maximum time to acknowledge a packet (s)&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
| Maximum packet lifetime (s) &lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
| Maximum time to retransmit a packet (s)&lt;br /&gt;
| &lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
| DHT_ENROLL_SLACK&lt;br /&gt;
| DHT enrollment waiting time (ms)&lt;br /&gt;
| 0-999&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_CORE_LOCK&lt;br /&gt;
| Disable locking performance threads to a core&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_DDNS&lt;br /&gt;
| Disable DDNS support for ipcpd-udp&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_FUSE  &lt;br /&gt;
| Disable FUSE support for exporting metrics (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_LIBGCRYPT&lt;br /&gt;
| Disable libgcrypt support &lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_OPENSSL&lt;br /&gt;
| Disable OpenSSL support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_RAW_SOCKETS&lt;br /&gt;
| Disable raw socket support for Ethernet IPCPs&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_ROBUST_MUTEXES&lt;br /&gt;
| Disable robust mutex support&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_HEADSPACE&lt;br /&gt;
| Bytes of headspace to reserve for future headers&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_TAILSPACE&lt;br /&gt;
| Bytes of tailspace to reserve for future tails&lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| ENROLL_TIMEOUT&lt;br /&gt;
| Timeout the IRMd waits for an IPCP to complete enrollment (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_LINUX_RTT_ESTIMATOR&lt;br /&gt;
| Use Linux RTT estimator formula instead of the TCP RFC formula&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_REORDER_QUEUE_SIZE&lt;br /&gt;
| Size of the reordering queue&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_INC_FACTOR&lt;br /&gt;
| Divisor for RTO increase after ACK timeout: RTO += RTX &amp;gt;&amp;gt; X&lt;br /&gt;
|&lt;br /&gt;
| 0: Karn/Partridge&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MDEV_MULTIPLIER&lt;br /&gt;
| Multiplier for deviation term in the RTO: RTO = sRTT + (mdev &amp;lt;&amp;lt; X)&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MIN&lt;br /&gt;
| Minimum Retransmission Timeout (RTO) for FRCT (us)&lt;br /&gt;
|&lt;br /&gt;
| 250&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_START_WINDOW&lt;br /&gt;
| Start window &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_TICK_TIME&lt;br /&gt;
| Tick time for FRCT activity (retransmission, acknowledgments) (us)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PREFIX &lt;br /&gt;
| Mountpoint for FUSE filesystem (observability)&lt;br /&gt;
|&lt;br /&gt;
| /tmp/ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when an IPCP faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_BROADCAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the broadcast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_CONN_WAIT_DIR &lt;br /&gt;
| Check the running state of the directory (DHT) when adding a data transfer connection&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_LO_MTU&lt;br /&gt;
| Restrict Ethernet MTU over loopback interface&lt;br /&gt;
|&lt;br /&gt;
| 1500&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_QDISC_BYPASS&lt;br /&gt;
| Bypass the Qdisc in the kernel when using raw sockets&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_RD_THR&lt;br /&gt;
| Number of reader threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_WR_THR&lt;br /&gt;
| Number of writer threads in Ethernet IPCP &lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_FLOW_STATS &lt;br /&gt;
| Enable flow statistics tracking in IPCP (observability)&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LINUX_TIMERSLACK_NS&lt;br /&gt;
| Slack value for high resolution timers on Linux systems&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LOCAL_MPL&lt;br /&gt;
| Default maximum packet lifetime for the Ethernet IPCPs, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_MIN_THREADS&lt;br /&gt;
| Minimum number of worker threads in the IPCP&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_BE_PRIO &lt;br /&gt;
| Priority for best effort QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VIDEO_PRIO&lt;br /&gt;
| Priority for video QoS cube (0-99)&lt;br /&gt;
|&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VOICE_PRIO&lt;br /&gt;
| Priority for voice QoS cube (0-99) &lt;br /&gt;
|&lt;br /&gt;
| 99&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_SCHED_THR_MUL&lt;br /&gt;
| Number of scheduler threads per QoS cube&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_MPL &lt;br /&gt;
| Default maximum packet lifetime for the UDP IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_RD_THR&lt;br /&gt;
| Number of reader threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3 &lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_WR_THR&lt;br /&gt;
| Number of writer threads in UDP IPCP &lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UNICAST_MPL&lt;br /&gt;
| Default maximum packet lifetime for the unicast IPCP, in seconds&lt;br /&gt;
|&lt;br /&gt;
| 60  &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_ADD_THREADS&lt;br /&gt;
| Number of extra threads to start when the IRMD faces thread starvation&lt;br /&gt;
|&lt;br /&gt;
| 8      &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_FLOW_TIMEOUT &lt;br /&gt;
| Timeout for a flow allocation response (ms)&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| IRMD_MIN_THREADS &lt;br /&gt;
| Minimum number of worker threads in the IRMd&lt;br /&gt;
|&lt;br /&gt;
| 8    &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_REQ_ARR_TIMEOUT&lt;br /&gt;
| Timeout for an application to respond to arrival of a new flow (ms) &lt;br /&gt;
|&lt;br /&gt;
| 500&lt;br /&gt;
|-&lt;br /&gt;
| PFT_SIZE&lt;br /&gt;
| Size of the PDU forwarding (hash) table &lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROC_FLOW_STATS&lt;br /&gt;
| Enable flow statistics tracking for application flows&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FLOWS&lt;br /&gt;
| Maximum number of flows in an application&lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FQUEUES&lt;br /&gt;
| Maximum number of flow sets per application &lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| PROG_RES_FDS&lt;br /&gt;
| Number of reserved flow descriptors per application&lt;br /&gt;
|&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| PTHREAD_COND_CLOCK&lt;br /&gt;
| Clock to use for condition variable timing &lt;br /&gt;
|&lt;br /&gt;
| CLOCK_MONOTONIC&lt;br /&gt;
|-&lt;br /&gt;
| QOS_DISABLE_CRC&lt;br /&gt;
| Ignores bit-error rate (BER) setting on all QoS cubes to avoid calculating CRCs&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| QUERY_TIMEOUT&lt;br /&gt;
| Timeout to query a name with an IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 3000&lt;br /&gt;
|-&lt;br /&gt;
| REG_TIMEOUT&lt;br /&gt;
| Timeout for registering a name (ms) &lt;br /&gt;
|&lt;br /&gt;
| 10000&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BLOCKING&lt;br /&gt;
| Use blocking writes for retransmission&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BUFFER_ON_HEAP&lt;br /&gt;
| Store packets for retransmission on the heap instead of in packet buffer&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| RXM_MIN_RESOLUTION&lt;br /&gt;
| Minimum retransmission delay (ns), as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_LEVELS&lt;br /&gt;
| Number of levels in the retransmission wheel&lt;br /&gt;
|&lt;br /&gt;
| 3    &lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_MULTIPLIER&lt;br /&gt;
| Factor for retransmission wheel levels as a power to 2&lt;br /&gt;
| &lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_SLOTS_PER_LEVEL&lt;br /&gt;
| Number of slots per level in the retransmission wheel&lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| SHM_BUFFER_SIZE&lt;br /&gt;
| Number of blocks in packet buffer, &lt;br /&gt;
| Must be a power of 2&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| SHM_PREFIX&lt;br /&gt;
| String to prepend to POSIX shared memory filenames&lt;br /&gt;
|&lt;br /&gt;
| ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_LOCKLESS&lt;br /&gt;
| Enable shared memory lockless rbuff support (experimental, unstable)&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_SIZE&lt;br /&gt;
| Number of blocks in rbuff buffer&lt;br /&gt;
|&lt;br /&gt;
| 1024&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_BLOCK_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| sysconf(_SC_PAGESIZE)&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_MULTI_BLOCK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| SOCKET_TIMEOUT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| SOCK_BUF_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|-&lt;br /&gt;
| SYS_MAX_FLOWS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=140</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=140"/>
		<updated>2022-06-01T13:06:06Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Build configuration parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX&lt;br /&gt;
| Prefix to install Ouroboros&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
|&lt;br /&gt;
| INT&lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
| DHT_ENROLL_SLACK&lt;br /&gt;
|&lt;br /&gt;
| INT&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_CORE_LOCK&lt;br /&gt;
|&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_DDNS&lt;br /&gt;
|&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_FUSE  &lt;br /&gt;
|&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_LIBGCRYPT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_OPENSSL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_RAW_SOCKETS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_ROBUST_MUTEXES&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_HEADSPACE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_TAILSPACE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| ENROLL_TIMEOUT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_LINUX_RTT_ESTIMATOR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_REORDER_QUEUE_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_INC_FACTOR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MDEV_MULTIPLIER&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MIN&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 250&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_START_WINDOW&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_TICK_TIME&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PREFIX &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| /tmp/ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ADD_THREADS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_BROADCAST_MPL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_CONN_WAIT_DIR &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_LO_MTU&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1500&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_MPL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_QDISC_BYPASS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_RD_THR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_WR_THR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_FLOW_STATS &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LINUX_TIMERSLACK_NS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LOCAL_MPL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_MIN_THREADS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_BE_PRIO &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VIDEO_PRIO&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VOICE_PRIO&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 99&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_SCHED_THR_MUL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_MPL &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_RD_THR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 3 &lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_WR_THR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UNICAST_MPL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 60  &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_ADD_THREADS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 8      &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_FLOW_TIMEOUT &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| IRMD_MIN_THREADS &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 8    &lt;br /&gt;
|-&lt;br /&gt;
| IRMD_REQ_ARR_TIMEOUT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 500&lt;br /&gt;
|-&lt;br /&gt;
| PFT_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROC_FLOW_STATS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FLOWS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| PROG_MAX_FQUEUES&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| PROG_RES_FDS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| PTHREAD_COND_CLOCK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| CLOCK_MONOTONIC&lt;br /&gt;
|-&lt;br /&gt;
| QOS_DISABLE_CRC&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| QUERY_TIMEOUT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 3000&lt;br /&gt;
|-&lt;br /&gt;
| REG_TIMEOUT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10000&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BLOCKING&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| RXM_BUFFER_ON_HEAP&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| RXM_MIN_RESOLUTION&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_LEVELS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 3    &lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_MULTIPLIER&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RXM_WHEEL_SLOTS_PER_LEVEL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| SHM_BUFFER_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4096&lt;br /&gt;
|-&lt;br /&gt;
| SHM_PREFIX&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_LOCKLESS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RBUFF_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1024&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_BLOCK_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| sysconf(_SC_PAGESIZE)&lt;br /&gt;
|-&lt;br /&gt;
| SHM_RDRB_MULTI_BLOCK&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| SOCKET_TIMEOUT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| SOCK_BUF_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|-&lt;br /&gt;
| SYS_MAX_FLOWS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10240&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=139</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=139"/>
		<updated>2022-06-01T13:00:07Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Build configuration parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX&lt;br /&gt;
| Prefix to install Ouroboros&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
|&lt;br /&gt;
| INT&lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
| DHT_ENROLL_SLACK&lt;br /&gt;
|&lt;br /&gt;
| INT&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_CORE_LOCK&lt;br /&gt;
|&lt;br /&gt;
| Bool&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_DDNS&lt;br /&gt;
|&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_FUSE  &lt;br /&gt;
|&lt;br /&gt;
| Bool&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_LIBGCRYPT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_OPENSSL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_RAW_SOCKETS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE_ROBUST_MUTEXES&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_HEADSPACE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| DU_BUFF_TAILSPACE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| ENROLL_TIMEOUT&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_LINUX_RTT_ESTIMATOR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_REORDER_QUEUE_SIZE&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_INC_FACTOR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MDEV_MULTIPLIER&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_RTO_MIN&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 250&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_START_WINDOW&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| FRCT_TICK_TIME&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| FUSE_PREFIX &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| /tmp/ouroboros&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ADD_THREADS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_BROADCAST_MPL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_CONN_WAIT_DIR &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_LO_MTU&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1500&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_MPL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_QDISC_BYPASS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| OFF&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_RD_THR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_ETH_WR_THR&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_FLOW_STATS &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ON&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LINUX_TIMERSLACK_NS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 1000&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_LOCAL_MPL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_MIN_THREADS&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_BE_PRIO &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VIDEO_PRIO&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 90&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_QOS_CUBE_VOICE_PRIO&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 99&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_SCHED_THR_MUL&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| IPCP_UDP_MPL &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=138</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=138"/>
		<updated>2022-06-01T12:52:23Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX&lt;br /&gt;
| Prefix to install Ouroboros |&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 DHT_ENROLL_SLACK                 50&lt;br /&gt;
 DISABLE_CORE_LOCK                ON&lt;br /&gt;
 DISABLE_DDNS                     OFF&lt;br /&gt;
 DISABLE_FUSE                     OFF&lt;br /&gt;
 DISABLE_LIBGCRYPT                OFF&lt;br /&gt;
 DISABLE_OPENSSL                  OFF&lt;br /&gt;
 DISABLE_RAW_SOCKETS              OFF&lt;br /&gt;
 DISABLE_ROBUST_MUTEXES           OFF&lt;br /&gt;
 DU_BUFF_HEADSPACE                256&lt;br /&gt;
 DU_BUFF_TAILSPACE                32&lt;br /&gt;
 ENROLL_TIMEOUT                   60000&lt;br /&gt;
 FRCT_LINUX_RTT_ESTIMATOR         ON&lt;br /&gt;
 FRCT_REORDER_QUEUE_SIZE          256&lt;br /&gt;
 FRCT_RTO_INC_FACTOR              0&lt;br /&gt;
 FRCT_RTO_MDEV_MULTIPLIER         2&lt;br /&gt;
 FRCT_RTO_MIN                     250&lt;br /&gt;
 FRCT_START_WINDOW                64&lt;br /&gt;
 FRCT_TICK_TIME                   5000&lt;br /&gt;
 FUSE_PREFIX                      /tmp/ouroboros&lt;br /&gt;
 IPCP_ADD_THREADS                 4&lt;br /&gt;
 IPCP_BROADCAST_MPL               60&lt;br /&gt;
 IPCP_CONN_WAIT_DIR               ON&lt;br /&gt;
 IPCP_ETH_LO_MTU                  1500&lt;br /&gt;
 IPCP_ETH_MPL                     5&lt;br /&gt;
 IPCP_ETH_QDISC_BYPASS            OFF&lt;br /&gt;
 IPCP_ETH_RD_THR                  1&lt;br /&gt;
 IPCP_ETH_WR_THR                  1&lt;br /&gt;
 IPCP_FLOW_STATS                  ON&lt;br /&gt;
 IPCP_LINUX_TIMERSLACK_NS         1000&lt;br /&gt;
 IPCP_LOCAL_MPL                   2&lt;br /&gt;
 IPCP_MIN_THREADS                 4&lt;br /&gt;
 IPCP_QOS_CUBE_BE_PRIO            50&lt;br /&gt;
 IPCP_QOS_CUBE_VIDEO_PRIO         90&lt;br /&gt;
 IPCP_QOS_CUBE_VOICE_PRIO         99&lt;br /&gt;
 IPCP_SCHED_THR_MUL               2&lt;br /&gt;
 IPCP_UDP_MPL                     60&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=137</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=137"/>
		<updated>2022-06-01T12:51:45Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Configuration parameters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION &lt;br /&gt;
| Minimum acknowledgment delay (ns), as a power to 2 &lt;br /&gt;
|&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS&lt;br /&gt;
| Number of slots in the acknowledgment wheel, must be a power of 2 &lt;br /&gt;
|&lt;br /&gt;
| 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT&lt;br /&gt;
| Timeout for an IPCP to bootstrap (ms) &lt;br /&gt;
|&lt;br /&gt;
| 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_INSTALL_PREFIX |&lt;br /&gt;
| Prefix to install Ouroboros |&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
/usr (Linux, *BSD)&lt;br /&gt;
/usr/local (OS X)&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT_TIMEOUT   &lt;br /&gt;
| Timeout to connect an IPCP to another IPCP (ms)&lt;br /&gt;
|&lt;br /&gt;
| 60000&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_ACK &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_MPL&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| DELTA_T_RTX&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 120&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 DHT_ENROLL_SLACK                 50&lt;br /&gt;
 DISABLE_CORE_LOCK                ON&lt;br /&gt;
 DISABLE_DDNS                     OFF&lt;br /&gt;
 DISABLE_FUSE                     OFF&lt;br /&gt;
 DISABLE_LIBGCRYPT                OFF&lt;br /&gt;
 DISABLE_OPENSSL                  OFF&lt;br /&gt;
 DISABLE_RAW_SOCKETS              OFF&lt;br /&gt;
 DISABLE_ROBUST_MUTEXES           OFF&lt;br /&gt;
 DU_BUFF_HEADSPACE                256&lt;br /&gt;
 DU_BUFF_TAILSPACE                32&lt;br /&gt;
 ENROLL_TIMEOUT                   60000&lt;br /&gt;
 FRCT_LINUX_RTT_ESTIMATOR         ON&lt;br /&gt;
 FRCT_REORDER_QUEUE_SIZE          256&lt;br /&gt;
 FRCT_RTO_INC_FACTOR              0&lt;br /&gt;
 FRCT_RTO_MDEV_MULTIPLIER         2&lt;br /&gt;
 FRCT_RTO_MIN                     250&lt;br /&gt;
 FRCT_START_WINDOW                64&lt;br /&gt;
 FRCT_TICK_TIME                   5000&lt;br /&gt;
 FUSE_PREFIX                      /tmp/ouroboros&lt;br /&gt;
 IPCP_ADD_THREADS                 4&lt;br /&gt;
 IPCP_BROADCAST_MPL               60&lt;br /&gt;
 IPCP_CONN_WAIT_DIR               ON&lt;br /&gt;
 IPCP_ETH_LO_MTU                  1500&lt;br /&gt;
 IPCP_ETH_MPL                     5&lt;br /&gt;
 IPCP_ETH_QDISC_BYPASS            OFF&lt;br /&gt;
 IPCP_ETH_RD_THR                  1&lt;br /&gt;
 IPCP_ETH_WR_THR                  1&lt;br /&gt;
 IPCP_FLOW_STATS                  ON&lt;br /&gt;
 IPCP_LINUX_TIMERSLACK_NS         1000&lt;br /&gt;
 IPCP_LOCAL_MPL                   2&lt;br /&gt;
 IPCP_MIN_THREADS                 4&lt;br /&gt;
 IPCP_QOS_CUBE_BE_PRIO            50&lt;br /&gt;
 IPCP_QOS_CUBE_VIDEO_PRIO         90&lt;br /&gt;
 IPCP_QOS_CUBE_VOICE_PRIO         99&lt;br /&gt;
 IPCP_SCHED_THR_MUL               2&lt;br /&gt;
 IPCP_UDP_MPL                     60&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=136</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=136"/>
		<updated>2022-06-01T12:44:34Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Debian/Ubuntu Linux: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION || Minimum acknowledgment delay (ns), as a power to 2 || || 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS || Number of slots in the acknowledgment wheel, must be a power of 2 || || 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT || Timeout for an IPCP to bootstrap (ms) || || 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=135</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=135"/>
		<updated>2022-06-01T12:44:16Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Ouroboros prototype is a user-space packet network implementation based on the [[Ouroboros | networking model]] of the same name. It is being developed in C for POSIX operating systems.&lt;br /&gt;
This prototype is still a work in progress.&lt;br /&gt;
&lt;br /&gt;
== Prototype summary ==&lt;br /&gt;
&lt;br /&gt;
Split in library &lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRMd ===&lt;br /&gt;
&lt;br /&gt;
=== IPCPs ===&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux: ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
$ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ apt-get install libprotobuf-c-dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ pacman -S git protobuf-c cmake&lt;br /&gt;
$ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
$ pkg install git protobuf-c cmake&lt;br /&gt;
$ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ brew install git protobuf-c cmake&lt;br /&gt;
$ brew install libgcrypt openssl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
$ cmake ..&lt;br /&gt;
$ sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo make uninstall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to increase performance or decrease memory consumption.&lt;br /&gt;
&lt;br /&gt;
These parameters can be enabled by specifying them to cmake&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
$ cmake -D&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt; ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or interactively by running ccmake . in the build directory.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros build configuration &lt;br /&gt;
! Parameter !! Description !! Values || Default&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_RESOLUTION || Minimum acknowledgment delay (ns), as a power to 2 || || 18&lt;br /&gt;
|-&lt;br /&gt;
| ACK_WHEEL_SLOTS || Number of slots in the acknowledgment wheel, must be a power of 2 || || 256&lt;br /&gt;
|-&lt;br /&gt;
| BOOTSTRAP_TIMEOUT || Timeout for an IPCP to bootstrap (ms) || || 5000&lt;br /&gt;
|-&lt;br /&gt;
| CMAKE_BUILD_TYPE&lt;br /&gt;
| Build type &lt;br /&gt;
| &lt;br /&gt;
* Release: A release build, less debug logs, compiled with performance flags&lt;br /&gt;
* Debug: A debug build with extra logging and debug symbols (gdb)&lt;br /&gt;
* DebugASan: Enables Address Sanitizer&lt;br /&gt;
* DebugTSan: Enables Thread Sanitizer&lt;br /&gt;
* DebugLSan: Enables Leak Sanitizer&lt;br /&gt;
* DebugUSan: Enables Undefined behaviour Sanitizer&lt;br /&gt;
* DebugAnalyzer: Enables static analysis during compilation&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=134</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=134"/>
		<updated>2022-06-01T11:30:04Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros uses the word &#039;&#039;layer&#039;&#039; to describe both the recurring layering that make up the network, built of IPCPs (unicast layer, broadcast layer), as the functional layering within the applications and IPCPs (end-to-end application layer, application session layer). We have considered using the terms &#039;unicast network&#039; and &#039;broadcast network&#039;, but then the network is composed of networks, which is not ideal either. However, and Ethernet or Wifi Network is also commonly referred to as a &amp;quot;Layer 2&amp;quot;...  &lt;br /&gt;
&lt;br /&gt;
The term [[IPCP]] is derived from RINA terminology (and RINA borrowed it from [[LINCS]]). While it is an accurate description in RINA, as it is a process that provides access to an &amp;quot;Inter-Process Communicaton service&amp;quot;, in Ouroboros it is not that accurate. Terms like &amp;quot;forwarding process&amp;quot; or &amp;quot;routing process&amp;quot; also carry connotations.&lt;br /&gt;
&lt;br /&gt;
These terminology issues are definitely confusing and suggestions to fix this terminology are welcomed. &lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=133</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=133"/>
		<updated>2022-06-01T11:06:00Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The key proposition of the Ouroboros model is not that there are recursive and non-recursive networks. Its conjecture is that &#039;&#039;all packet-switched networks are functionally recursive&#039;&#039;. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=132</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=132"/>
		<updated>2022-06-01T10:59:14Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. For instance, in IP over Ethernet, VLANs are typically used as a broadcast domain defining an IP subnet. In OSPF, an IP multicast network is used to define an OSPF area.&lt;br /&gt;
&lt;br /&gt;
The main takeaway from our research into Ouroboros is not that there are recursive and non-recursive networks. Our conjecture is that &#039;&#039;all&#039;&#039; packet-switched networks are functionally recursive. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=131</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=131"/>
		<updated>2022-06-01T10:57:08Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Unicast-broadcast-20220601.png | right | 400px | Ouroboros network layers]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. The main takeaway from our research into Ouroboros is not that there are recursive and non-recursive networks. Our conjecture is that &#039;&#039;all&#039;&#039; packet-switched networks are functionally recursive. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros functional model]]&lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=File:Unicast-broadcast-20220601.png&amp;diff=130</id>
		<title>File:Unicast-broadcast-20220601.png</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=File:Unicast-broadcast-20220601.png&amp;diff=130"/>
		<updated>2022-06-01T10:54:17Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=129</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=129"/>
		<updated>2022-06-01T10:52:14Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. The main takeaway from our research into Ouroboros is not that there are recursive and non-recursive networks. Our conjecture is that &#039;&#039;all&#039;&#039; packet-switched networks are functionally recursive. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros network model]]&lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=128</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=128"/>
		<updated>2022-06-01T10:49:32Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros network model]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions, not necessarily unique programs. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. The main takeaway from our research into Ouroboros is not that there are recursive and non-recursive networks. Our conjecture is that &#039;&#039;all&#039;&#039; packet-switched networks are functionally recursive. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives, some combine functions, or omit functions, or agree on certain values for certain aspects.&lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=127</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=127"/>
		<updated>2022-06-01T10:42:46Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros network model]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions, not necessarily unique programs. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. The main takeaway from our research into Ouroboros is not that there are recursive and non-recursive networks. Our conjecture is that &#039;&#039;all&#039;&#039; packet-switched networks are functionally recursive. Just not all of them wrap the functionality of each &#039;&#039;network layer&#039;&#039; in the same set of API primitives.&lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=126</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=126"/>
		<updated>2022-06-01T10:38:35Z</updated>

		<summary type="html">&lt;p&gt;Dstaesse: /* Model */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros (abbreviated as &#039;&#039;O7s&#039;&#039;) is a work-in-progress packet-switched Internetwork model and prototype started by [[Dimitri Staessens]] and [[Sander Vrijders]] at IMEC / Ghent University early 2016.&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
What we need to clear right out of the way is that our main driver to create Ouroboros was not to solve any specific perceived engineering problems within TCP/IP, or [[RINA]], or whatever other network design. It is also not developed to add some functionality that we perceive as missing in TCP/IP or any other network technology.&lt;br /&gt;
&lt;br /&gt;
Our main driver is to figure out the fundamental laws that govern packet networks as a whole. Laws that, when broken, cause the network to cease operation or become unscalable.&lt;br /&gt;
&lt;br /&gt;
The aim is to come to a model that explains the fundamentals for the following network functions as elegantly as possible:&lt;br /&gt;
&lt;br /&gt;
* best effort delivery of packets&lt;br /&gt;
* in-order delivery&lt;br /&gt;
* reliable delivery&lt;br /&gt;
** re-transmission of lost packets&lt;br /&gt;
** detection of unwanted packets&lt;br /&gt;
** transmission of packets over diverse paths, possibly sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
** transmission of packets over diverse networks, possible sending multiple copies, potentially using some erasure-coding scheme&lt;br /&gt;
* filtering out received duplicates&lt;br /&gt;
* multiple traffic classes with different scheduling priorities&lt;br /&gt;
* security&lt;br /&gt;
** encryption&lt;br /&gt;
** authentication&lt;br /&gt;
* flow control: sender does not send more traffic than a receiver can cope with&lt;br /&gt;
* congestion avoidance: total offered load to the network does not cause systematic delays (or loss) in packet delivery beyond the expected latency due to packet processing in nodes and propagation delays over the links.&lt;br /&gt;
* fragmentation of an application message into smaller network packets, and reassembly&lt;br /&gt;
* naming a service&lt;br /&gt;
* locating a process that provides access to the named service&lt;br /&gt;
* establishing an association between the process that consumes the service and the process that provides access to the service&lt;br /&gt;
&lt;br /&gt;
The prototype is an implementation to validate these ideas.&lt;br /&gt;
&lt;br /&gt;
== Model ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros model]]&lt;br /&gt;
&lt;br /&gt;
[[File:Ouroboros-model-20220228.png | right | 400px | Ouroboros network model]]&lt;br /&gt;
&lt;br /&gt;
The model consists of the following elements:&lt;br /&gt;
&lt;br /&gt;
* [[Inter-Process Communication Process]]es (IPCPs)&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs, abstracting point-to-point and broadcast transmission media.&lt;br /&gt;
&lt;br /&gt;
The unicast and broadcast IPCPs and unicast and broadcast layers are functional abstractions, not necessarily unique programs. In other words, this model can be mapped to, or used to analyze, any packet-switched network technology. The main takeaway from our research is not that there is such a thing as recursive vs non-recursive networks. All packet-switched networks are inherently recursive.&lt;br /&gt;
&lt;br /&gt;
== Prototype ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Ouroboros prototype]]&lt;br /&gt;
&lt;br /&gt;
* IRMd&lt;br /&gt;
* IPCPs&lt;br /&gt;
** Unicast IPCP, making up a [[unicast layer]]&lt;br /&gt;
** Broadcast IPCP, making up a [[broadcast layer]]&lt;br /&gt;
** Adaptation IPCPs&lt;br /&gt;
*** Local&lt;br /&gt;
*** UDP&lt;br /&gt;
*** Ethernet&lt;br /&gt;
**** DIX&lt;br /&gt;
**** LLC&lt;br /&gt;
* Ouroboros library&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[History of Ouroboros]]&lt;br /&gt;
&lt;br /&gt;
The Ouroboros project has its roots in European-funded projects on [[RINA]]. After being involved in the RINA prototyping efforts as part of [[IRATI]] and [[PRISTINE]], a decision was made by some [[OpenIRATI]] contributors to start their own RINA prototypes, one was [[rlite]], the other Ouroboros. While it started as a RINA prototype, after finding numerous inefficiencies in RINA, Ouroboros diverged significantly from its base specifications, enough to warrant calling the model on which Ouroboros is based a different architecture alltogether.&lt;br /&gt;
&lt;br /&gt;
== Differences compared to TCP/IP ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and TCP/IP]]&lt;br /&gt;
&lt;br /&gt;
* Decoupled flow control and congestion avoidance&lt;br /&gt;
&lt;br /&gt;
* Only explicit congestion avoidance&lt;br /&gt;
&lt;br /&gt;
== Differences compared to OSI ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and OSI]]&lt;br /&gt;
&lt;br /&gt;
* Not sure I want to do this...&lt;br /&gt;
&lt;br /&gt;
== Differences compared to RINA ==&lt;br /&gt;
&#039;&#039;Main Article&#039;&#039;: [[Differences between Ouroboros and RINA]]&lt;br /&gt;
&lt;br /&gt;
RIB/CDAP is abstracted as a &#039;&#039;broadcast layer&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
No &amp;quot;shim layers&amp;quot;, all IPCPs implement a [[Flow Allocator]]&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>Dstaesse</name></author>
	</entry>
</feed>