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.
$ 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.
-
See the whole Test
Follow capacity, loss and delay throughout the measurement. The interval results help you see when a path changes under load.
-
Authenticated by default
Control who can measure against your Server. Tests and Status PDUs are authenticated, keys stay off the command line, and Fixed-Rate Tests require an Operator Key.
-
Ready for your tools
Read compact results in your terminal or export JSON. Use the Rust libraries to add protocol support to your own application.
-
Works with OB-UDPST
Bring udpstp into an existing setup with OB-UDPST key files and compatible JSON output. Explore the interoperability checks for the two implementations.
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.
- Setup exchangeThe Server admits the Test Connection and assigns an Ephemeral Port.
- 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.
The next Load PDUs use that rate
See the full PDU exchange
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.
| Section | Requirements | Tested | Deviation | Operational | Not applicable |
|---|---|---|---|---|---|
| RFC 9097 §2 Scope, Goals, and Applicability | 6 | 3 | 0 | 3 | 0 |
| RFC 9097 §4 General Parameters and Definitions | 9 | 7 | 0 | 0 | 2 |
| RFC 9097 §5 IP-Layer Capacity Singleton Metric Definitions | 17 | 13 | 1 | 1 | 2 |
| RFC 9097 §6 Maximum IP-Layer Capacity Metric Definitions (Statistics) | 18 | 12 | 0 | 3 | 3 |
| RFC 9097 §7 IP-Layer Sender Bit Rate Singleton Metric Definitions | 10 | 7 | 1 | 0 | 2 |
| RFC 9097 §8 Method of Measurement | 49 | 37 | 6 | 6 | 0 |
| RFC 9097 §9 Reporting Formats | 15 | 9 | 6 | 0 | 0 |
| RFC 9097 §10 Security Considerations | 7 | 6 | 0 | 1 | 0 |
| RFC 9946 §2 Conventions and Terminology | 1 | 0 | 0 | 0 | 1 |
| RFC 9946 §3 Scope, Goals, and Applicability | 1 | 0 | 0 | 1 | 0 |
| RFC 9946 §4 Protocol Overview | 15 | 8 | 1 | 6 | 0 |
| RFC 9946 §5 Requirements, Security Operations, and Optional Checksum | 73 | 57 | 3 | 8 | 5 |
| RFC 9946 §6 Test Setup Request and Response | 60 | 58 | 2 | 0 | 0 |
| RFC 9946 §7 Test Activation Request and Response | 44 | 44 | 0 | 0 | 0 |
| RFC 9946 §8 Test Load Stream Transmission and Measurement Status Feedback Messages | 57 | 55 | 2 | 0 | 0 |
| RFC 9946 §9 Stopping a Test | 12 | 12 | 0 | 0 | 0 |
| RFC 9946 §10 Operational Considerations for the Measurement Method | 5 | 1 | 1 | 3 | 0 |
| RFC 9946 §11 Security Considerations | 8 | 6 | 1 | 1 | 0 |
| RFC 9946 §12 IANA Considerations | 13 | 13 | 0 | 0 | 0 |
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.
Choose your measurement
Put the results to work
Measure a path you use, compare alternatives or collect results over time.
| Task | Measure | Use the result |
|---|---|---|
| Check an access line or circuit | Capacity, loss and delay under load | See how the path delivers traffic throughout the Test |
| Compare network paths | Upstream and Downstream Tests between chosen hosts | Compare directions, routes or changes to a circuit |
| Collect measurements | Structured results with --format json | Feed 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.