Somebody asked a few months ago “hey, what’s the best way to understand computer networking?”. I don’t really know how to answer this question – I’ve learned a lot of the things I know at work, and I think picking up new things when I need them has been fine.

But I thought it could maybe be useful to list a bunch of concrete skills and concepts I’ve learned along the way. Like anything else, “computer networking” involves a large number of different concepts and skills and tools and I’ve learned them all one at a time. I picked most of these things up over the last 4 years.

Per this tweet:

ping (are these computer connected??)

whois (is this domain registered)

ssh

curl (for making HTTP requests)

tcpdump (record packets! check for traffic on a port!)

dig/nslookup (debugging DNS issues)

netstat/ss (is that port being used?)

ifconfig (what’s my IP address?)

iproute2 (that is, the ip command. replacement for ifconfig. very useful.)

command. replacement for ifconfig. very useful.) wireshark (look at packets with a GUI)

ngrep (grep for your network)

iptables

socat (connect a unix domain socket to a tcp socket)

nsenter for debugging container networking problems

learning takes a lot of time

I spend a fair amount of time trying to learn new computer things. I’ve found it really useful to take it one step at a time – my learning process with a lot of this stuff is basically

identify something small I don’t know (how to, from the command line, check the expiration date on https://google.com's TLS certificate)

figure it out (sometimes with help from my great coworkers)

repeat

That’s all! It’s really fun to see how learning a bunch of tiny things adds up over time. Like today I feel like I can handle most things about computer networking that I run into in my job, and I don’t feel like there are that many Big New Ideas about networking I don’t know about. (though, well, wifi is still a mystery to me :) )