Skip to content
Dialling with a 2,400 bps modem? Use +1 610 922 1996. As of 25 August the Texas and Boston numbers answer V.32bis only, 4,800 to 14,400 bps, and will not train a modem that can only do 2,400.
Engineering
The numbers,
and their limits.
This page is for the reader who wants to know whether any of this is
real. Every figure below was measured on the running system, and each one
says what it is a measurement of — a number without its method is a
number you cannot check.
Two modem engines, one pool
There is no hardware modem bank. Both engines are software modems
answering audio that Asterisk hands over a Unix socket, which is why
thirty-two lines fit on one virtual machine instead of a rack. They sit
behind one admission point, and neither can do the other's job, so the
engine that answers is fixed by the number dialled rather than by the
calling modem.
Measured performance of both modem engines
| Engine |
Modulation |
Line rate |
Goodput |
Train |
| modemd — spandsp |
V.22bis |
2,400 bps |
275 B/s |
1.6 s |
| slmbridge — slmodemd |
V.32bis |
14,400 bps |
1,444 B/s |
— |
Goodput is application bytes per second on incompressible data. Neither
figure is rounded up. The V.32bis engine does not answer a
caller that can only do 2,400 bps, which is why it is not the
engine on every number, and why 14,400 bps is a rate some callers
reach rather than a rate the service delivers.
Why 1,444 and not 1,800
1,444 B/s is 11,552 bps of a 14,400 bps carrier — 80%. The missing
fifth is V.42 LAPM framing, acknowledgements and the occasional
retrain. 80% is the correct number for a reliable-mode link, and a
service quoting 1,800 B/s off a 14.4k modem would be quoting the
carrier rate and calling it throughput.
The 9,979 B/s figure is not throughput
The same twenty kilobytes, as zeroes, moves at 9,979 B/s — 6.9 times
faster. That is evidence that V.42bis compression is live and working,
and it is the reason HTML does better than the incompressible figure
suggests. It is not a speed this service can deliver on real content
and it is not offered as one.
V.34 does not work; V.32bis does
V.34 does not train over this path, even in a clean loopback with no
impairment at all. Rather than ship a configuration that negotiates
down unpredictably, both ends are capped at
AT+MS=132,1,1200,14400, and at that cap
the answer side agrees 14,400 bps.
Which engine answers which number
That is held per number in the Asterisk database, which the dialplan
reads when the call arrives and the operations console writes. It is
deliberately not stated here: a page that named a speed per number
would be a sentence pretending to be a switch, and it went stale every
time the switch moved. The pool default is
V.22bis at 2,400 bps, and there are
thirty-two slots on the V.32bis engine out of
thirty-two. The three numbers are one pool of
lines, not three tiers of service.
Thirty-two lines, every slot there is
Thirty-two slots exist and thirty-two is what LiteNet carries,
so the enforced ceiling is the size of the
pool. That is measured rather than picked: every line has
to feed the DSP every 20 ms for the whole call, and a frame-lateness
sweep on the hardware that is answering is what establishes how many
can hold that deadline at once. It is re-run on any hardware change,
and the ceiling does not move without one. The measurement is
pessimistic on purpose — it runs both ends of every call on the one
machine, roughly twice the DSP work real callers impose. The
thirty-third caller still gets a busy signal, on purpose,
instead of thirty-two carriers degrading together.
The codec lock
What is compiled in, and what is not
Modem audio is not speech, and everything a PBX normally does to audio
destroys it. Asterisk 22 is built from source here with
app_audiosocket and
res_audiosocket enabled and
func_speex and
chan_websocket compiled out. A module
that cannot be loaded cannot be turned on by accident.
The pin itself
The codec path is pinned to (ulaw) with
transcode:prevent, and no DSP is ever
allocated on the channel. A single transcode, or one pass of echo
cancellation or noise suppression, and the carrier will not train at
all.
transcode:prevent is the load-bearing
half. Without it a codec mismatch is resolved rather than refused, and
the call completes, sounds fine to a person, and carries no modem.
Making the 2026 web fit
A modern news front page is 380 kilobytes. At 1,444 B/s that is four and a
half minutes, and at 275 B/s it is twenty-three. The proxy is what makes
the difference between a service and a demonstration.
Measured byte reduction, transparent mode, cold cache
| Page |
Upstream |
Delivered |
Saved |
At 14.4k |
At 2400 |
| bbc.com/news |
380,079 B |
5,933 B |
98.4% |
4.1 s was 263 s |
21.6 s |
| en.wikipedia.org/wiki/Modem |
505,622 B |
24,703 B |
95.1% |
17.1 s was 350 s |
89.8 s |
| news.ycombinator.com |
34,863 B |
16,078 B |
53.9% |
11.1 s |
58.5 s |
| text.npr.org |
6,095 B |
2,794 B |
54.2% |
1.9 s |
10.2 s |
Hacker News reduces least, at 53.9%, because it is already almost entirely
links with very little boilerplate to remove. The transformation cannot
invent savings that are not there, and a table that only showed bbc.com
would be selling you the best case.
The profile is keyed on your actual line
When a carrier trains, the modem daemon writes the negotiated rate to
/run/litenet/sessions/<your-ip> and
removes it when you hang up. The proxy reads that file to decide how
hard to cut. Without it the profile would be a guess, and the wrong
guess in the generous direction costs a subscriber minutes.
The output is HTML 3.2, deliberately
Scripts and stylesheets are dropped, the document is re-serialised from
a parsed tree so tables cannot come out unbalanced, and images are
transcoded down or replaced by numbered links. It is emitted as HTTP/1.0
with an exact Content-Length, because a
1996 client has no chunked-transfer decoder and renders the hex length
lines as body text.
Budgets are pessimistic on purpose
The planning figure the proxy uses is ten bits per byte, then 80% —
192 B/s at 2,400 bps against the 275 B/s actually measured. Being
pessimistic picks the leaner profile at a boundary and costs a
subscriber some pictures. Being optimistic costs them twenty minutes,
and they hang up.
What these figures are not
Every number above is a measurement of a specific thing, and reading one
as a measurement of a different thing is the easiest mistake to make here.
Read it carefully
Goodput is not carrier rate
The line rate is what the two modems agreed. The goodput is what a
file transfer actually moves after framing and acknowledgements, which
is about four fifths of it. Quoting the first as the second is how a
modem gets sold.
Read it carefully
A speed figure is a property of the engine
Not of your modem, and not of the number you dial. The answering side
has to commit to a modulation before it can hear what the caller is,
so the engine on a slot decides the speed and a faster modem simply
trains down to it.
Read it carefully
A page-reduction figure is per page
98.4% is what one news front page gives up. A page that is already
mostly links gives up half that, and the table above publishes both
for that reason. There is no average worth quoting.
Read it carefully
The ceiling is per host, not per design
Thirty-two is what the hardware answering today holds without a
modem missing its twenty-millisecond deadline. It is not a property of
the software, and it is re-measured rather than carried over when the
hardware changes.