<?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=Dimitri</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=Dimitri"/>
	<link rel="alternate" type="text/html" href="https://ouroboros.rocks/wiki/Special:Contributions/Dimitri"/>
	<updated>2026-04-06T09:32:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1910</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1910"/>
		<updated>2026-02-22T16:59:51Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 (Current version, February 22, 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 (Current version, February 22, 2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including ML-KEM, Hybrid ECDH-KEM key exchange and ML-DSA and SLH-DSA based authentication.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints based on lowest-floor exchange.&lt;br /&gt;
* Replaced the rdrbuff with per-user and priviliged shared slab allocator pools for shared memory packet buffers.&lt;br /&gt;
* Added automatic key rotation for encrypted flows.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules, plus new targets for coverage reports and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1909</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1909"/>
		<updated>2026-02-22T16:59:07Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 (Current version, February 22, 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 (Current version, February 22, 2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including ML-KEM, Hybrid ECDH-KEM key exchange and ML-DSA and SLH-DSA based authentication.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints based on lowest-floor exchange.&lt;br /&gt;
* Replaced the rdrbuff with per-user and priviliged shared slab allocator pools for shared memory packet buffers.&lt;br /&gt;
* Added automatic key rotation for encrypted flows.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules, plus new targets for coverage reports and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1908</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1908"/>
		<updated>2026-02-22T16:58:10Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 (Current version, February 22, 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 (Current version, February 22, 2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including ML-KEM, Hybrid ECDH-KEM key exchange and ML-DSA and SLH-DSA based authentication.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints,.&lt;br /&gt;
* Replaced the rdrbuff with per-user and priviliged shared slab allocator pools for shared memory packet buffers.&lt;br /&gt;
* Added automatic key rotation for encrypted flows.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules, plus new targets for coverage reports and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1907</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1907"/>
		<updated>2026-02-22T16:56:18Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 (Current version, February 22, 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 (Current version, February 22, 2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including ML-KEM, Hybrid ECDH-KEM and ML-DSA and SLH-DSA authentication.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints,.&lt;br /&gt;
* Replaced the rdrbuff with per-user and priviliged shared slab allocator pools for shared memory packet buffers.&lt;br /&gt;
* Added automatic key rotation for encrypted flows.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules, plus new targets for coverage reports and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1906</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1906"/>
		<updated>2026-02-22T16:54:11Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 (Current version, February 22, 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 (Current version, February 22, 2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including ML-KEM, Hybrid ECDH-KEM and ML-DSA and SLH-DSA authentication.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints, with fixes for client-side encryption requests.&lt;br /&gt;
* Replaced the rdrbuff with a proper slab allocator for shared memory packet buffers, a significant data-plane redesign.&lt;br /&gt;
* Added automatic key rotation for encrypted flows, with related fixes for IV/tag allocation and speedup of key rotation tests.&lt;br /&gt;
* Introduced per-user shared memory packet pools, improving multi-user isolation. Also added mlock() on shared memory buffers.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules back to in-tree CMakeLists, plus new targets for coverage reports, build_tests, and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1905</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1905"/>
		<updated>2026-02-22T16:53:49Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 (Current version, February 22, 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 (Current version, February 22, 2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including ML-KEM, Hybrid ECDH-KEM and ML-DSA and SLH-DSA.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints, with fixes for client-side encryption requests.&lt;br /&gt;
* Replaced the rdrbuff with a proper slab allocator for shared memory packet buffers, a significant data-plane redesign.&lt;br /&gt;
* Added automatic key rotation for encrypted flows, with related fixes for IV/tag allocation and speedup of key rotation tests.&lt;br /&gt;
* Introduced per-user shared memory packet pools, improving multi-user isolation. Also added mlock() on shared memory buffers.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules back to in-tree CMakeLists, plus new targets for coverage reports, build_tests, and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1904</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1904"/>
		<updated>2026-02-22T16:52:57Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 (Current version, February 22, 2026) ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including SLH-DSA tests and per-algorithm gating, and PQC-aware config loading in IRMd.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints, with fixes for client-side encryption requests.&lt;br /&gt;
* Replaced the rdrbuff with a proper slab allocator for shared memory packet buffers, a significant data-plane redesign.&lt;br /&gt;
* Added automatic key rotation for encrypted flows, with related fixes for IV/tag allocation and speedup of key rotation tests.&lt;br /&gt;
* Introduced per-user shared memory packet pools, improving multi-user isolation. Also added mlock() on shared memory buffers.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules back to in-tree CMakeLists, plus new targets for coverage reports, build_tests, and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1903</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1903"/>
		<updated>2026-02-22T16:52:31Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.22 (Current version, November 7th 2025) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including SLH-DSA tests and per-algorithm gating, and PQC-aware config loading in IRMd.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints, with fixes for client-side encryption requests.&lt;br /&gt;
* Replaced the rdrbuff with a proper slab allocator for shared memory packet buffers, a significant data-plane redesign.&lt;br /&gt;
* Added automatic key rotation for encrypted flows, with related fixes for IV/tag allocation and speedup of key rotation tests.&lt;br /&gt;
* Introduced per-user shared memory packet pools, improving multi-user isolation. Also added mlock() on shared memory buffers.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules back to in-tree CMakeLists, plus new targets for coverage reports, build_tests, and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1902</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1902"/>
		<updated>2026-02-22T16:52:13Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 ==&lt;br /&gt;
&lt;br /&gt;
* Added PQC support to the library, including SLH-DSA tests and per-algorithm gating, and PQC-aware config loading in IRMd.&lt;br /&gt;
* IRMd now negotiates encryption strength between endpoints, with fixes for client-side encryption requests.&lt;br /&gt;
* Replaced the rdrbuff with a proper slab allocator for shared memory packet buffers, a significant data-plane redesign.&lt;br /&gt;
* Added automatic key rotation for encrypted flows, with related fixes for IV/tag allocation and speedup of key rotation tests.&lt;br /&gt;
* Introduced per-user shared memory packet pools, improving multi-user isolation. Also added mlock() on shared memory buffers.&lt;br /&gt;
* Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* Major refactoring of CMake modules back to in-tree CMakeLists, plus new targets for coverage reports, build_tests, and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 (Current version, November 7th 2025) ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1901</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1901"/>
		<updated>2026-02-22T16:51:29Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 ==&lt;br /&gt;
&lt;br /&gt;
* Post-quantum cryptography support — Added PQC support to the library, including SLH-DSA tests and per-algorithm gating, and PQC-aware config loading in IRMd.&lt;br /&gt;
* Strength-based crypto negotiation — IRMd now negotiates encryption strength between endpoints, with fixes for client-side encryption requests.&lt;br /&gt;
* Slab allocator replacing rdrbuff — Replaced the rdrbuff with a proper slab allocator for shared memory packet buffers, a significant data-plane redesign.&lt;br /&gt;
* Automatic key rotation for encryption — Added automatic key rotation for encrypted flows, with related fixes for IV/tag allocation and speedup of key rotation tests.&lt;br /&gt;
* Per-user packet pools — Introduced per-user shared memory packet pools, improving multi-user isolation. Also added mlock() on shared memory buffers.&lt;br /&gt;
* rbuff refactoring — Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
* Direct rbuff between local processes — IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
* CMake build system overhaul — Major refactoring of CMake modules back to in-tree CMakeLists, plus new targets for coverage reports, build_tests, and automatic version parsing from git tags.&lt;br /&gt;
&lt;br /&gt;
== 0.22 (Current version, November 7th 2025) ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1900</id>
		<title>Prototype Version History</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Prototype_Version_History&amp;diff=1900"/>
		<updated>2026-02-22T16:49:17Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* 0.23 (Current development branch) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is still in an early proof-of-concept prototype phase. Versions 0.x.y have no forward nor backward compatibility. We bump minor version with API or protocol changes. Within a minor version, different patch levels &#039;&#039;should&#039;&#039; be compatible (no guarantees).&lt;br /&gt;
&lt;br /&gt;
Once the functionality has reached a minimal critical mass, and a sufficient degree of software stability has been achieved, a version 1.0.0 will be released with the intention to maintain backwards compatibility from that point. This is still many (man)years off.&lt;br /&gt;
&lt;br /&gt;
This page summarizes the progress and the plans for the next prototype (minor) version. For a summary of the current implementation state, see [[Ouroboros Implementation Overview| our status page]].&lt;br /&gt;
&lt;br /&gt;
== 0.24 (Current development branch) ==&lt;br /&gt;
&lt;br /&gt;
== 0.23 ==&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Post-quantum cryptography support&#039;&#039;&#039; — Added PQC support to the library, including SLH-DSA tests and per-algorithm gating, and PQC-aware config loading in IRMd.&lt;br /&gt;
# &#039;&#039;&#039;Slab allocator replacing rdrbuff&#039;&#039;&#039; — Replaced the rdrbuff with a proper slab allocator for shared memory packet buffers, a significant data-plane redesign.&lt;br /&gt;
# &#039;&#039;&#039;Automatic key rotation for encryption&#039;&#039;&#039; — Added automatic key rotation for encrypted flows, with related fixes for IV/tag allocation and speedup of key rotation tests.&lt;br /&gt;
# &#039;&#039;&#039;Strength-based crypto negotiation&#039;&#039;&#039; — IRMd now negotiates encryption strength between endpoints, with fixes for client-side encryption requests.&lt;br /&gt;
# &#039;&#039;&#039;Per-user packet pools&#039;&#039;&#039; — Introduced per-user shared memory packet pools, improving multi-user isolation. Also added mlock() on shared memory buffers.&lt;br /&gt;
# &#039;&#039;&#039;Rbuff refactoring&#039;&#039;&#039; — Refactored the ring buffer implementation and removed the old &amp;quot;lockless&amp;quot; rbuff_ll variant.&lt;br /&gt;
# &#039;&#039;&#039;Direct rbuff between local processes&#039;&#039;&#039; — IRMd now allows direct ring buffer connections between local processes, reducing overhead for same-machine IPC.&lt;br /&gt;
# &#039;&#039;&#039;Linked list with length tracking&#039;&#039;&#039; — Added struct llist to the library, providing list operations that also track element count.&lt;br /&gt;
# &#039;&#039;&#039;CMake build system overhaul&#039;&#039;&#039; — Major refactoring of CMake modules back to in-tree CMakeLists, plus new targets for coverage reports, build_tests, and automatic version parsing from git tags.&lt;br /&gt;
# &#039;&#039;&#039;Container compatibility &amp;amp; OS X fixes&#039;&#039;&#039; — Added a container compatibility build option, and fixed SSM pool creation, OpenSSL includes, and explicit_bzero on OS X.&lt;br /&gt;
&lt;br /&gt;
== 0.22 (Current version, November 7th 2025) ==&lt;br /&gt;
* Added flow authentication and the Flow Allocation Protocol header in the irmd&lt;br /&gt;
* Added UDP/IPv6 support&lt;br /&gt;
* Added protocol level debug logging&lt;br /&gt;
* Moved encryption control from qosspec to naming system&lt;br /&gt;
* Removed qosspec parameter from the broadcast API&lt;br /&gt;
* Refactored and simplified enrolment and connection manager&lt;br /&gt;
* Complete rewrite of the DHT for the unicast layer&lt;br /&gt;
* Refactored Ethernet IPCPs&lt;br /&gt;
* Deprecated appveyor in favor of codeberg/woodpecker CI&lt;br /&gt;
* Improved test coverage&lt;br /&gt;
* Improved systemd service and pkgconfig installation logic&lt;br /&gt;
* Improved ctest integration into build system&lt;br /&gt;
&lt;br /&gt;
== 0.21 ==&lt;br /&gt;
* Moved public key handling from library to IRMd&lt;br /&gt;
* Refactor of IRMd / registry implementation&lt;br /&gt;
&lt;br /&gt;
== 0.20 ==&lt;br /&gt;
* Improved configuration file handling&lt;br /&gt;
* Improved FUSE stability&lt;br /&gt;
* Log unique IDs to enrollment requests&lt;br /&gt;
* Print logo on startup when logging to std output&lt;br /&gt;
* Fix most common hangs on exit&lt;br /&gt;
&lt;br /&gt;
== 0.19 ==&lt;br /&gt;
* Pass the N-1 layer MPL at flow allocation&lt;br /&gt;
* Add flow liveness monitoring.&lt;br /&gt;
* Allow multiple directories in an IPCP &lt;br /&gt;
* Dropped support for raptor&lt;br /&gt;
* Use one UDP port for the IPCP over UDP/IPv4&lt;br /&gt;
&lt;br /&gt;
== 0.18 ==&lt;br /&gt;
* Use QoS cube for ECN marking&lt;br /&gt;
* Always use 64-bit endpoint IDs&lt;br /&gt;
* Add RIB statistics for flow allocator&lt;br /&gt;
* Add congestion avoidance policies&lt;br /&gt;
* Add flow control policies&lt;br /&gt;
* Add GCC 10 static analyzer build option&lt;br /&gt;
&lt;br /&gt;
== 0.17 ==&lt;br /&gt;
* Rename systemd service to ouroboros&lt;br /&gt;
* Add tests for LFA and ECMP routing&lt;br /&gt;
* Add Equal-Cost Multi-Path routing policy&lt;br /&gt;
&lt;br /&gt;
== 0.16 ==&lt;br /&gt;
* Removed support for SWIG bindings&lt;br /&gt;
* Add support for appveyor CI&lt;br /&gt;
* Add encryption support using OpenSSL&lt;br /&gt;
&lt;br /&gt;
== 0.15 ==&lt;br /&gt;
* Rename normal IPCP to unicast IPCP&lt;br /&gt;
* Add flow_join API for broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.14 ==&lt;br /&gt;
* Add Explicit Congestion Notification field to DT&lt;br /&gt;
* Add broadcast IPCP&lt;br /&gt;
&lt;br /&gt;
== 0.13 ==&lt;br /&gt;
* Disable CRC32 by default&lt;br /&gt;
&lt;br /&gt;
== 0.12 ==&lt;br /&gt;
* Split error checking from FRCT&lt;br /&gt;
* Rename port_id to flow_id&lt;br /&gt;
* Rename SDU to packet&lt;br /&gt;
* Pass QoS spec at flow allocation&lt;br /&gt;
* Initial retransmission logic&lt;br /&gt;
* Support QoS specs for oping&lt;br /&gt;
* Use Endpoint ID&#039;s in fa protocol instead of fd&lt;br /&gt;
&lt;br /&gt;
== 0.11 ==&lt;br /&gt;
* Simplify reg/unreg API&lt;br /&gt;
* Support for partial packet reads&lt;br /&gt;
* Add IPCP over Ethernet DIX&lt;br /&gt;
&lt;br /&gt;
== 0.10 ==&lt;br /&gt;
* Revise lookup tracking in DHT&lt;br /&gt;
* Update man pages to CC-BY 4.0&lt;br /&gt;
&lt;br /&gt;
== 0.9 ==&lt;br /&gt;
* Add patchlevels for future versions&lt;br /&gt;
* Add support for Raptor FPGA Layer-1 PoC&lt;br /&gt;
&lt;br /&gt;
== 0.8 ==&lt;br /&gt;
* Use &amp;quot;program&amp;quot; instead of &amp;quot;application process&amp;quot;&lt;br /&gt;
* Use &amp;quot;process&amp;quot; instead of &amp;quot;application process instance&amp;quot;&lt;br /&gt;
* Send timestamp in oping&lt;br /&gt;
* Use 3-clause BSD license for tools&lt;br /&gt;
&lt;br /&gt;
== 0.7 ==&lt;br /&gt;
* Use ELF sections to init/fini ouroboros&lt;br /&gt;
* Simplify PFT for LFA routing&lt;br /&gt;
* Add RIB to expose metrics via FUSE&lt;br /&gt;
* Deprecate Common Distribution Application Protocol (CDAP)&lt;br /&gt;
* Simplify enroll API&lt;br /&gt;
* Deprecate Graph Adjancency Manager component&lt;br /&gt;
&lt;br /&gt;
== 0.6 ==&lt;br /&gt;
* Added a threadpool manager for improved concurrency&lt;br /&gt;
* Added Loop-Free Alternates (LFA) routing&lt;br /&gt;
* Add DHT as default directory policy&lt;br /&gt;
&lt;br /&gt;
== 0.5 ==&lt;br /&gt;
* Move FRCT logic from IPCP to application library&lt;br /&gt;
* Split connection establishment from flow allocation&lt;br /&gt;
* Split flow manager into flow allocator and data transfer&lt;br /&gt;
* Register hashes in a layer instead of cleartext name&lt;br /&gt;
* Add netmap support for LLC shim&lt;br /&gt;
* Initial lockless rbuff implementation&lt;br /&gt;
* Add generic thread pool management&lt;br /&gt;
* Revise flow allocation API&lt;br /&gt;
* Split authentication from CACEP&lt;br /&gt;
* Revise CACEP API&lt;br /&gt;
* Exchange application protocol information during CACEP&lt;br /&gt;
&lt;br /&gt;
== 0.4 ==&lt;br /&gt;
* Add support for syslog logging&lt;br /&gt;
* Revise RIB/CDAP as a btree structure&lt;br /&gt;
* Add B-tree implementation&lt;br /&gt;
* Add full-mesh policy for GAM&lt;br /&gt;
* Add Graph Adjacency Manager (GAM)&lt;br /&gt;
* Add flat address policy&lt;br /&gt;
* Add initial directory to normal IPCP&lt;br /&gt;
* Initial RIB/CDAP synchronization&lt;br /&gt;
* Add RIB/CDAP objects&lt;br /&gt;
* Add operf tool&lt;br /&gt;
&lt;br /&gt;
== 0.3 ==&lt;br /&gt;
* Move all shared memory (shm) mgmt to IRMd&lt;br /&gt;
* Use shared memory tx/rx ring buffer per flow&lt;br /&gt;
* Split off bind/unbind (map/unmap name to process) from reg/unreg&lt;br /&gt;
&lt;br /&gt;
== 0.2 ==&lt;br /&gt;
* Add shim DIF over LLC Ethernet&lt;br /&gt;
* Add CBR tool for performance testing&lt;br /&gt;
* Add IPCP over local memory&lt;br /&gt;
&lt;br /&gt;
== 0.1 ==&lt;br /&gt;
* Add full flow allocator to UDP shim&lt;br /&gt;
* Implementation of flow related ops&lt;br /&gt;
* Simple echo application&lt;br /&gt;
* Initial shim IPCP over UDP/IPv4&lt;br /&gt;
* Add RINA name helpers&lt;br /&gt;
* Initial library code&lt;br /&gt;
* Initial SDU/PDU buffer code&lt;br /&gt;
* Initial APIs for IRM/IPCP/CFAP/DIF allocator&lt;br /&gt;
* Initial CDAP header&lt;br /&gt;
* LICENSE and CONTRIBUTORS files&lt;br /&gt;
* Initial documenents and GPLv2 license&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1899</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1899"/>
		<updated>2026-02-14T15:16:19Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 1: No Authentication, No Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated ephemeral prime256v1 keys (91 bytes).&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] No crt provided.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client cipher aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client KDF sha256.&lt;br /&gt;
irmd/oap(II): [80fd6f9509a996b0] No key exchange.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated prime256v1 ephemeral keys.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] &amp;lt;--&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1898</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1898"/>
		<updated>2026-02-14T15:15:44Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 2: No Authentication, With Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated ephemeral prime256v1 keys (91 bytes).&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] No crt provided.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client cipher aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client KDF sha256.&lt;br /&gt;
irmd/oap(II): [80fd6f9509a996b0] No key exchange.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated prime256v1 ephemeral keys.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] &amp;lt;--&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1897</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1897"/>
		<updated>2026-02-14T15:14:50Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 4: With Authentication, No Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] KEX config: algo=prime256v1, mode=server-encap, cipher=aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated ephemeral prime256v1 keys (91 bytes).&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] No crt provided.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client cipher aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client KDF sha256.&lt;br /&gt;
irmd/oap(II): [80fd6f9509a996b0] No key exchange.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated prime256v1 ephemeral keys.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] &amp;lt;--&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1896</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1896"/>
		<updated>2026-02-14T14:59:54Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 4: With Authentication, No Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] KEX config: algo=prime256v1, mode=server-encap, cipher=aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated ephemeral prime256v1 keys (91 bytes).&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] No crt provided.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client cipher aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client KDF sha256.&lt;br /&gt;
irmd/oap(II): [80fd6f9509a996b0] No key exchange.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated prime256v1 ephemeral keys.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] &amp;lt;--&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [03e47baa966a5823 @ 2026-02-14 14:09:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [03e47baa966a5823] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1895</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1895"/>
		<updated>2026-02-14T14:56:42Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 3: With Authentication, With Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] KEX config: algo=prime256v1, mode=server-encap, cipher=aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated ephemeral prime256v1 keys (91 bytes).&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] No crt provided.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client cipher aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client KDF sha256.&lt;br /&gt;
irmd/oap(II): [80fd6f9509a996b0] No key exchange.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated prime256v1 ephemeral keys.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] &amp;lt;--&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [c904b18b563dc1b0 @ 2026-02-14 14:09:47 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: [560 bytes]&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Loaded peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Got public key from crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully verified peer crt.&lt;br /&gt;
irmd/oap(DB): [c904b18b563dc1b0] Successfully authenticated peer.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33642 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf does not exist.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211 @ 2026-01-01 11:27:34 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1894</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1894"/>
		<updated>2026-02-14T14:51:49Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 2: No Authentication, With Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] KEX config: algo=prime256v1, mode=server-encap, cipher=aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated ephemeral prime256v1 keys (91 bytes).&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] No crt provided.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client cipher aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Selected client KDF sha256.&lt;br /&gt;
