A short (and mostly wrong) history of computer networking
Making our own ping: Part 1
When I launched my Patreon, I vowed to explain how computers work. But in 2019, computers rarely work in isolation. So let's take the time to write a few articles about how...
Windows dynamic libraries, calling conventions, and transmute
Making our own ping: Part 2
So, how does
ping.exeactually send a ping? It seems unrealistic that
ping.exeitself implements all the protocols involved in sending a ping. So it must be calling some sort of...
FFI-safe types in Rust, newtypes and MaybeUninit
Making our own ping: Part 3
It's time to make
sup, our own take on
ping, use the Win32 APIs to send an ICMP echo. Earlier we discovered that Windows's
IcmpSendEcho2Ex. But for our purposes, the...
A simple ping library, parsing strings into IPv4 address
Making our own ping: Part 5
We've just spent a lot of time abstracting over LoadLibrary, but we still have all the gory details of the Win32 ICMP API straight in our main.rs file! That won't do.
The builder pattern, and a macro that keeps FFI code DRY
Making our own ping: Part 6
Our ping API is simple, but it's also very limited:
pub fn ping(dest: ipv4::Addr) -> Result<(), String> // called as: ping(ipv4::Addr([8, 8, 8, 8])).unwrap();
Finding the default network interface through WMI
Making our own ping: Part 7
Let's set aside our
supproject for a while.
Don't get me wrong - it's a perfectly fine project, and, were we simply rewriting “ping” for Windows in Rust, we could...
Binding C APIs with variable-length structs and UTF-16
Making our own ping: Part 8
Okay, I lied.
I'm deciding - right this instant - that using wmic is cheating too. Oh, it was fair game when we were learning about Windows, but we're past that now.
Consuming Ethernet frames with the nom crate
Making our own ping: Part 9
Now that we've found the best way to find the “default network interface”… what can we do with that interface?
Well, listen for network traffic of course!
Parsing IPv4 packets, including numbers smaller than bytes
Making our own ping: Part 11
Hello and welcome to Part 11 of this series, wherein we finally use some of the code I prototyped way back when I was planning this series.
Where are we standing?
Let's review the...
Parsing and serializing ICMP packets with cookie-factory.
Making our own ping: Part 12
In the last part, we've finally parsed some IPv4 packets. We even found a way to filter only IPv4 packets that contain ICMP packets.
There's one thing we haven't done though, and...
Crafting ARP packets to find a remote host's MAC address
Making our own ping: Part 13
Alright. ALRIGHT. I know, we're all excited, but let's think about what we're doing again.
So we've managed to look at real network traffic and parse it completely. We've also...
Crafting ICMP-bearing IPv4 packets with the help of bitvec
Making our own ping: Part 14
So. Serializing IPv4 packets. Easy? Well, not exactly.
IPv4 was annoying to parse, because we had 3-bit integers, and 13-bit integers, and who knows what else. Serializing it is...