@@ 0,0 1,68 @@
% # Copy-pasted without editing from an earlier draft of the
% # self-hosting article
Let's start at the highest level of abstraction. What most people call
the internet is actually the World Wide Web. The Web is a set of
documents, encoded in a programming language[^3] called HTML
(ironically, the name is an acronym for "HyperText Markup Language", it
was never meant to be a full programming language). These documents are
accessed via a protocol called HTTP[^4], the HyperText Transfer
[^3]: HTML+CSS is Turing-complete, and HTML+CSS+JS isn't even a Turing
tarpit. While I'd argue that there's no place for downloading and
executing arbitrary code from untrusted servers, thus is life. I hope
for [Gopher](https://tools.ietf.org/html/rfc1436) and
[Gemini](https://gemini.circumlunar.space/) to become more popular in
[^4]: HTTP can also be used to access non-HTML documents. Most downloads
use HTTP. In addition, most of the time, a similar protocol called
HTTPS (HTTP Secure) is used. It's the same protocol, but encrypted.
HTTP is transported between computers as a series of bytes, which are
sent in a specific order and are guaranteed to all arrive exactly once,
as they were sent, and in order. However, no existing method of linking
computers can guarantee these properties. As such, there is a protocol,
TCP[^5], for guaranteeing those properties on top of an unreliable
[^5]: The Transmission Control Protocol. There also exists an
alternative protocol, UDP (the User Datagram Protocol), which has a
much lower overhead but doesn't provide these guarantees.
TCP works on top of IP (the Internet Protocol), which gives each
computer[^6] an address, and allows there to be multiple "hops" between
computers. IP works on top of a variety of single-hop protocols,
including Ethernet, WiFi, DOCSIS (used by cable modems), DSL, PPP (used
for dial-up), and probably others.
[^6]: In practice, not all computers have a global IP address, but
that's a topic for another day.
You'll note that nowhere here is there any distinction between a
"normal" computer and a server. That's because, fundamentally, they're
[^7]: While many of the more computer-savvy readers will be unsurprised
by this, the false dichotomy between clients and servers is
There's one more protocol that I haven't mentioned yet: DNS (the Domain
Name System). This provides a mapping between human-readable names like
d2evs.net and IP addresses like 220.127.116.11.[^8] Since most ISPs don't
provide static IP addresses, it's not usually possible to host a server
[^8]: It also provides many more "records", for various other purposes.
Yet another topic for a different day.
So how do you run a server? In practice, there are two ways: a VPS and
colocation. With a VPS, you pay some company some amount of money for a
virtual machine with (at least) one static global IP address. Colocation
is when you pay for a small space with an Ethernet port, a power outlet,
and cooling. Colocation is more appealing (more control is always
better!) and cheaper at a larger scale, but the cheapest VPS is a *lot*
cheaper than the cheapest option for colocation ($5/mo, and an extra
$10/yr for a domain name).