Latency and limits
Latency is the mechanism
Each mix node holds a packet for an average of 15 ms before forwarding it, and the path is five hops. Reordering is what breaks the link between a packet entering the network and a packet leaving it. Removing the delay removes the protection, so there is nothing to tune. This is why interactive workloads do not fit. The latency comes from the design, not from code that will get faster.
Measured: one end-to-end run
One run, 2026-07-20, headless Chromium, in the anon-rpc sandbox: the first RPC took 3.3 to 4.9 s, a warm RPC about 1.0 s. Treat it as a single data point.
Measured: Zcash transaction broadcast
A preliminary analysis, published on 2026-10-13. The test measured clearnet and Nym with the Zingo CLI. It measured Tor with zcash-devtool, which includes the proof-generation time. The workload differs from an Ethereum wallet. It is still an independent, recent data point. The post gives no sample sizes. The figures below are against a 276 ms clearnet baseline.
| Transport | Broadcast average | vs. clearnet |
|---|---|---|
| Tor (reconstructed) | 1,026 ms | ~3.7x |
| Mixnet | 3,442 ms | ~12.5x |
Is my workload a fit?
| You want to | Mixnet | dVPN | Why |
|---|---|---|---|
| Fetch a page, call an API, submit a transaction | Yes | Yes | Small independent requests are the strong case |
| Send messages between two parties | Yes | No | End to end, no exit gateway, and dVPN has no notion of a peer |
| Light-client sync: compact blocks, small repeated requests | Yes | Yes | Small and independent, even though there are many |
| Download a large file, sync a whole chain | No | Yes | Bulk transfer is the weakest case |
| Stream video, run a voice or video call | No | Yes | Sustained throughput above what the default rate allows |
| Anything needing a round-trip budget of well under a second | No | Maybe | Per-hop mixing delay is not tunable without removing the protection |
The default sending rate
By default a client emits 50 real packets per second (one every 20 ms on average) and 5 loop cover packets per second (one every 200 ms): roughly 55 packets per second. The stream runs constantly, whether or not you have anything to say. The network carries about 46,000 Sphinx packets per second in total, a last-week average.
What bites in code
- Sequential dependent calls multiply the cost. Three dependent routed calls in one user action pay in series, and no single request reveals it.
- Cold start lands on the first request. Bring the tunnel up ahead of use, then send one warm-up request that changes no state.
- Concurrent requests each miss the connection pool and pay their own handshake. Use a small concurrency limit with a per-request bound.
- In the browser packages the timeout is a race that bounds your wait. The request continues in the worker, so a retry on timeout leaves two requests in flight.
- A
catchwritten for another purpose chooses fail-open for you. Choose fail-open or fail-closed on purpose.
What the transport never does
Nym protects network-level metadata. It does not make an application private.
- Application-layer identity. Logins, session cookies, API tokens, account identifiers and the contents of a request reach the destination exactly as you sent them.
- Request patterns. What you ask for and when you ask for it is visible to the destination whatever the transport. Closing that is baseline hygiene, and it is your responsibility.
- A fixed exit is a linking key. Requests through one exit gateway stay linkable to each other at the destination. Rotate the exit per request to restore request unlinkability.