irmd/oap(II): [80fd6f9509a996b0] No key exchange.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated prime256v1 ephemeral keys.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [32 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33500 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33500.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b @ 2026-01-01 11:27:25 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33198.&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33642 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf does not exist.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211 @ 2026-01-01 11:27:34 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1893</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1893"/>
		<updated>2026-02-14T14:49:28Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 2: No Authentication, With Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] KEX config: algo=prime256v1, mode=server-encap, cipher=aes-256-gcm.&lt;br /&gt;
irmd/oap(DB): [80fd6f9509a996b0] Generated ephemeral prime256v1 keys (91 bytes).&lt;br /&gt;
irmd/oap(PP): OAP_HDR [80fd6f9509a996b0 @ 2026-02-14 14:09:38 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Key Exchange Data: [91 bytes] [Server encaps]&lt;br /&gt;
irmd/oap(PP):   Cipher: aes-256-gcm&lt;br /&gt;
irmd/oap(PP):   KDF: HKDF-sha256&lt;br /&gt;
irmd/oap(PP):   Digest: sha256&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33198.&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3fa5ac1a91a23936] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by sec.oping.tut.o7s.&lt;br /&gt;
==33047== reg/name(DB): Process 33198 accepting flows for sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33500 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33500.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b @ 2026-01-01 11:27:25 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33198.&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33642 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf does not exist.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211 @ 2026-01-01 11:27:34 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1892</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1892"/>
		<updated>2026-02-14T14:46:17Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 1: No Authentication, No Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:57 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: [48 bytes]&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured (except for the request hash in the response). Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33356 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33356.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3fa5ac1a91a23936 @ 2026-01-01 11:27:15 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33198.&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3fa5ac1a91a23936] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by sec.oping.tut.o7s.&lt;br /&gt;
==33047== reg/name(DB): Process 33198 accepting flows for sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33500 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33500.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b @ 2026-01-01 11:27:25 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33198.&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33642 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf does not exist.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211 @ 2026-01-01 11:27:34 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1891</id>
		<title>Ouroboros Tutorial 06</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_06&amp;diff=1891"/>
		<updated>2026-02-14T14:42:30Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Test 1: No Authentication, No Encryption */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ouroboros Tutorial 06 - Authenticated Flows =&lt;br /&gt;
