Now, we are running an experimental random pool network.
Here, I describe the current shape of the network, and possible enhancement to the network.
The structure is like this:
<HWRNG> (0) [supplier] ---> [root] ^ (1) ^ | / (3)| / (2) | / V / [demander]
Type of nodes
Currently, there are three kinds of nodes:
Root nodes (root)
Nodes which maintain the directory of the network and accept inquiry for that. It runs on default port.
HWRNG nodes (supplier)
Nodes with HWRNG, and offer random numbers to nodes (or to the network). It runs on default port.
Passive Nodes (demander)
Nodes with no HWRNG, which doesn't accept inquery or requests. It runs on any port. It is OK, it's behind firewall.
How it works (as of 2014-07-07)
- At first, root node starts. It accepts registration from each node, and manage those information.
- Supplier node starts with HWRNG, and registers to root node.
- Demander node starts (possibly behind firewall on any port), and inqures to root node to get where supplier node(s) are.
- Supplier node and demander node interact random numbers.
It is demander node which manages connection (such that RTT (round-trip time) and WS (window size)), so that it can get packets efficiently. Supplier node passively gets packets and simply responds to incomming packets.
We have: a root node is in Paris, France, a supplier node in Gunma, Japan, and demander nodes in Gunma, Nagoya, and United States.
A demander node in US can get random numbers at the rate of more than 30 KiB/s.
GIGO, the program
We name the program GIGO (after Garbage-In Garbage-Out) and each node runs GIGO. It uses UDP. Currently, only IPv4 is supported, but IPv6 will be supported. Default port is now 10646, as I like this number.
It's too simple, you'd say. Indeed, a demander just gets random numbers generated by HWRNG, as-is.
Well, for next, I am considering following structure:
<HWRNG> [node] ^ | V <HWRNG> <HWRNG> ..=> [node] <===> [node] <===> [node] <==... ^ ^ ^ | | | V V V [demander].. [demander].. [demander]..
There are vertical flows and horizontal exchanges. Vertical flow is to deliver random numbers. Horizontal exchange is to shake and mix random numbers.
While enough amount of fresh random numbers are always feeded from HWRNG, nodes exchange and shake to serve them to demanders.
Bandwidth of horizontal exchanges is OK to be very small, I think. Say, exchanges a few packets for an hour would be enough.
Bandwidth-wise, it's better to put a node with HWRNG with the line of horizontal exchanges, but conceptually, it could be considered random numbers came vertically from another node.