I sometimes see questions on Hacker News or other forums that are asking how early dialup ISPs worked (or some specific aspect thereof,) so I thought I’d write up what these systems were like. I worked at such an ISP from 1996 - 2006 and we acquired several others during that time, so I got to see a few different approaches.
The Bare Minimum
Roughly before 1996, most of our users dialed into our service using an analog modem (usually 14.4kbps or 28.8kbps) and accessed the Internet via a shell account on our Linux server. So, they needed a computer of some sort, a modem, and so-called terminal emulation software. There were a bunch of these programs (Telix was a popular choice on Windows) but they all did basically the same things:
- Presented a terminal window to the user which was directly connected to the modem’s serial port.
- Interpreted control sequences for popular terminal types (DEC VT-100 was probably the most popular.)
- Most provided one or more file transfer protocols – like xmodem or zmodem. The way these worked is you ran a client program on the server you were connected to and gave it the name of a file you wanted to download, then you initiated the file transfer function of your terminal emulator and it tried to negotiate with the server program and download the file. You could also do this in the reverse direction to transfer a file from your computer to your ISP’s server.
On the ISP side, you needed:
- An upstream Internet connection
- One or more modems connected to either a regular server – usually some kind of Unix server – or a terminal server. More on these in a minute.
- A server your users could connect to to run Internet client software – things like text web browsers, email clients, IRC clients, FTP clients, etc.
In many cases, and certainly in our case, in the beginning those three things were all attached to a single Linux server. So, we had a Linux server with a dedicated 56kbps “leased line” – that was our connection to the Internet and a couple of modems for customers to dial in to. Based on the companies we subsequently acquired, and other early ISP employees I’ve talked to over the years, I think this was – far and away – the most common approach. Some typical circa-1995 hardware was:
- An early Pentium-class CPU – 60 or 66mhz was typical. A 90mhz 2nd-gen Pentium was an embarrassment of riches.
- 32 - 64 megabytes of RAM
- A 2-4 gigabyte hard drive. SCSI if you were rolling in the dough, IDE otherwise.
- Some kind of multi-port serial card. Cyclades was pretty popular, and what we used. You needed these to directly connect more than one or two modems.
- A suitable Linux or BSD distribution. We started out with Yggdrasil, then moved to Slackware. Those were pretty popular choices. In 1995 this would have been something like Slackware 2.x running a 1.2.x-vintage kernel. At a bare minimum, your users expected to have a web browser like Lynx, an email client (something like mailx or PINE,) FTP, Gopher, and IRC. They also expected you to provide email service and host a personal home page for them, so you also needed to run an SMTP server like Sendmail or Smail and a web server like the NCSA HTTP server. Depending on when you started, you might have deployed vanilla NCSA, or NCSA along with a set of patches that provided some bug fixes and additional features. Such a deployment of NCSA was said to be A Patchy Server. This eventually became the Apache HTTP server.
The very first thing to fail in our setup was the 56kbps leased line. It didn’t really “fail” so much as become “totally saturated to the point of being unusable” at around the 8 - 10 concurrent user mark. Like many things in ISP land, the options for scaling this up were not linear and the upgrade – to a 1.536mbps T1 connection – required a leap of faith on the part of the owners. Prices for these varied wildly at the time, but a cost of $1,500/month was pretty typical.
T1s were generally connected to an external router, so our Linux server now needs an Ethernet card to interface with the router. This was after the days of vampire taps, but before the days of inexpensive hubs and switches, so our Ethernet network is going to be 10Base2. This is Ethernet over coaxial cable with BNC connectors. The way these worked is on each card you had a t-connector. BNC cables ran from card-to-card, and on the two computers at either end you had to add terminating resistors. If you disconnected either of the resistors or needed to add a host to the network, the entire Ethernet was unavailable until the resistors were properly re-attached (10Base2 Ethernet interprets the absence of the terminating resistors as a never-ending collision.)
The most common router manufacturers at the time were Cisco Systems and Wellfleet. Ours was a Cisco 2501, which was a popular single-T1 router. Well, it wasn’t actually a “T1 router”. It had a high-speed synchronous serial port and an Ethernet connection. You added an external CSU/DSU, made by a company like Adtran, to terminate the T1 and interface with the router.
By this time, it became more and more common for people to want to have the ability to run Internet client software directly on their PCs. Windows 95 had an IPv4 stack and modem dealer built-in. Before that, you needed something like Trumpet Winsock or The Internet Adapter to act as a Winsock (local networking API) to SLIP/PPP bridge. This let users run web browsers like NCSA Mosaic or Netscape Navigator and email software like Eudora directly on their computers. On the ISP side, you needed either an “terminal server” that had a SLIP/PPP implementation or equivalent software to run on your Unix server. We started out running The Internet Adapter, then SLIRP, and finally PPP software on our Linux server, then gradually migrated to an “access concentrator”.
I’ve mentioned “terminal server” a few times without really describing what these were, but essentially, they were proprietary appliances made by companies like Cisco Systems and Livingston Networks that contained a bunch of serial ports. Originally, these were used to either connect text-only terminals that users would use to interact with a host computer (usually a mainframe or minicomputer) or as a tool administrators would use to remotely manage various computers and appliances that had serial consoles. As it turns out, you could also connect modems to these, and allow users to dialin and, from either start a SLIP/PPP session, telnet from the terminal server to some other host, or connect to another attached serial port.
At ISPs, access concentrators were more common. These were devices like terminal servers, but with built-in modems and usually the ability to terminate ISDN connections as well. A key advantage of these systems was their density. Whereas external modems took up a lot of shelf space, and required an individual analog telephone line, access concentrators even in the 90’s could achieve densities of over 100 simultaneous connections in 3 rack units (5.25 inches tall by 19 inches wide,) and supported digital T1 interfaces, which made the cabling and provisioning of new telephone circuits much easier. The largest available units at the time could terminate a DS3 (672 circuits) in around half a standard rack.
The first access concentrator we bought was an Ascend Pipeline 400. This was exclusively for our ISDN customers and could terminate a single ISDN PRI. This was a T1 that could support up to 23 simultaneous 64kbps ISDN calls (the 24th channel is used for ISDN signaling.) With this, we could offer 64kbps and 128kbps ISDN service, in addition to our analog modem services. At the time, this device cost us the princely sum of $9,000. We also had to add a RADIUS daemon on our Linux server to authenticate the ISDN callers and make sure that only the users who paid for 128kbps could have two active simultaneous channels.
On the analog side, we continued to scale up our Linux-attached modem system for quite a while – at the end, we had 48 external Supra and USR Robotics modems in a single large dialup pool. These were all connected to the 60mhz Pentium server running Linux with three Cyclades SM-16 serial breakout adapters.
While this worked, there were a couple of problems that led us to eventually move on to use access concentrators for the analog modem service, as well:
- First, to use these concentrators, you generally needed to get your telephone lines aggregated on a T1. Early on, the telephone company wanted a large premium to deliver on a T1, as opposed to discrete twisted pair lines like you might have at your house if you still have a landline. But, once we had 50 lines, they ended up delivering the lines on a T1 anyway – so they didn’t have to run another 100-pair feeder cable from their central office to our location. To hand off the lines in the way we had ordered them (as discrete analog lines,) the telephone company installed a channel bank, which is a device that breaks out individual circuits (in our case, plain-old telephone service or POTS connections) from an aggregated circuit, like a T1. It didn’t take us long to figure out we could just disconnect the T1 from their channel bank and hook it directly up to our equipment.
- The discrete modems took up a lot of space – in our case, a set of shelves that were probably 8 feet wide and 8 feet tall. An Ascend Max 4000 housed up to 96 modems in a 3 RU device (so, 19" wide and 5.25" tall.)
- The access concentrator modems were a lot more reliable – we used to turn all the lights off before we left for the night and stare at the modems for a minute so we could power cycle the modems that had locked up (the Supra modems would get into a state where they locked up and when that happened they had two adjacent status lights that would be on.)
- While we didn’t have PRI T1s connected at first, these devices supported that, which would allow us to both expand our ISDN service, pool our ISDN and analog lines for better efficiency, and provide 56kbps modem service (on the ISP side, you can’t connect a 56kbps modem to either an analog telephone line or a non-PRI T1 and successfully negotiate 56kbps with your customers.)
- As our user base expanded, moving SLIP and PPP over to the access concentrators took a bunch of load off our Linux server, which let us scale up our email service and continue to support the (ever-dwindling) community of users that wanted shell access either in addition to or in lieu of their SLIP/PPP connection.
Scaling this up Over the years, we had to further scale our uplink bandwidth, modem bank, and our server pool. We also added new devices to offer new services.
Bandwidth Once the single T1 was no longer sufficient, we went to a bonded T1 pair. This provided 3mbps of uplink bandwidth, but it wasn’t really “bonded” – it was just two T1s from the same provider with routing set up to send some connections over the first T1 and others over the 2nd. At the scale of a even a small ISP, this is perfectly fine – while a single TCP/UDP data stream can’t utilize more than 1.5mbps, in practice, that didn’t end up being a problem.
After that, there were various fractional T3 (45mbps) offerings available, which is what we eventually upgraded to. After that, you were in SONET land:
- OC3 - 155mbps
- OC12 - 622mbps
- OC48 - 2.4gbps
- OC96 - 4.8gbps
- OC192 - 10gbps
Modem Bank We already talked about this, but the technical path to scale this up was to move your modem lines to dedicated access concentrators with high-density DSP-based modems and T1/T3 delivered lines from the telephone company. Many ISPs, instead of buying their own concentrators, purchased wholesale dialup service from a larger ISP. These companies would point to your RADIUS servers and either provide or let you bring in a vanity number, giving your users a unique telephone number to dial for service.
Servers We gradually added servers and moved services to dedicated or semi-dedicated servers. Our path looked something like this:
- First, we added a dedicated 90mhz Pentium server to act as the web server for our commercial web hosting clients. We also ran our secondary DNS on this server and eventually added an SSL-enabled web server.
- Next, we added a dedicated server (as I recall, this one was a 133mhz Pentium) as a dedicated consumer web server and shell server.
- This left our original server to run primary DNS, SMTP/POP3, and RADIUS.
- We also had a single Windows NT server that ran some early shopping cart software (iCat, which it looks like Intel ultimately purchased.)
- Eventually, mail and DNS each went to their own cluster of dedicated servers.
Other Approaches In addition to our shoestring budget approach, I saw a few other approaches over the years:
- Same as the above, but with BSD. This one was pretty popular, either with early versions of FreeBSD or BSDI, which was a commercially supported BSD.
- Commercial Unix + Access Concentrator. These shops had more funding and started with fancier servers and access concentrators, but were still within the reach of somebody with angel funding or a small business loan and could conceivably turn a profit. If I were to travel back in time to 1995 and build an ISP based on this model, I’d use Sun servers and Ascend Max access concentrators. Strangely enough, the main real-world instance of this I saw used pricier Cisco access concentrators and SGI (?!?) servers. While the quality of the Cisco concentrators was on par with the Ascend models, they were a lot less user friendly for tech support staff to troubleshoot. I don’t know what they were thinking (or if they were thinking) when buying SGI servers, but, yeah, that’s what they did. And then they went bankrupt.
- The Venture Capital model. Buy a bunch of large Cisco or Ascend TNT access concentrators. Build a nation-wide network. Build your backhaul network on expensive and finicky ATM gear. Start a side business as a colocation provider, but instead of buying metal shelves at Costco for your customers to put their janky tower servers on, build out a raised-floor data center with fully enclosed cabinets, hot/cold aisle cooling, dual generator backups, and bullet-proof cladding on the building (not making this up - this really happened.) Do not turn a profit. Promptly go out of business in March of 2000.~