&lt;br /&gt;
This tutorial demonstrates setting up and using authenticated flows in Ouroboros with certificate-based authentication.&lt;br /&gt;
&lt;br /&gt;
The overall flow of authenticated flow allocation is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tutorial Directory:&#039;&#039;&#039; This tutorial will execute in &amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;. All configuration files, generated certificates, logs, and packet captures will be stored in this directory.&lt;br /&gt;
&lt;br /&gt;
We create a complete PKI (Public Key Infrastructure):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Root CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;ca.tut.o7s&amp;lt;/code&amp;gt;): Self-signed trust anchor&lt;br /&gt;
* &#039;&#039;&#039;Intermediate CA&#039;&#039;&#039; (&amp;lt;code&amp;gt;sign.tut.o7s&amp;lt;/code&amp;gt;): Signed by root with pathlen:0 constraint&lt;br /&gt;
* &#039;&#039;&#039;Server Certificate&#039;&#039;&#039; (&amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;): Signed by intermediate CA&lt;br /&gt;
&lt;br /&gt;
This tutorial uses ECDSA P-384 with SHA-384 hashing.&lt;br /&gt;
&lt;br /&gt;
== Setting Up the Tutorial ==&lt;br /&gt;
&lt;br /&gt;
To properly understand and debug the authenticated flows, this tutorial uses a debug build of Ouroboros with OAP protocol debugging enabled.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /path/to/ouroboros&lt;br /&gt;
mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
cmake -DCMAKE_BUILD_TYPE=Debug -DDEBUG_PROTO_OAP=ON ..&lt;br /&gt;
make -j$(nproc)&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When built with these options, the IRMd will output detailed OAP protocol information.&lt;br /&gt;
&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
&lt;br /&gt;
The following three files should be created in the tutorial directory (&amp;lt;code&amp;gt;/tmp/o7s-tut06/&amp;lt;/code&amp;gt;) before starting the tutorial:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tut06.conf&#039;&#039;&#039; - IRMd configuration&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Ouroboros Tutorial 06 - Authenticated Flows Configuration&lt;br /&gt;
# Uses system-installed certificates at /etc/ouroboros/security/&lt;br /&gt;
&lt;br /&gt;
[name.&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[eth-dix.eth-dix-lo]&lt;br /&gt;
bootstrap=&amp;quot;eth-dix-network&amp;quot;&lt;br /&gt;
dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
reg=[&amp;quot;sec.oping.tut.o7s&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ca.tut.o7s.cnf&#039;&#039;&#039; - OpenSSL configuration for PKI generation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
# Unified OpenSSL Configuration for Ouroboros Tutorial 06&lt;br /&gt;
# Named CA sections: CA_root (signs intermediate), CA_intermediate (signs server)&lt;br /&gt;
# Usage: openssl ca -name CA_root -config ca.tut.o7s.cnf ...&lt;br /&gt;
&lt;br /&gt;
[ req ]&lt;br /&gt;
default_bits       = 384&lt;br /&gt;
default_keyfile    = private/key.pem&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
string_mask        = utf8only&lt;br /&gt;
default_md         = sha384&lt;br /&gt;
x509_extensions    = v3_ca&lt;br /&gt;
&lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
countryName                 = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName         = State or Province Name&lt;br /&gt;
localityName                = Locality Name&lt;br /&gt;
organizationName            = Organization Name&lt;br /&gt;
commonName                  = Common Name&lt;br /&gt;
&lt;br /&gt;
countryName_default         = BE&lt;br /&gt;
stateOrProvinceName_default = OVL&lt;br /&gt;
localityName_default        = Ghent&lt;br /&gt;
organizationName_default    = o7s&lt;br /&gt;
&lt;br /&gt;
[ ca ]&lt;br /&gt;
default_ca = CA_root&lt;br /&gt;
&lt;br /&gt;
[ CA_root ]&lt;br /&gt;
dir             = ./pki/root&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/ca.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/ca.tut.o7s.key.pem&lt;br /&gt;
default_days    = 3650&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ CA_intermediate ]&lt;br /&gt;
dir             = ./pki/sign&lt;br /&gt;
database        = $dir/index.txt&lt;br /&gt;
serial          = $dir/serial&lt;br /&gt;
new_certs_dir   = $dir/certs&lt;br /&gt;
certificate     = $dir/certs/sign.tut.o7s.crt.pem&lt;br /&gt;
private_key     = $dir/private/sign.tut.o7s.key.pem&lt;br /&gt;
default_days    = 365&lt;br /&gt;
default_md      = sha384&lt;br /&gt;
policy          = policy_loose&lt;br /&gt;
&lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
commonName = supplied&lt;br /&gt;
&lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
&lt;br /&gt;
[ server_cert ]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gen-pki.sh&#039;&#039;&#039; - PKI generation script&lt;br /&gt;
&lt;br /&gt;
This script will:&lt;br /&gt;
1. Create the directory structure&lt;br /&gt;
2. Generate the root CA key and certificate&lt;br /&gt;
3. Generate the intermediate CA key and CSR&lt;br /&gt;
4. Sign the intermediate CA certificate&lt;br /&gt;
5. Generate the server certificate key and CSR&lt;br /&gt;
6. Sign the server certificate&lt;br /&gt;
7. Verify the complete certificate chain&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Ouroboros Tutorial 06 - PKI Generation Script (Simplified)&lt;br /&gt;
# Generates: Root CA, Intermediate CA, and Server Certificate&lt;br /&gt;
&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
if [ ! -f ca.tut.o7s.cnf ]; then&lt;br /&gt;
    echo &amp;quot;ERROR: ca.tut.o7s.cnf not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
mkdir -p pki/{root,sign,server}/{certs,private,csr}&lt;br /&gt;
&lt;br /&gt;
# Root CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/root/private/ca.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -x509 -sha384 -days 7300 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/root/private/ca.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=ca.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# Intermediate CA&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/sign/private/sign.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/sign/private/sign.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sign.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/root/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/root/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_root -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions v3_intermediate_ca -days 3650 -md sha384 -batch \&lt;br /&gt;
    -in pki/sign/csr/sign.tut.o7s.csr \&lt;br /&gt;
    -out pki/sign/certs/sign.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Server Certificate&lt;br /&gt;
openssl ecparam -genkey -name secp384r1 -out pki/server/private/sec.oping.tut.o7s.key.pem 2&amp;gt;/dev/null&lt;br /&gt;
openssl req -new -sha384 \&lt;br /&gt;
    -config ca.tut.o7s.cnf \&lt;br /&gt;
    -key pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
    -out pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -subj &amp;quot;/C=BE/ST=OVL/L=Ghent/O=o7s/CN=sec.oping.tut.o7s&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
touch pki/sign/index.txt&lt;br /&gt;
echo 1000 &amp;gt; pki/sign/serial&lt;br /&gt;
&lt;br /&gt;
openssl ca -name CA_intermediate -config ca.tut.o7s.cnf \&lt;br /&gt;
    -extensions server_cert -days 365 -md sha384 -batch \&lt;br /&gt;
    -in pki/server/csr/sec.oping.tut.o7s.csr \&lt;br /&gt;
    -out pki/server/certs/sec.oping.tut.o7s.crt.pem 2&amp;gt;&amp;amp;1 | grep -E &amp;quot;Signature ok|Database updated&amp;quot; || true&lt;br /&gt;
&lt;br /&gt;
# Verify chain&lt;br /&gt;
openssl verify -CAfile pki/root/certs/ca.tut.o7s.crt.pem \&lt;br /&gt;
    -untrusted pki/sign/certs/sign.tut.o7s.crt.pem \&lt;br /&gt;
    pki/server/certs/sec.oping.tut.o7s.crt.pem &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;PKI generation complete.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 1: Running the Tutorial - Single Session with 4 Tests ==&lt;br /&gt;
&lt;br /&gt;
This section demonstrates a single continuous session with one IRMd and tcpdump instance. The configuration file (&amp;lt;code&amp;gt;tut06.conf&amp;lt;/code&amp;gt;) includes autostart for oping, so the server is ready immediately when IRMd starts.&lt;br /&gt;
&lt;br /&gt;
First install the &#039;&#039;&#039;CA and Intermediate CA only&#039;&#039;&#039; to the system security directories. The server certificate will be installed later during Test 3 (authentication test):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /etc/ouroboros/security/{cacert,untrusted,server/sec.oping.tut.o7s,client/sec.oping.tut.o7s}&lt;br /&gt;
&lt;br /&gt;
# Run the PKI generation script&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo chmod +x gen-pki.sh&lt;br /&gt;
sudo ./gen-pki.sh&lt;br /&gt;
&lt;br /&gt;
# Install Root CA (trust anchor)&lt;br /&gt;
sudo cp pki/root/certs/ca.tut.o7s.crt.pem /etc/ouroboros/security/cacert/&lt;br /&gt;
&lt;br /&gt;
# Install Intermediate CA (for certificate chain validation)&lt;br /&gt;
sudo cp pki/sign/certs/sign.tut.o7s.crt.pem /etc/ouroboros/security/untrusted/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Tutorial (3 Terminals) ===&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we run a single IRMd session with a concurrent tcpdump instance to capture it. We then run four oping client tests while the IRMd/tcpdump sessions are going, modifying the security configuration between tests. After the tests are complete, we can will down the IRMd and tcpdump sessions with Ctrl-C.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1: Start tcpdump to capture all packets (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tcpdump -i lo -n -A -v -U -w /tmp/o7s-tut06/tut06.pcap &amp;quot;ether proto 0xa000&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2: Start IRMd with debug output (runs continuously)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /tmp/o7s-tut06&lt;br /&gt;
sudo irmd --config tut06.conf --stdout 2&amp;gt;&amp;amp;1 | tee /tmp/o7s-tut06/irmd.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3: Run the tests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Test 1: No Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Verify directories are empty&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/client/sec.oping.tut.o7s/*&lt;br /&gt;
sudo ls -la /etc/ouroboros/security/server/sec.oping.tut.o7s/*&lt;br /&gt;
&lt;br /&gt;
# Run first ping test&lt;br /&gt;
echo &amp;quot;=== Test 1: No Authentication, No Encryption ===&amp;quot;&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Client initiates plaintext flow allocation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
irmd/oap(DB): [60e824383b3fbd6a] KEX config: algo=none, mode=server-encap, cipher=none.&lt;br /&gt;
irmd/oap(PP): OAP_HDR [60e824383b3fbd6a @ 2026-02-14 14:08:56 (UTC) ] --&amp;gt;&lt;br /&gt;
irmd/oap(PP):   crt: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Cipher: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   KDF: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Digest: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Req Hash: &amp;lt;none&amp;gt;&lt;br /&gt;
irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 1: Server accepts and completes handshake&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [f1c3efe0833e2c76] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by sec.oping.tut.o7s.&lt;br /&gt;
==33047== reg/name(DB): Process 33198 accepting flows for sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; All OAP fields are &amp;lt;code&amp;gt;&amp;lt;none&amp;gt;&amp;lt;/code&amp;gt; because no security is configured. Flow succeeds with plaintext communication.&lt;br /&gt;
&lt;br /&gt;
==== Test 2: No Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Enable encryption for client only&lt;br /&gt;
sudo touch /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run second ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Client initiates flow with encryption enabled&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33356 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33356.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3fa5ac1a91a23936 @ 2026-01-01 11:27:15 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 2: Server receives and responds with ephemeral key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33198.&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3fa5ac1a91a23936] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by sec.oping.tut.o7s.&lt;br /&gt;
==33047== reg/name(DB): Process 33198 accepting flows for sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Both client and server generate ephemeral keys (91 bytes each) for encryption. No certificates because authentication is not required. Encryption and authentication are independent.&lt;br /&gt;
&lt;br /&gt;
==== Test 3: With Authentication, With Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install server certificates and keys&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/certs/sec.oping.tut.o7s.crt.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/crt.pem&lt;br /&gt;
sudo cp /tmp/o7s-tut06/pki/server/private/sec.oping.tut.o7s.key.pem \&lt;br /&gt;
        /etc/ouroboros/security/server/sec.oping.tut.o7s/key.pem&lt;br /&gt;
&lt;br /&gt;
# enc.conf is still in place from Test 2&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client initiates flow with encryption and server has certificate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33500 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Encryption enabled for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33500.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b @ 2026-01-01 11:27:25 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Server responds with certificate + ephemeral key + signature&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Generated ephemeral keys for 33198.&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [3f89a905c0e5571b] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: [91 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 3: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Full OAP handshake with certificate (560 bytes) + ephemeral keys (91 bytes) + signature (103 bytes). Client verifies server&#039;s certificate against CA store and confirms authentication success.&lt;br /&gt;
&lt;br /&gt;
==== Test 4: With Authentication, No Encryption ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Remove encryption config but keep certificates&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf&lt;br /&gt;
&lt;br /&gt;
# Run fourth ping test&lt;br /&gt;
oping -n sec.oping.tut.o7s -c 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client initiates plaintext flow (no encryption file)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): Allocating flow for 33642 to sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/enc.conf does not exist.&lt;br /&gt;
==33047== irmd(DB): File /etc/ouroboros/security/client/sec.oping.tut.o7s/crt.pem does not exist.&lt;br /&gt;
==33047== irmd(II): No security info for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211 @ 2026-01-01 11:27:34 (UTC) ] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: &amp;lt;none&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Server responds with certificate + signature (no ephemeral key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(II): No certificate provided by &amp;lt;client&amp;gt;.&lt;br /&gt;
==33047== irmd/oap(PP): OAP_HDR [9b383e855577d211] --&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Certificate: [560 bytes]&lt;br /&gt;
==33047== irmd/oap(PP):   Ephemeral Public Key: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Data: &amp;lt;none&amp;gt;&lt;br /&gt;
==33047== irmd/oap(PP):   Signature: [103 bytes]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IRMd Output - Test 4: Client verifies certificate and authenticates&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
==33047== irmd(DB): Loaded peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Certificate matches name sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(DB): Got public key from certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully verified peer certificate for sec.oping.tut.o7s.&lt;br /&gt;
==33047== irmd(II): Successfully authenticated sec.oping.tut.o7s.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039; Server sends certificate + signature for authentication, but NO ephemeral keys (plaintext data). Data exchanged without encryption even though authenticated. Demonstrates that authentication and encryption are independent mechanisms.&lt;br /&gt;
&lt;br /&gt;
=== Stop the IRMd and tcpdump, clean up the tutorial files ===&lt;br /&gt;
&lt;br /&gt;
Once all tests complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop IRMd in Terminal 2 (Ctrl+C)&lt;br /&gt;
# Stop tcpdump in Terminal 1 (Ctrl+C)&lt;br /&gt;
&lt;br /&gt;
# Clean up tutorial security files from system&lt;br /&gt;
sudo rm -f /etc/ouroboros/security/cacert/ca.tut.o7s.crt.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Part 2: PCAP Trace Analysis ==&lt;br /&gt;
&lt;br /&gt;
After the tutorial, we now explain the trace in the tcpdump pcap file.&lt;br /&gt;
&lt;br /&gt;
=== Protocol Overview ===&lt;br /&gt;
&lt;br /&gt;
This section summarizes the four protocols that work together in the captured packet flow.&lt;br /&gt;
&lt;br /&gt;
==== Ethernet DIX Frame with EID Header ====&lt;br /&gt;
&lt;br /&gt;
Ouroboros extends the DIX frame with a flow identifier (EID - Endpoint Identifier) and length field.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Octets !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Destination MAC || 0-5 || 6 bytes || Hardware address of destination&lt;br /&gt;
|-&lt;br /&gt;
| Source MAC || 6-11 || 6 bytes || Hardware address of source&lt;br /&gt;
|-&lt;br /&gt;
| EtherType || 12-13 || 2 bytes || Protocol identifier (0xA000 for Ouroboros)&lt;br /&gt;
|-&lt;br /&gt;
| EID || 14-15 || 2 bytes || Destination Endpoint Identifier&lt;br /&gt;
|-&lt;br /&gt;
| Length || 16-17 || 2 bytes || Payload length (needed because of runt frame padding)&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 18+ || Variable || Frame data (up to MTU size)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ethernet Flow Allocator - Management Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ethernet DIX management protocol handles flow allocation, setup, and teardown. All management frames use destination EID &amp;lt;code&amp;gt;0x0000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Management Frame Types:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Code !! Type !! Direction !! Service Hash !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Request new flow allocation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;FLOW_REPLY&amp;lt;/code&amp;gt; || Server → Client || – Not included || Respond to flow request (success/failure)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REQ&amp;lt;/code&amp;gt; || Client → Server || ✓ Included || Query if a remote name is reachable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NAME_QUERY_REPLY&amp;lt;/code&amp;gt; || Server → Client || ✓ Included || Response to name query&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The 32-byte service hash (SHA3-256) is appended after the management protocol header for NAME_QUERY_* and FLOW_REQ messages to identify which service is being queried or allocated. FLOW_REPLY does not include the service hash; the endpoints are already identified by the allocated EIDs (SEID/DEID) and the flow allocation ID in the OAP header (see below).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| SEID || 0-1 || 2 bytes || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| DEID || 2-3 || 2 bytes || Destination Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Loss || 4-7 || 4 bytes || Acceptable packet loss (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Bandwidth || 8-15 || 8 bytes || Required bandwidth (bps)&lt;br /&gt;
|-&lt;br /&gt;
| BER || 16-19 || 4 bytes || Bit error rate (ppm)&lt;br /&gt;
|-&lt;br /&gt;
| Max Gap || 20-23 || 4 bytes || Maximum consecutive lost packets&lt;br /&gt;
|-&lt;br /&gt;
| Delay || 24-27 || 4 bytes || Maximum latency (ms)&lt;br /&gt;
|-&lt;br /&gt;
| Timeout || 28-31 || 4 bytes || Flow idle timeout (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| Response || 32-35 || 4 bytes || Response code (0=success, negative=error)&lt;br /&gt;
|-&lt;br /&gt;
| In-Order || 36 || 1 byte || In-order delivery requirement (boolean)&lt;br /&gt;
|-&lt;br /&gt;
| Code || 37 || 1 byte || Message type (FLOW_REQ, FLOW_REPLY, etc.)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || 38 || 1 byte || Availability status&lt;br /&gt;
|-&lt;br /&gt;
| Service hash || 39-61 || 32 bytes || SHA3-256 hash (optional, see above)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ouroboros Flow Allocation Protocol (OAP) ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Application Protocol (OAP) is the flow allocation and authentication protocol. It carries flow negotiation requests, responses, and authentication credentials. OAP frames are encapsulated as data payload over the management protocol.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ID || 0-15 || 16 bytes || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp || 16-23 || 8 bytes || Creation timestamp (UTC, seconds and microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| Crt Length || 24-25 || 2 bytes || Certificate length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Certificate || 26+ || Variable || X.509 certificate (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Eph Length || Variable || 2 bytes || Ephemeral public key length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Ephemeral Key || Variable || Variable || ECDHE public key (DER/raw encoded)&lt;br /&gt;
|-&lt;br /&gt;
| Data Length || Variable || 2 bytes || Application data length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Data || Variable || Variable || Piggybacked application-layer data&lt;br /&gt;
|-&lt;br /&gt;
| Sig Length || Variable || 2 bytes || Signature length (bytes)&lt;br /&gt;
|-&lt;br /&gt;
| Signature || Variable || Variable || Digital signature (ECDSA, DER encoded)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Oping Application Protocol ====&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Ping (oping) application is a simple echo/reply protocol used to measure round-trip time and validate connectivity between applications. It implements a request/reply pattern similar to ICMP ping.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Layout by Field:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Type || 0-3 || 4 bytes || Message type (ECHO_REQUEST=0 or ECHO_REPLY=1)&lt;br /&gt;
|-&lt;br /&gt;
| ID || 4-7 || 4 bytes || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (seconds) || 8-15 || 8 bytes || Seconds when message was sent (CLOCK_REALTIME)&lt;br /&gt;
|-&lt;br /&gt;
| Timestamp (nanoseconds) || 16-23 || 8 bytes || Nanoseconds component of timestamp&lt;br /&gt;
|-&lt;br /&gt;
| Payload || 24+ || Variable || Application data (configurable size, default 64 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Field Definitions:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type&#039;&#039;&#039; (4 bytes): Message type selector&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000000&amp;lt;/code&amp;gt; (ECHO_REQUEST): Client-to-server ping request&lt;br /&gt;
** &amp;lt;code&amp;gt;0x00000001&amp;lt;/code&amp;gt; (ECHO_REPLY): Server-to-client response&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ID&#039;&#039;&#039; (4 bytes): Sequence number for matching requests with replies. Incremented for each ping sent.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit seconds component from when the ping was sent (CLOCK_REALTIME).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; (8 bytes): Network-byte-order 64-bit nanoseconds component (0-999999999) for high-resolution timing.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Payload&#039;&#039;&#039; (Variable): Application data echoed back by the server. Size is configurable (default 64 bytes, maximum 1500 bytes).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Usage:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Client sends ECHO_REQUEST with current timestamp&lt;br /&gt;
* Server receives request and echoes back as ECHO_REPLY with the same ID and timestamps&lt;br /&gt;
* Client calculates RTT by comparing reception time with original timestamps&lt;br /&gt;
* Out-of-order detection by tracking sequence numbers (ID field)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 1 - No authentication/encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 1: NAME_QUERY_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends a NAME_QUERY_REQ message to discover if the service &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; is available. This is a broadcast discovery query sent because the service is not yet known for the flow allocation process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.165639 00:00:00:00:00:00 &amp;gt; ff:ff:ff:ff:ff:ff, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0002 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 2: NAME_QUERY_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to the NAME_QUERY_REQ by sending a NAME_QUERY_REPLY for the service hash.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.166073 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0000 0000 0000 0000 0000 0000  ...G............&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0003 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a              ..f.i.._...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0000 || Source Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;03&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x03 || Message Type: NAME_QUERY_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt; (echoed back)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Packet 3: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates a flow allocation request (FLOW_REQ) with minimal OAP headers since no authentication or encryption is being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:48.167222 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a51 8a56 ff6f  ..f.i.._...Q.V.o&lt;br /&gt;
        0x0050:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e103  [...}....0w.....&lt;br /&gt;
        0x0060:  3e52 3300 0000 0000 0000 00              &amp;gt;R3........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || -- || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0001 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x4b (after management protocol + service hash):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e103 3e52 33&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp (seconds + microseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 (first allocated flow ID for this session)&lt;br /&gt;
* Service hash is carried in management protocol payload (32 bytes)&lt;br /&gt;
* OAP header is minimal: only ID and timestamp, no optional fields&lt;br /&gt;
* No certificate, ephemeral key, data, or signature in this initial request&lt;br /&gt;
* Client sends minimal OAP headers with no authentication or encryption setup at allocation time&lt;br /&gt;
&lt;br /&gt;
==== Packet 4: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to FLOW_REQ by sending FLOW_REPLY with a new DEID (destination endpoint ID 0x0041) to establish the allocated flow for data transfer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:49.178732 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 89:&lt;br /&gt;
        0x0000:  0000 0047 0041 0040 0000 0000 0000 0000  ...G.A.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0051 8a56 ff6f  ...........Q.V.o&lt;br /&gt;
        0x0030:  5ba6 9d03 7da1 cfc3 0f30 7718 86a8 e13f  [...}....0w....?&lt;br /&gt;
        0x0040:  a347 3800 0000 0000 0000 00              .G8........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0047&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 71 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server-side flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0|| Response code (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The OAP payload starts at offset 0x2b (no service hash in FLOW_REPLY):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;51 8a56 ff6f 5ba6 9d03 7da1 cfc3 0f30 77&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Echo of client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e13f a347 38&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || No ephemeral key&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0x48 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x49-0x4a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0041 is the newly allocated server-side flow endpoint&lt;br /&gt;
* DEID 0x0040 reflects the client&#039;s flow ID, creating a bidirectional mapping&lt;br /&gt;
* No service hash included (FLOW_REPLY only needs the EIDs to identify the flow)&lt;br /&gt;
* OAP echoes the client&#039;s ID and timestamp, confirming the flow allocation&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
* Both client and server now have their respective flow IDs (0x0040 and 0x0041) for data transfer&lt;br /&gt;
* Response code 0x00000000 indicates success&lt;br /&gt;
&lt;br /&gt;
==== Packet 5: ECHO_REQUEST - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends an oping ECHO_REQUEST packet to the server using the allocated flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.180824 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 7377 0000  .A.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (server → client)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number (first ping)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Seconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Nanoseconds component&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (default 64 bytes total - 24 byte header = 40 bytes data)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0041 shows traffic from server-side flow ID&lt;br /&gt;
* This is the first ping request (ID = 0x00000000)&lt;br /&gt;
* Timestamp captures when the ping was sent (seconds in network order)&lt;br /&gt;
* Default oping payload is 64 bytes total; 24 bytes header + 40 bytes data&lt;br /&gt;
&lt;br /&gt;
==== Packet 6: ECHO_REPLY - Plaintext Data ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives the ECHO_REQUEST and immediately sends back an ECHO_REPLY with the same ID and timestamps, echoing the client&#039;s message.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:50.181496 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 7377 0000  .@.@........sw..&lt;br /&gt;
        0x0010:  0000 0000 b03e e007 0000 0000 0000 0000  .....&amp;gt;..........&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client ← server)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Oping payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY Payload&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The oping payload starts at offset 0x04:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;7377 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || 0x0000000000003773 || Echo of original seconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;b03e e007 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || 0x0000000007e03eb0 || Echo of original nanoseconds&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 0000 ... 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || All zeros || Echo data (unchanged from request)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows traffic from client-side flow ID receiving the reply&lt;br /&gt;
* Type field changed from 0x00000000 (REQUEST) to 0x00000001 (REPLY)&lt;br /&gt;
* ID, timestamps, and payload data are identical to the request (echoed back)&lt;br /&gt;
* Round-trip time can be calculated by comparing current time with echoed timestamp&lt;br /&gt;
* Ping succeeded on first attempt with minimal latency (~1 millisecond between timestamps)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 2 - No authentication, with encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 7: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with encryption enabled. This FLOW_REQ carries an OAP header with an ephemeral ECDHE P-384 public key (91 bytes) for encryption setup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.808158 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8af1 766b 547c  ..f.i.._....vkT|&lt;br /&gt;
        0x0050:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0060:  8b6c 9000 0000 5b30 5930 1306 072a 8648  .l....[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 c508 1c19 6106 b7e9 3074 57b9 bb16  ......a...0tW...&lt;br /&gt;
        0x0090:  6959 4a55 81f9 169b cc79 fe10 a882 41fe  iYJU.....y....A.&lt;br /&gt;
        0x00a0:  0697 c9b4 f8f0 5562 7fa2 c7a0 a020 1ac6  ......Ub........&lt;br /&gt;
        0x00b0:  939f 23ff b2fb 07a2 b747 aacc 474a 3dab  ..#......G..GJ=.&lt;br /&gt;
        0x00c0:  2598 0000 0000                           %.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e253 8b6c 90&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 ... 3dab 2598&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd5-0xd6 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* Encryption enabled: ephemeral key present (91 bytes)&lt;br /&gt;
* Client sends no certificate, allowing anonymous encryption setup&lt;br /&gt;
* No signature (unsigned OAP)&lt;br /&gt;
* Ephemeral key is ECDHE P-384 for key exchange&lt;br /&gt;
&lt;br /&gt;
==== Packet 8: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the encrypted flow allocation request. FLOW_REPLY contains the server&#039;s ephemeral key but no certificate (since client didn&#039;t send one).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:53.810564 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 180:&lt;br /&gt;
        0x0000:  0000 00a2 0042 0040 0000 0000 0000 0000  .....B.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 00f1 766b 547c  ............vkT|&lt;br /&gt;
        0x0030:  fcb0 8fce 5d60 a01e e8be 0218 86a8 e253  ....]`.........S&lt;br /&gt;
        0x0040:  b694 e800 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0050:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0060:  0004 5f3c 6929 cca2 024a ae9f 9aa1 dfc2  .._&amp;lt;i)...J......&lt;br /&gt;
        0x0070:  a493 3ff3 ff58 b054 74dc d2e2 47fc 7c5b  ..?..X.Tt...G.|[&lt;br /&gt;
        0x0080:  eff5 e129 72b4 de1e 7c09 bf8c fe38 5e8b  ...)r...|....8^.&lt;br /&gt;
        0x0090:  b22e 59ed 6eb9 dfda 369d 691e 6e2c 122c  ..Y.n...6.i.n,.,&lt;br /&gt;
        0x00a0:  9936 0000 0000                           .6....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00a2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 162 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0042 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY with Ephemeral Key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;f1 766b 547c fcb0 8fce 5d60 a01e e8be 02&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || Echo of client ID || Echoes client&#039;s flow ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e253 b694 e8&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Echoed timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x46 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x005b (91) || Ephemeral key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x47-0xa1 || &amp;lt;code&amp;gt;30 5930...9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDHE P-384 || Server&#039;s ECDHE P-384 public key (DER encoded)&lt;br /&gt;
|-&lt;br /&gt;
| 0xd1-0xd2 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xd3-0xd4 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID 0x0042 is the new server-side flow endpoint&lt;br /&gt;
* Both keys are now exchanged; client and server can derive shared secret&lt;br /&gt;
* No authentication (no certificates) but encryption is negotiated&lt;br /&gt;
* Response indicates successful allocation&lt;br /&gt;
&lt;br /&gt;
==== Packet 9: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after encryption keys are established. The payload is encrypted with the derived shared secret.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.815771 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0042 0060 a691 6d83 8446 cbeb ac95 c2eb  .B.`..m..F......&lt;br /&gt;
        0x0010:  4b42 e819 c67f 92c8 58d7 0641 d8a6 6e1f  KB......X..A..n.&lt;br /&gt;
        0x0020:  fc90 feed ef55 b791 4fbd a832 74bd 8bed  .....U..O..2t...&lt;br /&gt;
        0x0030:  249c 4cee 0fc0 cec6 2f1b aec1 2428 bdbd  $.L...../...$(..&lt;br /&gt;
        0x0040:  36b5 01b5 1257 004e 6ed6 7ecd f0c7 7d11  6....W.Nn.~...}.&lt;br /&gt;
        0x0050:  20ba e81b f43a 4de9 b141 1624 e1ba 0a84  .....:M..A.$....&lt;br /&gt;
        0x0060:  74b1 9a9a                                t...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0042&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0042 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REQUEST (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;a691 6d83 8446 cbeb...74b1 9a9a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* All 96 bytes of oping data (type, ID, timestamps, payload) are encrypted&lt;br /&gt;
* No plaintext oping headers visible; entire packet is ciphertext&lt;br /&gt;
* Flow IDs (0x0042) identify which encryption context to use&lt;br /&gt;
* Ping still works with encryption transparently&lt;br /&gt;
&lt;br /&gt;
==== Packet 10: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server receives encrypted ping request, decrypts it, and sends encrypted ECHO_REPLY.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:54.819574 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 c6ea 2222 5618 0268 b27e 9a91  .@.`..&amp;quot;&amp;quot;V..h.~..&lt;br /&gt;
        0x0010:  f124 1f8d bccc 478c 26fe 9b13 b3cb 5398  .$....G.&amp;amp;.....S.&lt;br /&gt;
        0x0020:  6869 3cdb 4928 510d 4de8 dc6a 3f3a 6a6d  hi&amp;lt;.I(Q.M..j?:jm&lt;br /&gt;
        0x0030:  6487 dcd8 c8cd 1a85 fba2 9ecd 3566 57d1  d...........5fW.&lt;br /&gt;
        0x0040:  1c94 ac35 518e 8509 873a 3a5e 04d9 8ee2  ...5Q....::^....&lt;br /&gt;
        0x0050:  9d74 2527 e425 5433 9d73 9ccd f56a 1f8d  .t%&#039;.%T3.s...j..&lt;br /&gt;
        0x0060:  f328 7237                                .(r7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0060&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 96 bytes || Encrypted payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oping Application Protocol - ECHO_REPLY (Encrypted)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x63 || &amp;lt;code&amp;gt;c6ea 2222 5618 0268...f328 7237&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Encrypted Data&#039;&#039;&#039; || 96 || Ciphertext || All 96 bytes encrypted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID 0x0040 shows reply going back to client-side flow&lt;br /&gt;
* Ciphertext is different from request (different plaintext: type field differs)&lt;br /&gt;
* Both encrypted packets are 96 bytes (same size as Packet 9)&lt;br /&gt;
* Client receives encrypted reply, decrypts it, verifies ID and timestamps match request&lt;br /&gt;
* Encryption is transparent at application layer: oping works exactly as with plaintext flows&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 3 - Authentication and encryption ===&lt;br /&gt;
&lt;br /&gt;
==== Packet 11: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation request with encryption enabled. Sends ephemeral public key for ECDHE key exchange but no certificate (client is not authenticating in this tutorial). The management protocol now carries a valid allocated SEID (0x0040).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.827411 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 212:&lt;br /&gt;
        0x0000:  0000 00c2 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a66 bb82 95fa  ..f.i.._...f....&lt;br /&gt;
        0x0050:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0060:  c0d2 ad00 0000 5b30 5930 1306 072a 8648  ......[0Y0...*.H&lt;br /&gt;
        0x0070:  ce3d 0201 0608 2a86 48ce 3d03 0107 0342  .=....*.H.=....B&lt;br /&gt;
        0x0080:  0004 9dea c238 6732 4987 1cd4 7133 9614  .....8g2I...q3..&lt;br /&gt;
        0x0090:  9d04 4fde 3f68 42f1 54fb 7ef3 88d0 ffe6  ..O.?hB.T.~.....&lt;br /&gt;
        0x00a0:  7e01 432e 56c2 2d64 72c9 19fc b0cf 1eca  ~.C.V.-dr.......&lt;br /&gt;
        0x00b0:  689e 3536 771a 8041 726c 20e2 d9bb 3589  h.56w..Arl....5.&lt;br /&gt;
        0x00c0:  86e7 0000 0000                           ......&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;00c2&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 194 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (client flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... d4c0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || Response code (&#039;&#039;&#039;UNUSED&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x00 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ... 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload with Encryption Setup&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier for Test 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e37e c0d2 ad&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || Client not authenticating&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0xc1 || &amp;lt;code&amp;gt;30 5930 1306 ... 3589&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Client&#039;s ephemeral ECDHE public key for encryption negotiation&lt;br /&gt;
|-&lt;br /&gt;
| 0xc2-0xc3 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0xc4-0xc5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0040 - Same as Test 2 (Encrypted) because this is the same client session reusing the same allocated ID from the previous test&lt;br /&gt;
* No Certificate - &amp;lt;code&amp;gt;crt_len = 0x0000&amp;lt;/code&amp;gt; because the client does not have authentication credentials; the server will authenticate instead&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; because encryption is enabled on the client&lt;br /&gt;
* No Signature - &amp;lt;code&amp;gt;sig_len = 0x0000&amp;lt;/code&amp;gt; because client is not signing (no certificate to sign with)&lt;br /&gt;
* FLOW_REQ Message Type - Code field is 0x00, and service hash is present because FLOW_REQ always includes the service hash&lt;br /&gt;
* Timestamp Consistency - Same OAP ID and timestamp structure as Test 2, but with additional security handshake&lt;br /&gt;
&lt;br /&gt;
==== Packet 12: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds to client&#039;s FLOW_REQ by sending FLOW_REPLY with its certificate for authentication, ephemeral public key for ECDHE encryption setup, and a digital signature proving ownership of the certificate. This is the full authentication response.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:58.828806 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 843:&lt;br /&gt;
        0x0000:  0000 0339 0043 0040 0000 0000 0000 0000  ...9.C.@........&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 0066 bb82 95fa  ...........f....&lt;br /&gt;
        0x0030:  91a2 7bd3 bd60 1b3e 35f6 b918 86a8 e37e  ..{..`.&amp;gt;5......~&lt;br /&gt;
        0x0040:  d566 a002 2f30 8202 2b30 8201 b2a0 0302  .f../0..+0......&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
        0x0320:  ef11 c358 f5d0 5cd7 3906 adf1 8a2c 9b25  ...X..\.9....,.%&lt;br /&gt;
        0x0330:  dc78 6050 ab61 3a3f 81c0 254b d193 7827  .x`P.a:?..%K..x&#039;&lt;br /&gt;
        0x0340:  c0e9 38c7 e0d1 c517 d299 9992 07         ..8..........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0339&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 825 bytes || Total payload length (excluding DIX header)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0043&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0043 || Source Endpoint ID (server-side allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client&#039;s flow ID from FLOW_REQ)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Default values || QoS parameters&lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Full Authentication&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;66 bb82 95fa 91a2 7bd3 bd60 1b3e 35f6 b9&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;18 86a8 e37e d566 a0&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;022f&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 559 (0x022f) || Server certificate length: 559 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x243 || &amp;lt;code&amp;gt;2f30 8202 2b ... 81c8 30&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 559 || DER-encoded X.509 || Server&#039;s certificate (signed by intermediate CA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x244-0x245 || &amp;lt;code&amp;gt;005b&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 91 (0x005b) || Server&#039;s ephemeral public key length: 91 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x246-0x2a0 || &amp;lt;code&amp;gt;30 5930 1306 ... 9936&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Ephemeral Key&#039;&#039;&#039; || 91 || ECDP-384 public key || Server&#039;s ephemeral ECDHE public key&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a4-0x2a5 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a6-0x2a7 || &amp;lt;code&amp;gt;0068&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 104 (0x0068) || Digital signature length: 104 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a8-0x30f || &amp;lt;code&amp;gt;30 6602 3100 ... 07&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 104 || ECDSA signature (DER encoded) || Server&#039;s signature over OAP header proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0043 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from the FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Full Certificate - &amp;lt;code&amp;gt;crt_len = 0x022f (559)&amp;lt;/code&amp;gt; carrying server&#039;s complete X.509 certificate signed by intermediate CA&lt;br /&gt;
* Ephemeral Key Present - &amp;lt;code&amp;gt;eph_len = 0x005b (91)&amp;lt;/code&amp;gt; with server&#039;s ECDHE public key for encryption&lt;br /&gt;
* Signature Included - &amp;lt;code&amp;gt;sig_len = 0x0068 (104)&amp;lt;/code&amp;gt; containing ECDSA digital signature over the entire OAP header&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ to confirm association (included in signature, binding response to this specific client request)&lt;br /&gt;
* Large Payload - Total of 825 bytes due to certificate (559) + ephemeral key (91) + signature (104) + overhead&lt;br /&gt;
* Authentication Complete - Client verifies: (1) certificate against CA store, (2) signature over entire response ensures authenticity and integrity, (3) echoed ID binds response to this specific request, (4) timestamp prevents replay attacks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with its certificate for authentication, ephemeral public key for ECDHE encryption, and a digital signature proving ownership of the certificate.&lt;br /&gt;
&lt;br /&gt;
==== Packet 13: Encrypted ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends encrypted ping request after authentication handshake. All application data is protected by encryption using the ephemeral keys established in Packets 11-12.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836485 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0043 0060 3bed 0b48 1be1 6930 cf3d dee9  .C.`.;..H..i0.=..&lt;br /&gt;
        0x0010:  4fc9 774b 5d63 cc9b 5a34 6604 f9ac 1016  O.wK]c..Z4f.....&lt;br /&gt;
        0x0020:  1c6d c9ac f80e dc89 31c1 9634 1a4f b2c7  .m......1..4.O..&lt;br /&gt;
        0x0030:  4721 e402 8259 b0aa 8870 4566 33d1 9c18  G!...Y..  .pEf3...&lt;br /&gt;
        0x0040:  06da 50c3 8b75 86b0 f240 d109 840e a6cd  ..P..u...@......&lt;br /&gt;
        0x0050:  d115 77cb 5652 5bfb e6d5 0ca9 dbc3 d0b8  ..w.VR[.........&lt;br /&gt;
        0x0060:  0058 fd19                                .X..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0043&amp;lt;/code&amp;gt; || Client flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REQUEST data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No visible protocol structure - all application data appears as ciphertext&lt;br /&gt;
* Uses the same source/destination EID pair (0x0043 → 0x0060) established in the FLOW_REQ/FLOW_REPLY handshake&lt;br /&gt;
* Encryption is done using the ephemeral key (91 bytes) exchanged in Packet 11&#039;s OAP header&lt;br /&gt;
* Unlike Packets 11-12, this packet contains no certificate, public keys, or signatures&lt;br /&gt;
* The 110-byte encrypted data corresponds to the original oping ECHO_REQUEST message&lt;br /&gt;
&lt;br /&gt;
==== Packet 14: Encrypted ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server sends encrypted ping reply. Note that the flow identifiers swap, demonstrating bidirectional encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:39:59.836930 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 114:&lt;br /&gt;
        0x0000:  0040 0060 d552 e100 e681 940c e35a 07d0  .@.`..........Z..&lt;br /&gt;
        0x0010:  a293 1d73 33a5 854e 0fce 4f4d 6655 267a  ...s3..N..OMfU&amp;amp;z&lt;br /&gt;
        0x0020:  3de2 663b 709d 739a a696 2ddd 7b34 28b8  =.f;p.s...-{4(...&lt;br /&gt;
        0x0030:  5a98 eec2 52c6 4288 3885 ae16 e466 4181  Z...R.B.8...fA..&lt;br /&gt;
        0x0040:  f2d6 44c1 b51b 8728 58a4 7525 fb5e 3fd6  ..D...(X.u%.^?..&lt;br /&gt;
        0x0050:  7e49 532a d2a5 bea7 55e9 c274 f1b2 0412  ~IS*....U..t....&lt;br /&gt;
        0x0060:  73d4 6436                                s.d6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame Analysis:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Offset !! Length !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Source EID || 0x00-0x01 || 2 bytes || &amp;lt;code&amp;gt;0x0040&amp;lt;/code&amp;gt; || Client&#039;s inbound flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| Destination EID || 0x02-0x03 || 2 bytes || &amp;lt;code&amp;gt;0x0060&amp;lt;/code&amp;gt; || Server flow endpoint ID&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Encrypted Payload&#039;&#039;&#039; || &#039;&#039;&#039;0x04-0x71&#039;&#039;&#039; || &#039;&#039;&#039;110 bytes&#039;&#039;&#039; || &#039;&#039;&#039;Ciphertext&#039;&#039;&#039; || &#039;&#039;&#039;AES-encrypted oping ECHO_REPLY data&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* The EID in offset 0x00 is now 0x0040 (server&#039;s view of client&#039;s inbound flow)&lt;br /&gt;
* Uses the same ephemeral key material as Packet 13, but encryption direction is reversed&lt;br /&gt;
* Both packets use AES-GCM with keys derived from the ECDH exchange&lt;br /&gt;
* Timestamp 17:39:59.836930 is only 445 microseconds after Packet 13, indicating server-side processing&lt;br /&gt;
* The 110-byte encrypted ECHO_REPLY payload is the same size as the request&lt;br /&gt;
* All application data is protected by both authentication (X.509 + ECDSA) and encryption (AES)&lt;br /&gt;
&lt;br /&gt;
=== Packet Analysis: Test 4 - Authentication, no encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Packet 15: FLOW_REQ ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client initiates flow allocation with authentication enabled but encryption disabled. This FLOW_REQ carries an OAP header but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since the client does not request encrypted communication.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.413372 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 121:&lt;br /&gt;
        0x0000:  0000 0067 0040 0000 0000 0001 0000 0000  ...g.@..........&lt;br /&gt;
        0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
        0x0020:  0001 d4c0 0000 0000 0000 00ec f815 ad98  ................&lt;br /&gt;
        0x0030:  3df6 bf81 fdc7 cb63 6eec 1563 6e60 5a94  =......cn..cn`Z.&lt;br /&gt;
        0x0040:  b1ad 66c1 690c 9e5f 9282 8a8f a6ab 6ea7  ..f.i.._........&lt;br /&gt;
        0x0050:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0060:  0de6 6100 0000 0000 0000 00              ..a.....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 103 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0040 || Source Endpoint ID (allocated flow ID)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... dc40&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || Mixed || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0 || &#039;&#039;&#039;UNUSED&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REQ&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x4a || &amp;lt;code&amp;gt;ec f815 ad98 3df6 bf81...9282 8a&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Service Hash&#039;&#039;&#039; || 32 || SHA3-256 || Hash of &amp;lt;code&amp;gt;sec.oping.tut.o7s&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REQ Payload (No Encryption)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b-0x5a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919 fa&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || Unique flow allocation identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x5b-0x62 || &amp;lt;code&amp;gt;18 86a8 e490 0de6 61&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Creation timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x63-0x64 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x0000 || No certificate in client request&lt;br /&gt;
|-&lt;br /&gt;
| 0x65-0x66 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key (no encryption)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x67-0x68 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x69-0x6a || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0000 || No signature&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* No encryption enabled: ephemeral key absent (Eph_len = 0x0000)&lt;br /&gt;
* Client requests authentication only&lt;br /&gt;
* Server will respond with certificate + signature but no ephemeral key&lt;br /&gt;
* Packet is minimal compared to Packet 11 (Test 3) which includes 91-byte ephemeral key&lt;br /&gt;
&lt;br /&gt;
==== Packet 16: FLOW_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server accepts the authenticated (but not encrypted) flow allocation request. FLOW_REPLY contains the server&#039;s X.509 certificate and ECDSA signature for client authentication, but &#039;&#039;&#039;no ephemeral key&#039;&#039;&#039; since encryption is not being used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data (abbreviated):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:03.416675 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 751:&lt;br /&gt;
        0x0000:  0000 02dd 0041 0040 0000 0000 0000 0000  .......A.@......&lt;br /&gt;
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0001 008f a6ab 6ea7  ................&lt;br /&gt;
        0x0030:  ef89 68e1 ed1e 2ede 0919 fa18 86a8 e490  .h..............&lt;br /&gt;
        0x0040:  3754 a702 2f30 8202 2b30 8201 b2a0 0302  7T../0..+0......&lt;br /&gt;
        0x0050:  0102 0202 1000 300a 0608 2a86 48ce 3d04  ......0...*.H.=.&lt;br /&gt;
        (... certificate and signature bytes ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0000 || Destination Endpoint ID (management channel)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;02dd&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 733 bytes || Total payload length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet Flow Allocator - Management Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x05 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;SEID&#039;&#039;&#039; || 2 || 0x0041 || Source Endpoint ID (allocated server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06-0x07 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;DEID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x23 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Various)&#039;&#039;&#039; || 28 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x24-0x27 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Response&#039;&#039;&#039; || 4 || 0x00000000 || Response code: 0 (success)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (In-Order)&#039;&#039;&#039; || 1 || 0 || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || &amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Code&#039;&#039;&#039; || 1 || 0x01 || Message Type: FLOW_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x2a || &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; || &#039;&#039;&#039;QoS (Availability)&#039;&#039;&#039; || 1 || 0x00 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ouroboros Allocation Protocol (OAP) - FLOW_REPLY Payload with Certificate and Signature (No Ephemeral Key)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x2b-0x3a || &amp;lt;code&amp;gt;8f a6ab 6ea7 ef89 68e1 ed1e 2ede 0919&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 16 || 128-bit identifier || &#039;&#039;&#039;Same ID as client&#039;s FLOW_REQ&#039;&#039;&#039; (Packet 15 echoed back)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3b-0x42 || &amp;lt;code&amp;gt;fa18 86a8 e490 3754&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp&#039;&#039;&#039; || 8 || Network order || Server&#039;s timestamp&lt;br /&gt;
|-&lt;br /&gt;
| 0x43-0x44 || &amp;lt;code&amp;gt;a702&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Crt_len&#039;&#039;&#039; || 2 || 0x02a7 (679 decimal) || &#039;&#039;&#039;Certificate length: 679 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x45-0x270 || &amp;lt;code&amp;gt;2f30 8202 2b30 8201 b2a0 0302 ... (DER certificate) ...&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Certificate&#039;&#039;&#039; || 679 || DER-encoded X.509 || Server&#039;s certificate signed by intermediate CA&lt;br /&gt;
|-&lt;br /&gt;
| 0x271-0x272 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Eph_len&#039;&#039;&#039; || 2 || 0x0000 || &#039;&#039;&#039;No ephemeral key&#039;&#039;&#039; (no encryption)&lt;br /&gt;
|-&lt;br /&gt;
| 0x273-0x274 || &amp;lt;code&amp;gt;0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Data_len&#039;&#039;&#039; || 2 || 0x0000 || No application data&lt;br /&gt;
|-&lt;br /&gt;
| 0x275-0x276 || &amp;lt;code&amp;gt;0067&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Sig_len&#039;&#039;&#039; || 2 || 0x0067 (103 decimal) || &#039;&#039;&#039;ECDSA signature length: 103 bytes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x277-0x2dd || &amp;lt;code&amp;gt;3065 0230 75dc 5717 ... 83&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Signature&#039;&#039;&#039; || 103 || ECDSA signature (DER encoded) || Server&#039;s ECDSA signature proving certificate ownership&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* SEID is 0x0041 - New server-side endpoint ID allocated for this authenticated flow&lt;br /&gt;
* DEID is 0x0040 - Client&#039;s flow ID from Packet 15 FLOW_REQ, establishing the bidirectional flow&lt;br /&gt;
* FLOW_REPLY Message Type - Code field is 0x01, &#039;&#039;&#039;no service hash&#039;&#039;&#039; (already identified in FLOW_REQ)&lt;br /&gt;
* Certificate Field - &amp;lt;code&amp;gt;crt_len = 0x02a7 (679)&amp;lt;/code&amp;gt; carrying server&#039;s X.509 certificate signed by intermediate CA&lt;br /&gt;
* Separate Signature Field - &amp;lt;code&amp;gt;sig_len = 0x0067 (103)&amp;lt;/code&amp;gt; with ECDSA signature over entire OAP header&lt;br /&gt;
* No Ephemeral Key - &amp;lt;code&amp;gt;eph_len = 0x0000&amp;lt;/code&amp;gt; since encryption is &#039;&#039;&#039;not&#039;&#039;&#039; being used in Test 4&lt;br /&gt;
* Same OAP ID - Server echoes back the exact ID from client&#039;s FLOW_REQ (included in signature, binding response to this specific client request)&lt;br /&gt;
* Complete OAP Structure - Full OAP header with all standard fields, just without ephemeral key data&lt;br /&gt;
* Plaintext Data Exchange - After this FLOW_REPLY, all subsequent application data will be transmitted in plaintext (but authenticated via certificate + signature verification)&lt;br /&gt;
&lt;br /&gt;
==== Packet 17: ECHO_REQUEST ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client sends plaintext ECHO_REQUEST data through the authenticated (but unencrypted) flow. The oping application&#039;s ping request is transmitted directly without encryption, relying on the earlier certificate+signature authentication for security.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.419664 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0041 0040 0000 0000 0000 0000 8177 0000  .A.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0041&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0041 || Destination Endpoint ID (server flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Request (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000000 || Message type: ECHO_REQUEST&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Sequence number / message identifier&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Seconds component from CLOCK_REALTIME&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Nanoseconds component (0-999999999)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0041 → Server Flow - Data is directed to the server&#039;s endpoint ID allocated in Packet 16 FLOW_REPLY&lt;br /&gt;
* Plaintext Transmission - No encryption layer; oping payload is sent as-is (compare to Packet 13 which had encryption)&lt;br /&gt;
* Authenticated Flow - Although plaintext, this data travels on the authenticated flow established in Packet 16 (certificate + signature verified)&lt;br /&gt;
* Type = ECHO_REQUEST - 0x00000000 indicates client-to-server ping request&lt;br /&gt;
* ID = 0 - Sequence number for matching request/reply pairs&lt;br /&gt;
* Test 4 Characteristic - Demonstrates authenticated communication &#039;&#039;&#039;without&#039;&#039;&#039; encryption; application data is readable but cryptographically bound to the authenticated flow&lt;br /&gt;
* Contrast to Test 3 - Packet 13 (Test 3 encrypted ECHO_REQUEST) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;br /&gt;
&lt;br /&gt;
==== Packet 18: ECHO_REPLY ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Server responds with plaintext ECHO_REPLY data, echoing back the client&#039;s request. This confirms successful bidirectional communication over the authenticated (but unencrypted) flow.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Raw Data:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
17:40:04.420088 00:00:00:00:00:00 &amp;gt; 00:00:00:00:00:00, ethertype Unknown (0xa000), length 82:&lt;br /&gt;
        0x0000:  0040 0040 0000 0001 0000 0000 8177 0000  .@.@............&lt;br /&gt;
        0x0010:  0000 0000 aa16 1c16 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
        0x0040:  0000 0000                                ....&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ethernet DIX Frame with EID Header&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00-0x01 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;EID&#039;&#039;&#039; || 2 || 0x0040 || Destination Endpoint ID (client flow)&lt;br /&gt;
|-&lt;br /&gt;
| 0x02-0x03 || &amp;lt;code&amp;gt;0040&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Length&#039;&#039;&#039; || 2 || 64 bytes || Total application data length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Data - Oping Echo Reply (Plaintext)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Hex !! Field !! Size !! Value !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x04-0x07 || &amp;lt;code&amp;gt;0000 0001&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Type&#039;&#039;&#039; || 4 || 0x00000001 || Message type: ECHO_REPLY&lt;br /&gt;
|-&lt;br /&gt;
| 0x08-0x0b || &amp;lt;code&amp;gt;0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;ID&#039;&#039;&#039; || 4 || 0x00000000 || Echo of request sequence number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c-0x13 || &amp;lt;code&amp;gt;8177 0000 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (seconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (seconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14-0x1b || &amp;lt;code&amp;gt;aa16 1c16 0000 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Timestamp (nanoseconds)&#039;&#039;&#039; || 8 || Network-byte-order 64-bit || Echoed request timestamp (nanoseconds)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1c-0x43 || &amp;lt;code&amp;gt;0000 ... 0000&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Payload&#039;&#039;&#039; || 40 || Application data || Echoed probe payload (zero-filled for 64 bytes total)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key observations:&#039;&#039;&#039;&lt;br /&gt;
* EID Pair: 0x0040 → Client Flow - Server responds to client&#039;s endpoint ID from Packet 15 FLOW_REQ&lt;br /&gt;
* Type = ECHO_REPLY - 0x00000001 indicates server-to-client response&lt;br /&gt;
* ID = 0 - Echoes the request sequence number, matching this response to the request&lt;br /&gt;
* Timestamps Echo Request - Both timestamp fields are copied from Packet 17 unchanged (8177 0000 0000 0000 and aa16 1c16 0000 0000)&lt;br /&gt;
* Plaintext Reply - No encryption; server&#039;s response payload is readable (compare to Packet 14 which had encryption)&lt;br /&gt;
* Authenticated Channel - Although plaintext, this reply is part of the authenticated flow; client can verify integrity through earlier certificate+signature&lt;br /&gt;
* Test 4 Completion - Demonstrates &#039;&#039;&#039;full bidirectional plaintext communication&#039;&#039;&#039; over an authenticated (but unencrypted) flow&lt;br /&gt;
* Contrast to Test 3 - Packet 14 (Test 3 encrypted ECHO_REPLY) was 114 bytes with ciphertext; this packet is 82 bytes of plaintext&lt;br /&gt;
* Total Payload - 64 bytes total (4 + 4 + 8 + 8 + 40 bytes payload)&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1886</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1886"/>
		<updated>2026-01-18T10:07:51Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Install Rumba */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#2016:_ARCFIRE_and_the_start_of_Ouroboros | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]]), or to create one:&lt;br /&gt;
 python -m venv ./venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install --upgrade pip &lt;br /&gt;
 # If not, then it will install system-wide (use sudo in that case)&lt;br /&gt;
 pip install .&lt;br /&gt;
 # OR, if you want all 3 extra features&lt;br /&gt;
 pip install &amp;quot;.[NumpyAcceleration,graphs,visualizer]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
The Rumba model is heavily based on [[RINA]] terminology (since it was originally developed within a RINA research project). We will probably align the terminology in Rumba with Ouroboros in the near future. I will break down a typical Rumba experiment definition and show how to use Rumba in Python interactive mode. You can download the complete example experiment definition [https://{{SERVERNAME}}/docs/tools/rumba_example.py here]. The example uses the Ouroboros prototype, and we will run the setup on the local testbed since that is available on any machine and doesn’t require additional dependencies. We use the local testbed a lot for quick development testing and debugging. I will also show the experiment definition for the virtual wall server testbed at Ghent University as an example for researchers who have access to this testbed. If you have docker or qemu installed, feel free to experiment with these at your leisure.&lt;br /&gt;
&lt;br /&gt;
If you want to test Ouroboros locally (no docker/qemu), then the only example script you can run without modification is:&lt;br /&gt;
 python3 examples/scalingtime.py --prototype ouroboros local&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1884</id>
		<title>Ouroboros Protocols</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1884"/>
		<updated>2026-01-08T20:54:14Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Flow Allocation Protocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The protocols in Ouroboros are designed with strong adherence to the principles of [https://en.wikipedia.org/wiki/Separation_of_concerns separation of concerns] and [https://en.wikipedia.org/wiki/Separation_of_mechanism_and_policy separation of mechanism and policy] in mind to prevent network ossification and protocol ossification from occuring.&lt;br /&gt;
&lt;br /&gt;
There are 5 core protocols in Ouroboros.&lt;br /&gt;
&lt;br /&gt;
== Data Transfer Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Data Transfer Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Data Transfer Protocol resides in the [[Ouroboros Functional Layering|network forwarding layer]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 +                           N + 1 Data                          +&lt;br /&gt;
 .                                                               .&lt;br /&gt;
 .                                                               .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow and Retransmission Control Protocol ==&lt;br /&gt;
Main page: [[Flow and Retransmission Control Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Flow and Retransmission Control Protocol resides in the [[Ouroboros Functional Layering|application end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 |            Flags              |            Window             |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                        Sequence Number                        |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                    Acknowledgment Number                      |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow Allocation Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Flow Allocation Protocol]]&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;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                      id (128 bits)                            +    |&lt;br /&gt;
 * |                  Unique flow allocation ID                    |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                     timestamp (64 bits)                       +    |&lt;br /&gt;
 * |                UTC nanoseconds since epoch                    |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |         crt_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                  certificate (variable)                       +    |&lt;br /&gt;
 * |               X.509 certificate, DER encoded                  |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |F|R|     kex_len (14 bits)     |                               |    | Signed&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    | Region&lt;br /&gt;
 * +                 kex_data (variable)                           +    |&lt;br /&gt;
 * |      public key (DER/raw) or ciphertext (KEM)                 |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |       cipher_len (16 bits)    |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    cipher (variable)                          +    |&lt;br /&gt;
 * |               symmetric cipher name (UTF-8)                   |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |        data_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    data (variable)                            +    |&lt;br /&gt;
 * |              Piggybacked application data                     |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---+&lt;br /&gt;
 * |        sig_len (16 bits)      |                               |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +&lt;br /&gt;
 * |                                                               |&lt;br /&gt;
 * +                     signature (variable)                      +&lt;br /&gt;
 * |                  DSA signature over signed region             |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 *&lt;br /&gt;
 * kex_len field bit layout:&lt;br /&gt;
 *   F (bit 15): Format - 0 = X.509 DER, 1 = Raw/Hybrid&lt;br /&gt;
 *   R (bit 14): Role   - 0 = Server encaps, 1 = Client encaps&lt;br /&gt;
 *               (R is ignored for non-KEM algorithms)&lt;br /&gt;
 *   Bits 0-13:  Length (0-16383 bytes)&lt;br /&gt;
 */&lt;br /&gt;
The Flow Allocation Protocol resides in the [[Ouroboros Functional Layering|network end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Connection Establishment Protocol]]&lt;br /&gt;
&lt;br /&gt;
== Enrollment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Enrolment Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Enrollment protocol is best seen as one of the application protocols for IPCPs.&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1883</id>
		<title>Ouroboros Protocols</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1883"/>
		<updated>2026-01-08T20:38:21Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Flow Allocation Protocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The protocols in Ouroboros are designed with strong adherence to the principles of [https://en.wikipedia.org/wiki/Separation_of_concerns separation of concerns] and [https://en.wikipedia.org/wiki/Separation_of_mechanism_and_policy separation of mechanism and policy] in mind to prevent network ossification and protocol ossification from occuring.&lt;br /&gt;
&lt;br /&gt;
There are 5 core protocols in Ouroboros.&lt;br /&gt;
&lt;br /&gt;
== Data Transfer Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Data Transfer Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Data Transfer Protocol resides in the [[Ouroboros Functional Layering|network forwarding layer]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 +                           N + 1 Data                          +&lt;br /&gt;
 .                                                               .&lt;br /&gt;
 .                                                               .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow and Retransmission Control Protocol ==&lt;br /&gt;
Main page: [[Flow and Retransmission Control Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Flow and Retransmission Control Protocol resides in the [[Ouroboros Functional Layering|application end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 |            Flags              |            Window             |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                        Sequence Number                        |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                    Acknowledgment Number                      |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow Allocation Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Flow Allocation Protocol]]&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;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                      id (128 bits)                            +    |&lt;br /&gt;
 * |                  Unique flow allocation ID                    |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                     timestamp (64 bits)                       +    |&lt;br /&gt;
 * |                UTC nanoseconds since epoch                    |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |         crt_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                  certificate (variable)                       +    |&lt;br /&gt;
 * |               X.509 certificate, DER encoded                  |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |         kex_len (16 bits)     |                               |    | Signed&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    | Region&lt;br /&gt;
 * +                 kex_data (variable)                           +    |&lt;br /&gt;
 * |                  public key, DER encoded                      |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |       cipher_len (16 bits)    |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    cipher (variable)                          +    |&lt;br /&gt;
 * |               symmetric cipher name (UTF-8)                   |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |        data_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    data (variable)                            +    |&lt;br /&gt;
 * |              Piggybacked application data                     |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---+&lt;br /&gt;
 * |        sig_len (16 bits)      |                               |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +&lt;br /&gt;
 * |                                                               |&lt;br /&gt;
 * +                     signature (variable)                      +&lt;br /&gt;
 * |                  DSA signature over signed region             |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The Flow Allocation Protocol resides in the [[Ouroboros Functional Layering|network end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Connection Establishment Protocol]]&lt;br /&gt;
&lt;br /&gt;
== Enrollment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Enrolment Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Enrollment protocol is best seen as one of the application protocols for IPCPs.&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1882</id>
		<title>Ouroboros Protocols</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1882"/>
		<updated>2026-01-08T20:37:57Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Flow Allocation Protocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The protocols in Ouroboros are designed with strong adherence to the principles of [https://en.wikipedia.org/wiki/Separation_of_concerns separation of concerns] and [https://en.wikipedia.org/wiki/Separation_of_mechanism_and_policy separation of mechanism and policy] in mind to prevent network ossification and protocol ossification from occuring.&lt;br /&gt;
&lt;br /&gt;
There are 5 core protocols in Ouroboros.&lt;br /&gt;
&lt;br /&gt;
== Data Transfer Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Data Transfer Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Data Transfer Protocol resides in the [[Ouroboros Functional Layering|network forwarding layer]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 +                           N + 1 Data                          +&lt;br /&gt;
 .                                                               .&lt;br /&gt;
 .                                                               .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow and Retransmission Control Protocol ==&lt;br /&gt;
Main page: [[Flow and Retransmission Control Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Flow and Retransmission Control Protocol resides in the [[Ouroboros Functional Layering|application end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 |            Flags              |            Window             |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                        Sequence Number                        |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                    Acknowledgment Number                      |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow Allocation Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Flow Allocation Protocol]]&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;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                      id (128 bits)                            +    |&lt;br /&gt;
 * |                  Unique flow allocation ID                    |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                     timestamp (64 bits)                       +    |&lt;br /&gt;
 * |                UTC nanoseconds since epoch                    |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |         crt_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                  certificate (variable)                       +    |&lt;br /&gt;
 * |               X.509 certificate, DER encoded                  |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |         kex_len (16 bits)     |                               |    | Signed&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |&lt;br /&gt;
 * +                 kex_data (variable)                           +    |&lt;br /&gt;
 * |                  public key, DER encoded                      |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |       cipher_len (16 bits)    |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    cipher (variable)                          +    |&lt;br /&gt;
 * |               symmetric cipher name (UTF-8)                   |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |        data_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    data (variable)                            +    |&lt;br /&gt;
 * |              Piggybacked application data                     |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---+&lt;br /&gt;
 * |        sig_len (16 bits)      |                               |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +&lt;br /&gt;
 * |                                                               |&lt;br /&gt;
 * +                     signature (variable)                      +&lt;br /&gt;
 * |                  DSA signature over signed region             |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&lt;br /&gt;
The Flow Allocation Protocol resides in the [[Ouroboros Functional Layering|network end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Connection Establishment Protocol]]&lt;br /&gt;
&lt;br /&gt;
== Enrollment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Enrolment Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Enrollment protocol is best seen as one of the application protocols for IPCPs.&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1881</id>
		<title>Ouroboros Protocols</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1881"/>
		<updated>2026-01-08T20:36:16Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Flow Allocation Protocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The protocols in Ouroboros are designed with strong adherence to the principles of [https://en.wikipedia.org/wiki/Separation_of_concerns separation of concerns] and [https://en.wikipedia.org/wiki/Separation_of_mechanism_and_policy separation of mechanism and policy] in mind to prevent network ossification and protocol ossification from occuring.&lt;br /&gt;
&lt;br /&gt;
There are 5 core protocols in Ouroboros.&lt;br /&gt;
&lt;br /&gt;
== Data Transfer Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Data Transfer Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Data Transfer Protocol resides in the [[Ouroboros Functional Layering|network forwarding layer]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 +                           N + 1 Data                          +&lt;br /&gt;
 .                                                               .&lt;br /&gt;
 .                                                               .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow and Retransmission Control Protocol ==&lt;br /&gt;
Main page: [[Flow and Retransmission Control Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Flow and Retransmission Control Protocol resides in the [[Ouroboros Functional Layering|application end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 |            Flags              |            Window             |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                        Sequence Number                        |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                    Acknowledgment Number                      |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow Allocation Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Flow Allocation Protocol]]&lt;br /&gt;
&amp;lt;pre&amp;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;
+                                                               +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                       id (128 bits)                           +    |&lt;br /&gt;
|                  Unique flow allocation ID                    |    |&lt;br /&gt;
+                                                               +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                     timestamp (64 bits)                       +    |&lt;br /&gt;
|                 UTC nanoseconds since epoch                   |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|         crt_len (16 bits)     |                               |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                                                               +    |&lt;br /&gt;
|                  certificate (variable)                       |    |&lt;br /&gt;
+               X.509 certificate, DER encoded                  +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                               |         eph_len (16 bits)     |    |  Signed&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |  Region&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                                                               +    |&lt;br /&gt;
|                 ephemeral_key (variable)                      |    |&lt;br /&gt;
+              public key, DER encoded                          +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                               |        data_len (16 bits)     |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                     data (variable)                           +    |&lt;br /&gt;
|              Piggybacked application data                     |    |&lt;br /&gt;
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                               |         sig_len (16 bits)     |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---+&lt;br /&gt;
|                                                               |&lt;br /&gt;
+                                                               +&lt;br /&gt;
|                   signature (variable)                        |&lt;br /&gt;
+                  DSA signature over signed region             +&lt;br /&gt;
|                                                               |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Flow Allocation Protocol resides in the [[Ouroboros Functional Layering|network end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Connection Establishment Protocol]]&lt;br /&gt;
&lt;br /&gt;
== Enrollment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Enrolment Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Enrollment protocol is best seen as one of the application protocols for IPCPs.&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1880</id>
		<title>Ouroboros Protocols</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Protocols&amp;diff=1880"/>
		<updated>2026-01-08T20:35:46Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Data Transfer Protocol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The protocols in Ouroboros are designed with strong adherence to the principles of [https://en.wikipedia.org/wiki/Separation_of_concerns separation of concerns] and [https://en.wikipedia.org/wiki/Separation_of_mechanism_and_policy separation of mechanism and policy] in mind to prevent network ossification and protocol ossification from occuring.&lt;br /&gt;
&lt;br /&gt;
There are 5 core protocols in Ouroboros.&lt;br /&gt;
&lt;br /&gt;
== Data Transfer Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Data Transfer Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Data Transfer Protocol resides in the [[Ouroboros Functional Layering|network forwarding layer]]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 +                           N + 1 Data                          +&lt;br /&gt;
 .                                                               .&lt;br /&gt;
 .                                                               .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow and Retransmission Control Protocol ==&lt;br /&gt;
Main page: [[Flow and Retransmission Control Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Flow and Retransmission Control Protocol resides in the [[Ouroboros Functional Layering|application end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;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;
 |            Flags              |            Window             |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                        Sequence Number                        |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 |                    Acknowledgment Number                      |&lt;br /&gt;
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow Allocation Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Flow Allocation Protocol]]&lt;br /&gt;
&amp;lt;pre&amp;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;
+                                                               +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                       id (128 bits)                           +    |&lt;br /&gt;
|                  Unique flow allocation ID                    |    |&lt;br /&gt;
+                                                               +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                     timestamp (64 bits)                       +    |&lt;br /&gt;
|                 UTC nanoseconds since epoch                   |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|         crt_len (16 bits)     |                               |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                                                               +    |&lt;br /&gt;
|                  certificate (variable)                       |    |&lt;br /&gt;
+               X.509 certificate, DER encoded                  +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                               |         eph_len (16 bits)     |    |  Signed&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |  Region&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                                                               +    |&lt;br /&gt;
|                 ephemeral_key (variable)                      |    |&lt;br /&gt;
+              public key, DER encoded                          +    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                               |        data_len (16 bits)     |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                                                               |    |&lt;br /&gt;
+                     data (variable)                           +    |&lt;br /&gt;
|              Piggybacked application data                     |    |&lt;br /&gt;
+                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
|                               |         sig_len (16 bits)     |    |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---+&lt;br /&gt;
|                                                               |&lt;br /&gt;
+                                                               +&lt;br /&gt;
|                   signature (variable)                        |&lt;br /&gt;
+                  DSA signature over signed region             +&lt;br /&gt;
|                                                               |&lt;br /&gt;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Flow Allocation Protocol resides in the [[Ouroboros Functional Layering|network end-to-end layer]].&lt;br /&gt;
&lt;br /&gt;
A comparison with TLS 1.3 (generated by Claude Opus 4.5 based on the O7s codebase): [[Flow Allocation vs TLS]]&lt;br /&gt;
&lt;br /&gt;
== Connection Establishment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Connection Establishment Protocol]]&lt;br /&gt;
&lt;br /&gt;
== Enrollment Protocol ==&lt;br /&gt;
Main page: [[Ouroboros Enrolment Protocol]]&lt;br /&gt;
&lt;br /&gt;
The Enrollment protocol is best seen as one of the application protocols for IPCPs.&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Flow_Allocation_Protocol&amp;diff=1879</id>
		<title>Ouroboros Flow Allocation Protocol</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Flow_Allocation_Protocol&amp;diff=1879"/>
		<updated>2026-01-07T00:02:49Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Header */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
= Header =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OAP Header Structure&lt;br /&gt;
====================&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;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                      id (128 bits)                            +    |&lt;br /&gt;
 * |                  Unique flow allocation ID                    |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                     timestamp (64 bits)                       +    |&lt;br /&gt;
 * |                UTC nanoseconds since epoch                    |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |         crt_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                  certificate (variable)                       +    |&lt;br /&gt;
 * |               X.509 certificate, DER encoded                  |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |         eph_len (16 bits)     |                               |    | Signed&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    | Region&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                 ephemeral_key (variable)                      +    |&lt;br /&gt;
 * |                  public key, DER encoded                      |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |       cipher_len (16 bits)    |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    cipher (variable)                          +    |&lt;br /&gt;
 * |               symmetric cipher name (UTF-8)                   |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |&lt;br /&gt;
 * |        data_len (16 bits)     |                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +                    data (variable)                            +    |&lt;br /&gt;
 * |              Piggybacked application data                     |    |&lt;br /&gt;
 * +                                                               +    |&lt;br /&gt;
 * |                                                               |    |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---+&lt;br /&gt;
 * |        sig_len (16 bits)      |                               |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +&lt;br /&gt;
 * |                                                               |&lt;br /&gt;
 * +                     signature (variable)                      +&lt;br /&gt;
 * |                  DSA signature over signed region             |&lt;br /&gt;
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Field Summary:&lt;br /&gt;
+---------------+----------+----------------------------------------+&lt;br /&gt;
| Field         | Size     | Description                            |&lt;br /&gt;
+---------------+----------+----------------------------------------+&lt;br /&gt;
| id            | 16 bytes | Random 128-bit flow allocation ID      |&lt;br /&gt;
| timestamp     |  8 bytes | UTC time in nanoseconds (replay prot.) |&lt;br /&gt;
| crt_len       |  2 bytes | Certificate length (0 = no auth)       |&lt;br /&gt;
| certificate   | variable | X.509 cert signed by CA (DER encoded)  |&lt;br /&gt;
| eph_len       |  2 bytes | Ephemeral key length (0 = no encrypt)  |&lt;br /&gt;
| ephemeral_key | variable | DHE public key                         |&lt;br /&gt;
| cipher_len    |  2 bytes | Cipher name length (0 = no cipher)     |&lt;br /&gt;
| cipher        | variable | Name of the cipher to use              |&lt;br /&gt;
| data_len      |  2 bytes | Application data length                |&lt;br /&gt;
| data          | variable | Piggybacked app data (future use)      |&lt;br /&gt;
| sig_len       |  2 bytes | Signature length (0 = unsigned)        |&lt;br /&gt;
| signature     | variable | Signature                              |&lt;br /&gt;
+---------------+----------+----------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Minimum header size: 16 + 8 + 2 + 2 + 2 + 2 + 2 = 34 bytes (no optional fields)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Operation =&lt;br /&gt;
&lt;br /&gt;
When an application calls flow_alloc() to connect to a service or flow_accept() to receive incoming connections, the Ouroboros IRMd (IPC Resource Manager daemon) transparently handles all security operations on behalf of the application. The application simply provides a destination name (e.g., &amp;quot;sec.oping.tut.o7s&amp;quot;) and receives back a flow descriptor for reading and writing data—it remains completely unaware of any underlying cryptography. During flow allocation, the IRMd on the client side constructs an OAP (Ouroboros Allocation Protocol) header containing a unique flow ID, timestamp, and optionally the client&#039;s X.509 certificate, an ephemeral DHE public key, and a digital signature. This OAP header travels inside the FLOW_REQ message to the server&#039;s IRMd, which can verify the client&#039;s certificate against its configured CA trust store and validate the signature. The server&#039;s IRMd then responds with its own OAP header in the FLOW_REPLY, containing its certificate, ephemeral public key, and signature. Both sides independently derive the same symmetric encryption key using DHE key agreement. Once the flow is established, the library layer (between the application and IRMd) automatically encrypts outgoing data and decrypts incoming data using this shared key—the application&#039;s flow_read() and flow_write() calls work identically whether encryption is enabled or not. This architecture applies uniformly to all flows regardless of their QoS characteristics: whether the underlying flow provides reliable ordered delivery (connection-oriented semantics) or best-effort delivery (connectionless semantics), the security handshake occurs during flow allocation, and the resulting symmetric key protects all subsequent data exchange. The security policy is entirely configuration-driven through certificate and key files in security, allowing system administrators to enforce authentication and encryption requirements without any application code changes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client (IRMd)                              Server (IRMd)&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 1. Load client cert/key                   |&lt;br /&gt;
     | 2. Generate ephemeral keypair             |&lt;br /&gt;
     | 3. Build OAP_HDR (id, ts, crt, eph)       |&lt;br /&gt;
     | 4. Sign header with client key            |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |-------- FLOW_REQ (OAP_HDR) -------------&amp;gt; |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |                                           | 5. Load server cert/key&lt;br /&gt;
     |                                           | 6. Verify client cert against CA&lt;br /&gt;
     |                                           | 7. Verify client signature&lt;br /&gt;
     |                                           | 8. Generate ephemeral keypair&lt;br /&gt;
     |                                           | 9. Derive symmetric key (ECDHE)&lt;br /&gt;
     |                                           | 10. Build response OAP_HDR&lt;br /&gt;
     |                                           | 11. Sign with server key&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |&amp;lt;------- FLOW_REPLY (OAP_HDR) ------------ |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     | 12. Verify server cert against CA         |&lt;br /&gt;
     | 13. Verify server signature               |&lt;br /&gt;
     | 14. Derive symmetric key (ECDHE)          |&lt;br /&gt;
     |                                           |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
     |         Encrypted data channel            |&lt;br /&gt;
     |===========================================|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1878</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1878"/>
		<updated>2026-01-04T12:07:31Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing, Forwarding and Flooding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all (reachable) vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be close to 0,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. Ouroboros estimates MPL based on the Layer characteristics. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live (v4) or Hop Limit (v6) decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This is similar in function to a UNIX file descriptor.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1877</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1877"/>
		<updated>2026-01-04T12:05:03Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Flow Identifiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. This also proves it covers &#039;&#039;all&#039;&#039; algorithms, unless you find a path longer than the longest path...&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all (reachable) vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be close to 0,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. Ouroboros estimates MPL based on the Layer characteristics. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live (v4) or Hop Limit (v6) decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This is similar in function to a UNIX file descriptor.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1876</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1876"/>
		<updated>2026-01-04T12:01:30Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. This also proves it covers &#039;&#039;all&#039;&#039; algorithms, unless you find a path longer than the longest path...&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all (reachable) vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be close to 0,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. Ouroboros estimates MPL based on the Layer characteristics. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live (v4) or Hop Limit (v6) decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1875</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1875"/>
		<updated>2026-01-04T11:33:16Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing, Forwarding and Flooding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;. This also proves it covers &#039;&#039;all&#039;&#039; algorithms, unless you find a path longer than the longest path...&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all (reachable) vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be close to 0,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. Ouroboros estimates MPL based on the Layer characteristics. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live (v4) or Hop Limit (v6) decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1874</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1874"/>
		<updated>2026-01-04T11:30:04Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing, Forwarding and Flooding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;. This also proves it covers &#039;&#039;all&#039;&#039; algorithms, unless you find a path longer than the longest path...&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all (reachable) vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be close to 0,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. Ouroboros estimates MPL based on the Layer characteristics. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live (v4) or Hop Limit (v6) decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1873</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1873"/>
		<updated>2026-01-04T11:19:59Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Flow Bounds */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all (reachable) vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be close to 0,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. Ouroboros estimates MPL based on the Layer characteristics. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live (v4) or Hop Limit (v6) decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1872</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1872"/>
		<updated>2026-01-04T11:13:10Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing, Forwarding and Flooding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all (reachable) vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1871</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1871"/>
		<updated>2026-01-04T11:09:00Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing, Forwarding and Flooding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1870</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1870"/>
		<updated>2026-01-04T11:07:10Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing and Forwarding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing, Forwarding and Flooding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors (with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;) so that:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a connected subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs.&lt;br /&gt;
&lt;br /&gt;
Equivalently, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; is any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(v_s, u) &amp;gt; d(v_s, v)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, &#039;&#039;&#039;FLOODING&#039;&#039;&#039; creates a connected tree rooted at &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; that reaches all vertices in the network. Each vertex selects neighbors that are strictly farther from the source than itself, ensuring the flood propagates outward without backtracking.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1869</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1869"/>
		<updated>2026-01-04T11:03:36Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing and Forwarding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1868</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1868"/>
		<updated>2026-01-04T11:00:12Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Interpretation of the formal definition */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing in Ouroboros ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1867</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1867"/>
		<updated>2026-01-04T10:56:33Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Interpretation of the formal definition */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing in Ouroboros ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Interpretation of the formal definition ===&lt;br /&gt;
The formal definition says that a routing algorithm is equivalent a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can not contain (permanent) loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1866</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1866"/>
		<updated>2026-01-04T10:50:23Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Formal Definition of Routing in Ouroboros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing in Ouroboros ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Interpretation of the formal definition ===&lt;br /&gt;
The formal definition says that routing creates a tree-like structure where every node along any valid path selects one or more neighbors that are strictly &amp;quot;closer&amp;quot; to the destination than itself. This structure can contain multiple paths from source to destination, allowing routing solution that move different packets (or fragments) along different routes through the network. The key guarantee is that all these paths always make progress toward their destination and can never contain loops - think of it like water flowing downhill where it may split into multiple streams, but each stream always flows to a lower elevation and can never flow back uphill.&lt;br /&gt;
&lt;br /&gt;
This definition is very broad &amp;quot;one or more neighbors&amp;quot; selection allows solutions that send duplicates, erasure coding packet fragments etc.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1865</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1865"/>
		<updated>2026-01-04T10:40:30Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Formal Definition of Routing in Ouroboros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing in Ouroboros ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D.&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1864</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1864"/>
		<updated>2026-01-04T10:31:37Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Formal Definition of Routing in Ouroboros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing in Ouroboros ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt; Proof of Equivalence: choose for &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; the length of the longest path between the corresponding vertices in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1863</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1863"/>
		<updated>2026-01-04T10:29:13Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Routing and Forwarding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
With routing we typically mean the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there are the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solutions. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. The reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing in Ouroboros ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1862</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1862"/>
		<updated>2026-01-04T10:24:23Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Distance and Metrics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
Routing is broadly defined as the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there is the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solution. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. As far as we know the definitions are original, although the reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1861</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1861"/>
		<updated>2026-01-04T10:20:51Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Definitions: Flow, Routing, and Forwarding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;The weight of an edge is often called a &#039;&#039;metric&#039;&#039; in computer science literature (e.g. BGP metric). To avoid confusion, we use the term &#039;&#039;metric&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;geodesic&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfill the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
Routing is broadly defined as the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there is the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solution. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. As far as we know the definitions are original, although the reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1860</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1860"/>
		<updated>2026-01-04T10:16:13Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. This section details a &#039;&#039;&#039;model&#039;&#039;&#039; and deals with (abstract) programs.&lt;br /&gt;
The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;The weight of an edge is often called a &#039;&#039;&#039;metric&#039;&#039;&#039; in computer science literature. To avoid confusion, we will use the term &#039;&#039;&#039;metric&#039;&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;&#039;geodesic&#039;&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfil the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
Routing is broadly defined as the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there is the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solution. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. As far as we know the definitions are original, although the reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;note&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1859</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1859"/>
		<updated>2026-01-04T10:11:34Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Definitions: Flow, Routing, and Forwarding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. This section details a &#039;&#039;&#039;model&#039;&#039;&#039; and deals with (abstract) programs.&lt;br /&gt;
The graph definitions follow Dieter Jungnickel&#039;s excellent &#039;&#039;Graph, Networks and Algorithms&#039;&#039;&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;The weight of an edge is often called a &#039;&#039;&#039;metric&#039;&#039;&#039; in computer science literature. To avoid confusion, we will use the term &#039;&#039;&#039;metric&#039;&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;&amp;lt;ref&amp;gt;A &#039;&#039;Hamiltonian cycle&#039;&#039; is a special case of a closed walk that includes every vertex in the graph exactly once. This is necessarily also a closed trail.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;&#039;geodesic&#039;&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfil the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
Routing is broadly defined as the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there is the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solution. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. As far as we know the definitions are original, although the reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1858</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1858"/>
		<updated>2026-01-04T10:00:40Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. This section details a &#039;&#039;&#039;model&#039;&#039;&#039; and deals with (abstract) programs, it does not specify an implementation, and it should not be directly interpreted with respect to any particular implementation of a computing system or environment&amp;lt;ref&amp;gt;&#039;&#039;...but approached with a blank mind, consciously refusing to try to link it with what is already familiar...&#039;&#039; (Dijkstra, 1988).&amp;lt;/ref&amp;gt;. The definitions are taken from Dieter JungNickel&#039;s excellent textbook&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Basic Graph Definitions ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;The weight of an edge is often called a &#039;&#039;&#039;metric&#039;&#039;&#039; in computer science literature. To avoid confusion, we will use the term &#039;&#039;&#039;metric&#039;&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;&#039;geodesic&#039;&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfil the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
Routing is broadly defined as the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there is the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solution. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. As far as we know the definitions are original, although the reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1857</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1857"/>
		<updated>2026-01-04T09:57:21Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: /* Definitions: Flow, Routing, and Forwarding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. This section details a &#039;&#039;&#039;model&#039;&#039;&#039; and deals with (abstract) programs, it does not specify an implementation, and it should not be directly interpreted with respect to any particular implementation of a computing system or environment&amp;lt;ref&amp;gt;&#039;&#039;...but approached with a blank mind, consciously refusing to try to link it with what is already familiar...&#039;&#039; (Dijkstra, 1988).&amp;lt;/ref&amp;gt;. The definitions are taken from the excellent textbook &amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Graphs and Networks ==&lt;br /&gt;
&lt;br /&gt;
=== Basic Graph Definitions ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;The weight of an edge is often called a &#039;&#039;&#039;metric&#039;&#039;&#039; in computer science literature. To avoid confusion, we will use the term &#039;&#039;&#039;metric&#039;&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;&#039;geodesic&#039;&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfil the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
Routing is broadly defined as the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there is the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solution. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. As far as we know the definitions are original, although the reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1856</id>
		<title>Definitions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Definitions&amp;diff=1856"/>
		<updated>2026-01-04T09:31:26Z</updated>

		<summary type="html">&lt;p&gt;Dimitri: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definitions: Flow, Routing, and Forwarding =&lt;br /&gt;
&lt;br /&gt;
This document contains formal definitions used in the Ouroboros architecture. This section details a &#039;&#039;&#039;model&#039;&#039;&#039; and deals with (abstract) programs, it does not specify an implementation, and it should not be directly interpreted with respect to any particular implementation of a computing system or environment&amp;lt;ref&amp;gt;&#039;&#039;...but approached with a blank mind, consciously refusing to try to link it with what is already familiar...&#039;&#039; (Dijkstra, 1988).&amp;lt;/ref&amp;gt;. The definitions in this section may differ (even ever so slightly) from previously held notions of the term.&lt;br /&gt;
&lt;br /&gt;
== Graphs and Networks ==&lt;br /&gt;
&lt;br /&gt;
=== Basic Graph Definitions ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;graph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, E)&amp;lt;/math&amp;gt; consisting of a set of &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; and a set of &#039;&#039;&#039;edges&#039;&#039;&#039; &amp;lt;math&amp;gt;E \subset V^2&amp;lt;/math&amp;gt; of two-element subsets of &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;Jungnickel, D. (2007). Graphs, Networks and Algorithms.&amp;lt;/ref&amp;gt; An edge &amp;lt;math&amp;gt;e = (v_i,v_j)&amp;lt;/math&amp;gt; has (distinct) end vertices &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed graph&#039;&#039;&#039; or &#039;&#039;&#039;digraph&#039;&#039;&#039; is a pair &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; consisting of a set &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; of vertices and a set &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; of ordered pairs &amp;lt;math&amp;gt;(v_i, v_j)&amp;lt;/math&amp;gt; (called &#039;&#039;&#039;arcs&#039;&#039;&#039;) where &amp;lt;math&amp;gt;v_i \neq v_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;network&#039;&#039;&#039; is a digraph &amp;lt;math&amp;gt;G = (V,A)&amp;lt;/math&amp;gt; on which a mapping &amp;lt;math&amp;gt;w: A \to \mathbb{R}&amp;lt;/math&amp;gt; from the edgeset to the reals is defined; the number &amp;lt;math&amp;gt;w(a)&amp;lt;/math&amp;gt; is called the &#039;&#039;&#039;weight&#039;&#039;&#039; of the arc &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;The weight of an edge is often called a &#039;&#039;&#039;metric&#039;&#039;&#039; in computer science literature. To avoid confusion, we will use the term &#039;&#039;&#039;metric&#039;&#039;&#039; only in its mathematical meaning.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;math&amp;gt;a = (v_i,v_j) \in A&amp;lt;/math&amp;gt;, then &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; is &#039;&#039;&#039;adjacent&#039;&#039;&#039; to &amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt; and &#039;&#039;&#039;incident&#039;&#039;&#039; with &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;. The set of &#039;&#039;&#039;neighbors&#039;&#039;&#039; &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; of a vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; is the set of vertices that are adjacent to &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, where &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; contains all &amp;lt;math&amp;gt;u \in V&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;(v, u) \in A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Walks, Paths, and Cycles ===&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;walk&#039;&#039;&#039; is a sequence of vertices &amp;lt;math&amp;gt;\mathcal{W} = (v_0, v_1, \dots , v_n)&amp;lt;/math&amp;gt; so that &amp;lt;math&amp;gt;a_i = (v_{i-1},v_i) \in A , i = 1, \dots, n&amp;lt;/math&amp;gt;. So each walk also implies a sequence of edges. We define the weight of a walk &amp;lt;math&amp;gt;\mathcal{W}&amp;lt;/math&amp;gt; as the sum of the weights of its arcs, &amp;lt;math&amp;gt;w(\mathcal{W}) = \sum_{i=1}^n w(a_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the &#039;&#039;&#039;source&#039;&#039;&#039; &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; and &#039;&#039;&#039;destination&#039;&#039;&#039; &amp;lt;math&amp;gt;v_n&amp;lt;/math&amp;gt; are the same (&amp;lt;math&amp;gt;v_0 = v_n&amp;lt;/math&amp;gt;), the walk is &#039;&#039;&#039;closed&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A walk where each of the arcs &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; is distinct is called a &#039;&#039;&#039;trail&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;path&#039;&#039;&#039; is a trail for which each of the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;closed trail&#039;&#039;&#039; for which the &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; are distinct is called a &#039;&#039;&#039;cycle&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;directed acyclic graph&#039;&#039;&#039; (DAG) is a digraph that does not contain any cycles.&lt;br /&gt;
&lt;br /&gt;
If for every pair of vertices &amp;lt;math&amp;gt;v_s, v_d \in V&amp;lt;/math&amp;gt; there is at least one path &amp;lt;math&amp;gt;\mathcal{P} = (v_s, \dots, v_d)&amp;lt;/math&amp;gt;, we call the (di)graph &#039;&#039;&#039;connected&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Distance and Metrics ===&lt;br /&gt;
&lt;br /&gt;
The distance function defined by the weight of the shortest path between two vertices in a network (or &amp;lt;math&amp;gt;\infty&amp;lt;/math&amp;gt; if no such path exists) is called the &#039;&#039;&#039;geodesic&#039;&#039;&#039; distance.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;metric&#039;&#039;&#039; is a (distance) function &amp;lt;math&amp;gt;d: X^2 \to [0, +\infty)&amp;lt;/math&amp;gt; fulfilling positivity, symmetry and triangle inequality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x,y,z \in X: d(x, y) \geq 0 \land d(x,y) = d(y,x) \land d(x,z) \leq d(x,y) + d(y,z)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A geodesic distance is in general not a metric since it doesn&#039;t always fulfil the positivity and symmetry requirements in a digraph.&lt;br /&gt;
&lt;br /&gt;
== Routing and Forwarding ==&lt;br /&gt;
&lt;br /&gt;
Routing is broadly defined as the process of selecting a path for traffic in a network. In computer science literature, there are two main groups of approaches to routing.&lt;br /&gt;
&lt;br /&gt;
On the one hand there is the &#039;&#039;&#039;hierarchical routing&#039;&#039;&#039; solution. This is the approach taken in IP networks, where a set of subnetworks is defined using &#039;&#039;&#039;prefixes&#039;&#039;&#039; or &#039;&#039;&#039;subnet masks&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan.&amp;lt;/ref&amp;gt; A scalability issue with IP stems from not following the partial ordering implied by the subnetting in the delegation of IP addresses, causing fragmentation of the IP address space and making prefix aggregration in routers increasingly inefficient.&amp;lt;ref&amp;gt;Rekhter&#039;s Law: Addressing can follow topology or topology can follow addressing. Choose one. RFC 4984.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the other hand we have &#039;&#039;&#039;geographic&#039;&#039;&#039; or &#039;&#039;&#039;geometric&#039;&#039;&#039; routing,&amp;lt;ref&amp;gt;Kuhn, F., Wattenhofer, R., and Zollinger, A. (2003). Worst-case optimal and average-case efficient geometric ad-hoc routing.&amp;lt;/ref&amp;gt; where each node is assigned a coordinate so next hops can be calculated making use of the coordinates of the direct neighbors.&amp;lt;ref&amp;gt;Geographic coordinates are a compound name, consisting of latitudes and longitudes, but there is no order implied between these two coordinate spaces. Hence the partial ordering in our definition of an address.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The examples above illustrate that the concept of routing encompasses both the dissemination and gathering of information about the network, and the algorithms for calculation and selection of the paths. We will now define the concepts underpinning &amp;quot;routing&amp;quot; more formally. As far as we know the definitions are original, although the reasoning behind it is similar to the reasoning commonly used in formulating (integer) linear programming solutions to problems in graph theory.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Routing ===&lt;br /&gt;
&lt;br /&gt;
Let &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; be a network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination vertices &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors with the associated set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;, so that the following 4 conditions are met:&lt;br /&gt;
&lt;br /&gt;
# The graph &amp;lt;math&amp;gt;D = (V&#039;, A&#039;) = (\cup_{v \in V}H(v), \cup_{v \in V}L(v))&amp;lt;/math&amp;gt; is a directed acyclic subgraph of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only outgoing arcs;&lt;br /&gt;
# &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; is the only vertex in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; with only incoming arcs; and&lt;br /&gt;
# &amp;lt;math&amp;gt;A&#039; = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Equivalently,&amp;lt;ref&amp;gt;Choose for d the length of the longest path between the corresponding vertices in D.&amp;lt;/ref&amp;gt; &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is any algorithm that, given source and destination &#039;&#039;&#039;vertices&#039;&#039;&#039; &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt;, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns a subset &amp;lt;math&amp;gt;H(v) \subseteq N(v)&amp;lt;/math&amp;gt; of neighbors so that:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\forall u \in H(v): d(u, v_d) &amp;lt; d(v, v_d)&amp;lt;/math&amp;gt; for any chosen distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; on &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;; and&lt;br /&gt;
# &amp;lt;math&amp;gt;\cup_{v \in V} H(v) = \emptyset&amp;lt;/math&amp;gt; if and only if there is no path &amp;lt;math&amp;gt;\mathcal{P}&amp;lt;/math&amp;gt; between &amp;lt;math&amp;gt;v_s&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v_d&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In other words, either the distance function bounds the routing solution, or the routing solution bounds the distance function.&lt;br /&gt;
&lt;br /&gt;
=== Formal Definition of Forwarding ===&lt;br /&gt;
&lt;br /&gt;
We define &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; as any algorithm that, for each vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; returns the set of arcs &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt;. &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; is often implemented as &#039;&#039;&#039;ROUTING&#039;&#039;&#039; with an additional edge selection step.&lt;br /&gt;
&lt;br /&gt;
The necessary and sufficient condition for &#039;&#039;&#039;ROUTING&#039;&#039;&#039; is full knowledge of the graph &amp;lt;math&amp;gt;G = (V, A)&amp;lt;/math&amp;gt; and a valid geodesic distance &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For a given vertex &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, the necessary and sufficient set of information to obtain &amp;lt;math&amp;gt;L(v)&amp;lt;/math&amp;gt; is knowledge of its neighbor set &amp;lt;math&amp;gt;N(v)&amp;lt;/math&amp;gt; and the subset of the geodesic distances originating at its neighbors, &amp;lt;math&amp;gt;d_{v} \subset d: N(v) \times V \to \mathbb{R}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In less formal terms, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; provide a set of vertices and arcs, respectively, so that there are never loops if one travels to a next vertex or along an arc in the set. If implemented in a centralized way, &#039;&#039;&#039;ROUTING&#039;&#039;&#039; and &#039;&#039;&#039;FORWARDING&#039;&#039;&#039; roughly need to know the full network. When implemented in a distributed way, a node roughly needs to know its neighbors and the distances to the destination from itself and from all its neighbors.&lt;br /&gt;
&lt;br /&gt;
The definitions above show what information needs to be disseminated in a network to allow &#039;&#039;&#039;FORWARDING&#039;&#039;&#039;. Let&#039;s assume that vertices know their neighbors or incident outgoing arcs, then what is needed is a dissemination procedure for the (geodesic) distance function &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. This is implemented in a class of dissemination protocols, called &#039;&#039;&#039;link-state routing protocols&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Flow ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;flow&#039;&#039;&#039; is the abstraction of a collection of resources within a network layer that allow bidirectional communications using packets between two processes that are clients of this layer. A flow enables a point-to-point &#039;&#039;&#039;packet delivery service&#039;&#039;&#039; and can be viewed as a bidirectional pipe that has a number of observable quantities associated with it that describe the probability &amp;lt;math&amp;gt;p(S,t, \ldots) \in [0, 1]&amp;lt;/math&amp;gt; of a packet of given size &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; being transferred within a certain period of time &amp;lt;math&amp;gt;[t_x, t_x + t]&amp;lt;/math&amp;gt;. The maximum probability for error-free transfer depends on the &#039;&#039;&#039;packet-drop-rate&#039;&#039;&#039; (PDR) and &#039;&#039;&#039;bit-error-rate&#039;&#039;&#039; (BER) of the flow.&lt;br /&gt;
&lt;br /&gt;
The Ouroboros architecture ensures that flows are &#039;&#039;&#039;content neutral&#039;&#039;&#039;, i.e. the probability &amp;lt;math&amp;gt;p(S, t, \ldots)&amp;lt;/math&amp;gt; above is independent of the bits that make up the packets sent along a flow.&lt;br /&gt;
&lt;br /&gt;
=== Flow Characteristics ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;delay&#039;&#039;&#039; or &#039;&#039;&#039;latency&#039;&#039;&#039; describes how long packets take to traverse the flow, and the variation on the delay is called &#039;&#039;&#039;jitter&#039;&#039;&#039;, or more precisely, &#039;&#039;&#039;packet delay variation&#039;&#039;&#039;.&amp;lt;ref&amp;gt;RFC 3393: IP Packet Delay Variation Metric for IP Performance Metrics (IPPM).&amp;lt;/ref&amp;gt; The delay for a flow has four main components:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Propagation&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Queuing&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Transmission&#039;&#039;&#039; delay&lt;br /&gt;
* &#039;&#039;&#039;Processing&#039;&#039;&#039; delay&lt;br /&gt;
&lt;br /&gt;
=== Flow Bounds ===&lt;br /&gt;
&lt;br /&gt;
There are 2 upper bounds:&lt;br /&gt;
&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Lifetime&#039;&#039;&#039; (MPL) is the maximum amount of time that a packet can take to transfer over the flow&lt;br /&gt;
* The &#039;&#039;&#039;Maximum Packet Size&#039;&#039;&#039; (MPS) is the maximum length for a packet to be acceptable for transfer&lt;br /&gt;
&lt;br /&gt;
In other words, the probability for a packet to arrive after MPL expires should be 0,&amp;lt;ref&amp;gt;This may be hard to guarantee with 100 percent certainty, so MPL should be large enough so that this probability is 0 in practice. IP has a bound on the Maximum Datagram Lifetime (MDL) via the Time-To-Live or Hop Limit decrement in each router to a maximum of 255 seconds (RFC 791), with a recommended value of 64 seconds (RFC 1700). In addition, TCP defines the Maximum Segment Lifetime (MSL) as 120s (RFC 793).&amp;lt;/ref&amp;gt; and the probability for a packet to arrive that exceeds the MPS is equal to 0.&lt;br /&gt;
&lt;br /&gt;
Similarly, there can be lower bounds such as Minimum Packet Lifetime (mPL) and Minimum Packet Size (mPS).&lt;br /&gt;
&lt;br /&gt;
=== Flow Resources ===&lt;br /&gt;
&lt;br /&gt;
The resources that make up a layer are finite, limiting the total number of packets that can traverse the network layer in a given period of time. Flows provide the mechanism to put a network layer fully in control of its own resources. The resources that constitute the flow can either be shared with other flows or dedicated (reserved) for this particular flow.&lt;br /&gt;
&lt;br /&gt;
Other externally measureable quantities can be associated with a flow, such as bandwidth and load for flows with reserved resources. The probability function may depend on these quantities (e.g. if the load reaches a certain threshold, delay could increase).&lt;br /&gt;
&lt;br /&gt;
=== Flow Identifiers ===&lt;br /&gt;
&lt;br /&gt;
A flow endpoint is identified in a system by a &#039;&#039;&#039;flow ID&#039;&#039;&#039; (FID), which defines the &#039;&#039;&#039;layer boundary&#039;&#039;&#039;&amp;lt;ref&amp;gt;In this respect, a flow id is similar to an OSI &#039;&#039;&#039;Service Access Point&#039;&#039;&#039; (SAP) or RINA &#039;&#039;&#039;port id&#039;&#039;&#039;.&amp;lt;/ref&amp;gt;. For security reasons, a process has no direct access to the flow, but rather accesses the flow through a &#039;&#039;&#039;Flow Descriptor&#039;&#039;&#039; (FD) to read and write from a flow. Flow identifiers are unique within the scope of a system, flow descriptors are unique within the scope of a process&amp;lt;ref&amp;gt;This is similar in function to a UNIX file descriptor. A UNIX kernel space implementation of Ouroboros would probably use file descriptors for flow descriptors.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flows are an important concept for enabling Quality-of-Service (QoS) in a layer.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dimitri</name></author>
	</entry>
</feed>