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.

TransportBroadcast averagevs. clearnet
Tor (reconstructed)1,026 ms~3.7x
Mixnet3,442 ms~12.5x

Is my workload a fit?

You want toMixnetdVPNWhy
Fetch a page, call an API, submit a transactionYesYesSmall independent requests are the strong case
Send messages between two partiesYesNoEnd to end, no exit gateway, and dVPN has no notion of a peer
Light-client sync: compact blocks, small repeated requestsYesYesSmall and independent, even though there are many
Download a large file, sync a whole chainNoYesBulk transfer is the weakest case
Stream video, run a voice or video callNoYesSustained throughput above what the default rate allows
Anything needing a round-trip budget of well under a secondNoMaybePer-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.

A Sphinx packet carries a 2 KB payload, so the per-client throughput ceiling is on the order of 100 KB/s. Size your workload against that.

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 catch written 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.