ITS wiki

The Incompatible Timesharing System

User Tools

Site Tools



This page is about Chaosnet, the network protocol developed at MIT about 1975 for Lisp Machines. It was also implemented for TOPS-20, VAX/VMS, Unix, and of course ITS.

Read the MIT AI Memo 628: Chaosnet by David A. Moon for most of the gory details. See also comp.protocols.tcp-ip.

Have a look at how to add Chaosnet info to your DNS.

Feel free to add and correct stuff on this page!

A. The original Chaosnet was developed in 1975 at MIT, running over a coaxial cable allowing 2 (or 4?) Mb/s [source needed]. It was implemented at least on CADR Lisp Machines [first-hand experience], TOPS-20 [first-hand experience], VAX/VMS, Unix, and ITS. The main sources would be the original MIT AIM 628, section 2.

B. Later, Chaosnet was running on standard Ethernet (at 10 Mb/s and more). It was implemented at least on later Lisp Machines [LMI Lambda, Symbolics 36xx, TI Explorer, first-hand experience]. The Ethernet type code is 0x0804 (see IANA). Main sources of info may be source code, but it's almost trivial given the Chaosnet frame format (see MIT AIM 628). See also alt.folklore.computers for some discussion.

C. At some point, tunnelling Chaosnet over IP was implemented by mapping Chaosnet addresses to IP addresses and using IP protocol type 0x10 [sources needed!!]. It maps a (16-bit) Chaosnet address x.y to an IP address, using the lower 16 bits, e.g. 192.168.x.y where the Chaosnet address is x.y. Main source of info may be Cisco doc, see also “Mapping an Internet Address into a Chaosnet Address” in the Symbolics Networking manual, p30.

D. For the klh10 PDP-10 (KS10) emulator running ITS, a simple protocol for encapsulating Chaosnet frames in UDP was designed and implemented (see doc). It allows mapping individual Chaosnet addresses to individual IP addresses. The protocol prepends Chaosnet packets with a four-byte header (version=1, function=1, 0, 0).

E. For the usim CADR emulator an implementation of Chaosnet over Unix named sockets was done, e.g. allowing the CADR emulator to contact Chaosnet servers on the unix host running the emulator. A server process (“chaosd”) opens a socket which forwards between client sockets in a broadcast manner. The packets are prepended by a four-byte header (MSB of length, LSB of length, 1, 0).

Programs to “bridge” between implementations of (B) and (D) and (D) and (E) were implemented [by BV] to interconnect a Symbolics 3640 (type B) with an ITS under klh10 (type D) and a usim CADR (type E). That has now been refined into a single bridge program between (B), (D) and (E), see the end of this page.

See also Joseph Oswald's implementation of (E) and routing with (D) in Python, and implementation of (D) in CommonLisp.


(A) is obsolete.

(B) still works both on remaining real Lisp Machines and emulated ones, such as the LambdaDelta (probably also Open Genera, using tap instead of tun?).

(C) has the drawback of only tunnelling over the same IP network (all Chaosnet hosts need to be on the same IP net, or do routing). It may also have problems with routing (all involveed routers must forward the IP protocol type), and needs root privileges to run on a standard *nix system. An extension could be to separate the address mapping between IP and Chaos from the encapsulation, ending up with something similar to (D) but with few advantages over it?

(D) has the advantage that UDP is routed everywhere, and needs no privileges to run (the “standard” port is 42042).

(E) is only within one *nix system.


Chaosnet packets of type RUT (8) contain routing table entries, first 16 bits of data is a subnet and second 16 bits is the cost (hops) to get to that subnet from the sending host.

ITS has a hardcoded “default gateway” with address 3040 (see SYSTEM;CHAOS >, label SBNRUT), which is/was MX-11.LCS.AI.EDU, which interconnected subnets 1 (0440), 3 (1441) and 6 (3040) (see SYSHST;HSTMIT >).


It would be nice if it was simpler to interconnect different Chaosnet implementations. Standards are nice, but while there are several more-or-less standard encapsulation protocols, e.g.

  • GRE (standard RFC, Chaos seems to (have) be(en) supported by Cisco, supported by pfSense but not for Chaos)
  • GRE-over-UDP (standard RFC, some advantages, but not implemented in standard routers?)
  • Foo-over-UDP/Generic UDP Encapsulation (github code, perhaps in Ubuntu?)

none of the standards seem widely implemented?

One idea could be to rewrite klh10/ch11 to use real Chaosnet-over-ethernet, but klh10 often runs behind a tun interface (with only IP), so there is no direct Ethernet access. Instead, run a cbridge on the host at the other end of the tun.

Another idea would be to rewrite usim to use real Chaos-over-ether, which could be more doable but a low prio for me.

Another, more interesting, idea would be to hack Open Genera to use tap (so Chaos can be used).


To interconnect Chaosnets, the “cbridge” program was developed, building on “echaos” (bridge (B) and (D)) and “chudprt” (bridging (B) and (E)). See the source here.

You can configure the bridge to connect subnets and/or individual hosts. Use cases could be

  • connecting remote Chaosnet-over-Ethernets, e.g. to communicate with others using LambdaDelta (use a Chaos-over-udp link between them).
  • connecting remote Chaosnet-over-unix-sockets, e.g. to communicate with others using usim (use a Chaos-over-udp link between them).
  • connecting ITSes running on klh10 - rather than configuring your klh10 to handle all other chudp hosts and iptables to forward chudp pkts over the tun interface, keep chudp routing in the bridge program. Adding new chudp hosts now doesn't require klh10 configuration.
  • and interconnecting these three, of course!

See also -READ-ME-.text in the source archive.

chaosnet.txt · Last modified: 2017-08-29 12:42 by victor