The intention behind this project is discovery and understanding. The idea is to explore how the internet is put together and use common industry tools to see and understand all the communications necessary to make the services and apps we use work.
We decided to take notes that create a reproducible experience. We document our questions, discovery, and our processes so other people who may want to take a similar journey can have a path to follow. We have broken up our exploration into chapters. Each chapter has a README that documents our exploration and whatever files we create or modify in our exploration. Some chapters have a /final directory that contain the artifacts for the chapter in their final state. If you get lost in a chapter and need a reference point, these may be artifacts to help move you forward. There is, at least as of yet, very little actual software to run from this repo. Instead, the intent is to guide the experience and the learning process.
appendix
: polished documents that dive deep into concepts that are useful to understand, but that we don't have a curriculum to build from scratch.bin
: useful scripts used in our explorations.chapters
: The primary folder of this repo. That runs through the learning process of building up an internet from scratch.future
: ideas we want to explore in the future, some of which have some outlines of how we intend to start thinking about those topics.miscellaneous
: mostly explorations that were discarded because they turned out to be tangential docker problems/learnings.
- a basic understanding of terminals and bash
- a basic understanding of IPv4 and subnets
- optional but highly recommended: a basic understanding of docker Course link
- optional for the super motivated: understand the communication protocol layers we'll be working with
You will need to install colima or docker desktop to manage your docker instances. We go into more detail what these software are and how to get started with them in our prequel chapter 000.
We've put some effort into explaining the commands that we're using. However, if we use a command with a flag that doesn't have explanation, check the command's help
for more details; e.g. ping --help
. Alternatively, check the command's manpage; e.g. man ping
.
We now have a future folder with some ideas on technology we would like to implement in our internet. But... here's a rough flow of how we started thinking about the order.
- having machines running on three or more networks
- being able to send packets between those machines on those different networks
- using basic software to be able to view what's happening on those networks
- BGP/IGP:Dozen nodes running BGP
- DNS (root nodes)
- TLS: load/use basic Server/client certificates (generate using openssl)
- Applications (HTTP servers)
- Set up a Root CA (Boulder) and import root certificates to Chrome
- Build our own BGP implementation?
- Build our own DNS server?
Here's some interesting topics that came up in the course of our exploration that didn't fit in at the time. We may come back to these?
- DHCP
- Proxy ARP
- Firewalls
- Caching
- improve footnotes
- table of contents?
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.