What a Nym client is

A Nym client works differently from an ordinary network client, something like an HTTP or UDP client, despite the shared name. The difference determines how you integrate with it.

An ordinary client sends when your application has something to send, and is quiet otherwise. The timing and volume of its traffic follow what the user does, and a network observer can use that pattern to identify the user.

The always-on stream

A Nym client sends traffic at a constant average rate. Once it connects to an entry gateway, it sends Sphinx packets whether or not your application has anything to send. Most of these are cover traffic: encrypted packets with no real payload. When your application sends something, the client puts your data into the stream in place of cover packets. An observer sees the same constant stream either way.

Your appsend()Nym clientqueueEntrygatewayconstant average rate, random (Poisson) timing
● real   ● cover

The gateway sees the same stream when the app is idle and when it is busy. The client sends on a Poisson schedule, so the intervals are random and the average rate stays constant: about 50 packets per second on the main stream (a real packet when one is queued, cover otherwise), and about 5 per second of loop cover.

Two separate streams of Sphinx packets leave the client, each a Poisson process at its own rate:

StreamCarriesRate
Loop cover streamCover traffic onlyone packet every ~200 ms (~5 packets/s)
Main streamReal packets, with cover filling every empty slotone packet every ~20 ms (~50 packets/s)

send() only queues

On the base client, send() does not wait for a reply, and usually does not transmit straight away. It puts your message into an internal queue. A return from send() means the message reached the queue. It does not mean the packets have left your machine, and it does not mean anyone received them.

Nothing pairs a reply with a request, because a paired reply would bring the timing link back. A recipient can reply with a single-use reply block (SURB): a return route you build in advance that never reveals your address.

One core, many packages

All Nym clients use the same core (client-core): the native nym-sdk, the browser and wasm packages, and the standalone clients. HTTP, TLS, connections and ordering are a second protocol stack the packages add on top. The browser mix-* family runs that stack, a userspace TCP/IP stack and TLS, inside one Web Worker.