Each cable is a queue. A link sends packets at a rate μ (packets/s). Packets arrive at rate λ. Utilisation is ρ = λ/μ. For random (Poisson) arrivals and exponential service, the M/M/1 queue gives the mean number in the system L = ρ/(1-ρ) and the mean time in the system W = 1/(μ-λ). Little's law L = λW ties them together. Delay explodes as ρ approaches 1, which is why a link that looks "only 90 % full" already feels slow.
Finite buffers drop packets. With room for K packets (queue + the one being sent) the M/M/1/K blocking probability is PK = (1-ρ) ρK / (1-ρK+1) (and 1/(K+1) at ρ = 1). A huge buffer removes the loss but lets the queue grow to about K/μ seconds: that is bufferbloat.
End-to-end delay is the sum over the hops of propagation delay dl plus queueing and sending time Wl. The "fluid + M/M/1 prediction" in the readouts routes each flow's mean rate along its current path, finds every link's λ, and sums d + 1/(μ-λ). It ignores buffer drops, so it is only shown while every link is below 95 %.
Routing. Each router forwards on the first hop of a least-cost path (Dijkstra). The policies differ only in the cost of a link:
- Fewest hops: cost 1 per link.
- Lowest fixed latency:
d + 1/μ, which ignores load.
- Adaptive:
d + 1/(μ - λ̂) with a smoothed measured λ̂ (refreshed every 0.5 s), so a congested link looks expensive and traffic moves away. Adaptive routing can also make traffic slosh between two paths; this model damps it with smoothing but does not remove it.
Failures. Cutting a cable destroys the packets on it, and routers only learn about it after 0.4 s (reconvergence), so packets keep being sent into the hole and lost during that gap.
What is simplified. Real traffic is bursty, not Poisson, and most of it is controlled by TCP-like congestion control that slows senders when loss appears; none of that is modelled. All packets have equal size, queues are plain FIFO, links are symmetric, and a packet never waits for an acknowledgement. Time and rates are scaled so you can watch single packets: real links move millions of packets per second with microsecond service times, so the real ratio of propagation delay to sending time is far larger than here. The map and the data-centre scene are decoration.
Checks on this page. (1) M/M/1 delay: this event engine and a separate Lindley-recursion program are both compared with 1/(μ-λ). (2) M/M/1/K blocking compared with the closed form. (3) Dijkstra compared with a separate Bellman-Ford on random costs and random cut links. (4) Conservation: generated = delivered + dropped + still inside the network.
Link capacities, delays and flow rates are illustrative values chosen for the demonstration, not measurements of any real network.