Network capacity testing in Rust

Measure the capacity your network really delivers.

Check a circuit, compare network paths or investigate a change in performance. Measure Maximum IP-Layer Capacity, loss and delay together, then read the results in your terminal or collect JSON.

Run udpstp at both ends of a path and measure in either direction. It implements the UDP Speed Test Protocol in RFC 9946 and the IP-layer capacity method in RFC 9097.

  • Linux, macOS and Windows
  • Authenticated Tests
  • Interoperates with OB-UDPST

Beyond a single number

Read the result

See how the path behaves throughout the measurement. Check the IP-Layer Capacity and Loss Ratio of every Sub-Interval, then see the maximum that meets your Performance Criterion.

Read the result in your terminal or use --format json to feed your own dashboards and measurement tools. The JSON is compatible with OB-UDPST's format. This example is a Downstream Test.

Explore the result format

udpstp clientSample output
$ udpstp client --key-file keys.toml 192.0.2.1
Results Summary
  Downstream Search Test with 192.0.2.1:24601, started 2026-09-21T14:13:20Z (T0)
  Test Interval (I) 4 s · 4 Sub-Intervals (dt) 1000 ms · Trial Interval (FT) and
    st 50 ms
  1 Test Connection (F) · MaxHops 16 · DSCP 0 agreed
  Performance Criterion: loss ≤ 1% or one Load PDU · Tmax ≤ 1000 ms
  Late Load PDUs count in the Sub-Interval where their gap was seen.
  The Server set testIntTime to 4 (asked for 10)

  Sub-Interval results
  SI      C (Mbps)  Loss Ratio  Lost  Reordered  Duplicates  DV (ms)  RTTV (ms)
   1         90.00    0.000000     0          1           0    0/1/3     1-4, 2
   2         95.00    0.047619    50          1           0    0/1/3     1-4, 2
   3         93.00    0.001996     2          1           0    0/1/3     1-4, 2
   4  not measured           -     -          -           -        -          -
  SI: Sub-Interval · C: IP-Layer Capacity
  DV: delay variation (min/avg/max) · RTTV: RTT variation (min-max, avg) · -: no
    measurement

Final metrics
  Maximum IP-Layer Capacity: 93.00 Mbps (Sub-Interval 3)
  Maximum Sub-Interval result received at an unknown time
  Loss Ratio 0.001996, RTT minimum 10 ms, maximum 14 ms; Highest IP-Layer
    Capacity 95.00 Mbps in Sub-Interval 2 (Loss Ratio 0.047619); 1 Sub-Interval
    not measured
  RTT minimum 10 ms
  Minimum one-way delay 5 ms (clockDeltaMin; valid only if the clocks are
    synchronized)
$ 

Built for repeatable measurement

Why udpstp

Use it for a quick circuit check, repeatable path comparisons or automated measurement.

A feedback loop, in two phases

How a Test works

The Client starts the Test. The Server admits it, agrees its parameters, and controls the sending rate using reception statistics. Here is a Downstream Test, where the Server sends the measurement load.

Control Phase

Before measurement, the Client asks the Server to start a Test Connection.

  1. Setup exchangeThe Server admits the Test Connection and assigns an Ephemeral Port.
  2. Activation exchangeThe Server accepts, coerces or rejects the requested Test parameters.

Accepted parameters start the Data Phase

Data Phase

ClientLoad Receiver

ServerLoad Sender

Load PDUsServer to Client: measurement load

Status PDUsClient to Server: reception statistics every Trial Interval

On the Server

Load Rate Adjustment Algorithm

Uses loss and delay variation to raise, hold or lower the next sending rate.

A Downstream Test illustration. The Server controls the sending rate in both directions. In an Upstream Test the Client sends Load PDUs, and the Server returns Status PDUs with the next sending parameters. After the Test Interval, the STOP exchange ends the Test Connection.
See the full PDU exchange
The Client sends a Setup Request to the Standard Port, 24601. The Server answers with a Setup Response and sends a Null Request from the Test Connection's Ephemeral Port. Activation Requests and Activation Responses carry the Test parameters. Load PDUs and Status PDUs then carry the measurement load and reception statistics, ending with the STOP exchange.

Every term, defined

RFC 9946 and RFC 9097

Follow the measurement method

udpstp uses the published IP-layer capacity method. The results guide explains the numbers, and the protocol documentation connects the implementation to the RFCs.

RFC conformance details
Requirements proven by tests
348 of 420
Operational Requirements
33
Not-applicable Requirements
15

Tested Requirements have proving tests. Operational Requirements concern deployment or use. Not-applicable Requirements concern other implementations or roles. A Requirement with a Deviation has a recorded departure from the RFC.

Requirements by RFC section
SectionRequirementsTestedDeviationOperationalNot applicable
RFC 9097 §2 Scope, Goals, and Applicability63030
RFC 9097 §4 General Parameters and Definitions97002
RFC 9097 §5 IP-Layer Capacity Singleton Metric Definitions1713112
RFC 9097 §6 Maximum IP-Layer Capacity Metric Definitions (Statistics)1812033
RFC 9097 §7 IP-Layer Sender Bit Rate Singleton Metric Definitions107102
RFC 9097 §8 Method of Measurement4937660
RFC 9097 §9 Reporting Formats159600
RFC 9097 §10 Security Considerations76010
RFC 9946 §2 Conventions and Terminology10001
RFC 9946 §3 Scope, Goals, and Applicability10010
RFC 9946 §4 Protocol Overview158160
RFC 9946 §5 Requirements, Security Operations, and Optional Checksum7357385
RFC 9946 §6 Test Setup Request and Response6058200
RFC 9946 §7 Test Activation Request and Response4444000
RFC 9946 §8 Test Load Stream Transmission and Measurement Status Feedback Messages5755200
RFC 9946 §9 Stopping a Test1212000
RFC 9946 §10 Operational Considerations for the Measurement Method51130
RFC 9946 §11 Security Considerations86110
RFC 9946 §12 IANA Considerations1313000

Read the reasons

165 Conformance Records, grouped by what they explain.

Deviations
17 recorded departures from Requirements, each with its reason.
Interpretations
117 readings of ambiguous Requirements or choices the RFC leaves open.
OB-UDPST Differences
97 differences from OB-UDPST where udpstp conforms to the RFC.

Explore the protocol documentation

Choose your measurement

Put the results to work

Measure a path you use, compare alternatives or collect results over time.

From a circuit check to automated collection
TaskMeasureUse the result
Check an access line or circuitCapacity, loss and delay under loadSee how the path delivers traffic throughout the Test
Compare network pathsUpstream and Downstream Tests between chosen hostsCompare directions, routes or changes to a circuit
Collect measurementsStructured results with --format jsonFeed your dashboards, scripts and measurement tools

Put it to work

Put your network
to the test.

Install udpstp on two hosts, share a key and run your first measurement. Switch direction to check the return path, or collect JSON for your own tools.

Found something to improve? Share a result, report a problem or suggest a feature.