# RFC 9946 §4: Protocol Overview

The 15 Requirements of RFC 9946 §4, each quoted from the RFC with its state and the tests that prove it. [Conformance](index.md) explains the states.

| State | Requirements |
|---|--:|
| Tested | 8 |
| Deviation | 1 |
| Operational | 6 |

## RFC9946-4-1 {#RFC9946-4-1}

**Tested**

> All messages defined by this document SHALL use UDP transport [RFC0768].

Proving tests:

- [`crates/udpstp/tests/loopback.rs::a_client_completes_the_control_phase_over_ipv4_loopback`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)

## RFC9946-4-L1 {#RFC9946-4-L1}

**Tested**

> It is the responsibility of the client process to manage the inter-related connections such as handling the individual connection setup successes and failures, cleaning up connections during a test (should some fail), and aggregating the individual test results into an overall set of performance statistics.

Note: Multi-Connection Test: Minimum Test Connections, failed Test Connections, the aggregate Sub-Interval.

Conformance Records: [minimum-test-connections](../conformance/interpretations.md#minimum-test-connections), [multi-connection-isolated-failures](../conformance/interpretations.md#multi-connection-isolated-failures), [aggregate-clock-delta-min](../conformance/interpretations.md#aggregate-clock-delta-min).

Proving tests:

- [`crates/udpstp-core/tests/multi_connection_aggregation.rs::the_summed_capacity_never_exceeds_the_shared_bottleneck`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_aggregation.rs)
- [`crates/udpstp-core/tests/multi_connection_aggregation.rs::upstream_sub_intervals_are_summed_by_number_and_their_offset_measured`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_aggregation.rs)
- [`crates/udpstp-core/tests/multi_connection_failures.rs::the_test_goes_on_when_one_fails_and_enough_remain`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_failures.rs)
- [`crates/udpstp-core/tests/multi_connection_failures.rs::below_the_minimum_the_rest_are_stopped_and_released`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_failures.rs)
- [`crates/udpstp-core/tests/multi_connection_failures.rs::test_connections_that_fall_silent_together_stop_the_test`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_failures.rs)
- [`crates/udpstp-core/tests/multi_connection_failures.rs::failures_are_counted_until_too_few_remain`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_failures.rs)
- [`crates/udpstp-core/tests/multi_connection_failures.rs::failures_apart_are_isolated_ones`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_failures.rs)
- [`crates/udpstp-core/tests/multi_connection_start.rs::too_few_setups_abort_the_test_before_any_activation`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_start.rs)
- [`crates/udpstp-core/tests/multi_connection_start.rs::a_lower_minimum_goes_on_with_the_setups_that_succeeded`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_start.rs)
- [`crates/udpstp-core/tests/multi_connection_start.rs::an_unanswered_setup_is_given_up_once_enough_have_succeeded`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_start.rs)
- [`crates/udpstp-core/tests/multi_connection_start.rs::servers_that_set_different_parameters_abort_the_test`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_start.rs)
- [`crates/udpstp-core/tests/multi_connection_start.rs::an_acceptance_that_arrives_after_the_abort_is_stopped_at_once`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_start.rs)

## RFC9946-4-L2 {#RFC9946-4-L2}

**Tested**

> The server instance(s) would process each connection independently, as if they were coming from separate clients.

Conformance Records: [multi-connection-agreement-checks](../conformance/interpretations.md#multi-connection-agreement-checks).

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::each_test_connection_runs_its_own_algorithm`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)

## RFC9946-4-L3 {#RFC9946-4-L3}

**Tested**

> Test Setup Request and Response: If a server instance is identified with a host name that resolves to both IPv4/IPv6 addresses, it is recommended to use the first address returned in the name resolution response, regardless of whether it is IPv4 or IPv6.

Note: Client host name resolution.

Proving tests:

- [`crates/udpstp/tests/loopback.rs::a_client_resolves_a_host_name`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp/tests/loopback.rs)

## RFC9946-4-L4 {#RFC9946-4-L4}

**Tested**

> Distinct UDP port numbers will be assigned if all Setup Response messages originate from the same server in that case.

Note: An Ephemeral Port per Test Connection.

Proving tests:

- [`crates/udpstp-core/tests/multi_connection_start.rs::every_setup_goes_out_before_the_activations_which_go_out_together`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_start.rs)

## RFC9946-4.1-1 {#RFC9946-4.1-1}

**Operational**

> Fixed-rate testing SHOULD only be activated for operation and maintenance purposes by operators within their local network domain.

Note: Who runs a Fixed-Rate Test, and where; the software limits it to Operator Keys (RFC9946-4.1-3).

## RFC9946-4.1-2 {#RFC9946-4.1-2}

**Operational**

> If a subscriber requests a diagnostic test from the network operator, it strongly implies that there is no certainty on the bottleneck capacity and initiating a UDP Speed Test based on the load adjustment algorithm is RECOMMENDED.

Note: An operator's choice of test.

## RFC9946-4.1-3 {#RFC9946-4.1-3}

**Tested**

> To protect against misuse, a client (and in general, a consumer) MUST NOT be able to initiate a fixed-rate test.

Note: A Fixed-Rate Test needs an Operator Key.

Conformance Records: [fixed-rate-needs-operator-key](../conformance/interpretations.md#fixed-rate-needs-operator-key).

Proving tests:

- [`crates/udpstp-core/tests/fixed_rate.rs::a_fixed_rate_test_is_refused_without_an_operator_key`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)
- [`crates/udpstp-core/tests/fixed_rate.rs::a_refused_downstream_fixed_rate_test_sends_no_load`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)

## RFC9946-4.1-L1 {#RFC9946-4.1-L1}

**Tested**

> A network operator may conduct a fixed-rate test for a stable measurement at or near the maximum determined by the load rate adjustment algorithm for debugging purposes.

Note: srIndexConf a row with CHTA_SRIDX_ISSTART clear, under an Operator Key.

Proving tests:

- [`crates/udpstp-core/tests/algorithm_b.rs::a_fixed_rate_test_holds_its_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/algorithm_b.rs)
- [`crates/udpstp-core/tests/fixed_rate.rs::an_operator_runs_a_fixed_rate_test_at_the_requested_row`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/fixed_rate.rs)

## RFC9946-4.2-L1 {#RFC9946-4.2-L1}

**Operational**

> Measurements that generate traffic on shared paths (including Wi-Fi and Internet paths) need to consider the impact on other traffic.

Note: A deployment statement.

## RFC9946-4.2-L2 {#RFC9946-4.2-L2}

**Operational**

> Fixed-rate testing operates without congestion control and therefore must not be executed over other operators' network segments.

Note: Where an operator runs a Fixed-Rate Test.

## RFC9946-4.2-L3 {#RFC9946-4.2-L3}

**Operational**

> Fixed- rate testing, therefore, is limited to paths within a domain entirely managed and operated section-wise and end-to-end by the network operator performing the measurement.

Note: Where an operator runs a Fixed-Rate Test.

## RFC9946-4.2-L4 {#RFC9946-4.2-L4}

**Operational**

> When the risks of disruption to other flows has been considered, testing could be extended to include adjacent operational domains for which there is also a testing agreement.

Note: Where an operator runs a Fixed-Rate Test.

## RFC9946-4.2-1 {#RFC9946-4.2-1}

**Deviation**

> The number of concurrent independent tests of a path SHALL be limited to one, regardless of the number of flows.

Note: Server admission: one activated Test per source.

Recorded in [tests-per-source-above-one](../conformance/deviations.md#tests-per-source-above-one).

Conformance Records: [path-approximated-by-source](../conformance/interpretations.md#path-approximated-by-source).

Proving tests:

- [`crates/udpstp-core/src/admission.rs::the_test_connections_of_one_test_are_one_test`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/src/admission.rs)
- [`crates/udpstp-core/tests/tests_per_source.rs::a_second_test_from_the_same_source_is_refused_at_setup`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/tests_per_source.rs)
- [`crates/udpstp-core/tests/tests_per_source.rs::of_two_tests_set_up_together_the_second_is_refused_at_activation`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/tests_per_source.rs)

## RFC9946-4.2-L5 {#RFC9946-4.2-L5}

**Tested**

> A load rate adjustment algorithm (see Section 5.1) is required to mitigate the impact of this congestion and to limit the duration of any congestion by terminating the test when sudden impairments or a loss of connectivity is detected.

Conformance Records: [multi-connection-path-failure](../conformance/interpretations.md#multi-connection-path-failure).

Proving tests:

- [`crates/udpstp-core/tests/multi_connection_failures.rs::test_connections_that_fall_silent_together_stop_the_test`](https://github.com/pederbe/udpstp/blob/c88fe32e0973594682a069c58de24fd703714277/crates/udpstp-core/tests/multi_connection_failures.rs)

