IPv4 address limitations

10 min read

#IPv4 #IPv6 #Networking

Part 2 of 2 in Thinking Out Loud

This post looks at IPv4, the system that gives every device on the internet an address. It explains why IPv4 is running low on addresses, why moving to IPv6 is harder than it sounds, and a simpler idea that could have bought IPv4 a lot more time.

How IPv4 Works #

Internet Protocol (IP) is what moves data across the internet. Every device gets an address, and IP uses that address to send data to the right place. It has been part of the internet since the very beginning.

I won’t explain all the details of IPv4 here. There are plenty of good guides online already. Instead, I want to talk about its biggest problem: it’s running out of addresses.

IPv4 addresses are made of 32 bits. That gives about 4 billion possible addresses. Sounds like a lot, but there are already more than 4 billion devices connected to the internet. This one limit is really IPv4’s only big problem.

IPv4 address space is almost fully allocatedA bar showing that about 97% of the 4.3 billion IPv4 addresses are already allocated, leaving only a thin sliver free.IPv4 address space: 2^32 ≈ 4.3 billion≈97% already allocated, only a thin sliver remains free
IPv4's entire address space is already close to fully allocated.

Why We Can’t Just Make Addresses Bigger #

The obvious fix sounds simple: make addresses bigger, say 64 bits instead of 32. But it’s not that easy. IPv4 is a strict protocol. Every packet has a header, and that header has a fixed spot for the sender’s and receiver’s address. Every router and device on the internet reads that header the same way.

If one device suddenly sent 64-bit addresses while another still expected 32-bit ones, they’d misread each other’s packets. Messages would get lost or end up in the wrong place.

So changing the address size means changing the protocol everywhere at once: every router, every device, all around the world. That’s not just a technical challenge. It means getting the whole internet to agree and switch together, which is really hard to pull off.

Because of this, IPv6 was created as the long-term fix.

A Quick Look at IPv6 #

IPv6 uses 128 bits per address instead of 32. That gives about 340 undecillion addresses, a number so big it solves the shortage problem for good. IPv6 also cleans up and improves other parts of the protocol. The catch: every router and device that touches a packet needs to understand IPv6.

That sounds scary, but most routers already support it. IPv6 has been around for more than twenty years. Even so, IPv4 is still everywhere. A big reason is NAT (Network Address Translation), which lets many devices share one IPv4 address and lowers the pressure to switch.

IPv4 versus IPv6 address space, illustrative comparisonA tiny dot represents IPv4's 4.3 billion addresses next to a much larger circle representing IPv6's 340 undecillion addresses, though the real difference is far too large to draw to scale.address space comparison (illustrative, not remotely to scale)IPv42^32 ≈ 4.3 billionIPv62^128 ≈ 340 undecillion
Going from 32 to 128 bits isn't a small bump. It's an almost incomprehensible jump in address space.

What I Think About IPv6 #

I don’t like IPv6 much, and here’s why.

I like IPv4 because it’s simple. An IPv4 address feels like a phone number: short, easy to remember, easy to type. IPv6 addresses are long strings of hexadecimal characters, split by colons instead of dots. That sounds small, but typing a colon means pressing shift, which is just a little more friction every single time.

Now multiply that friction by real life. Try reading an IPv6 address out loud to a coworker on a call. Try spotting the one wrong character in a firewall rule at 2am, when every address on the screen looks like the same wall of hex. Try pasting one into a terminal and watching it wrap across two lines, so half your team copies it wrong anyway. None of this is hard, exactly. It’s just constant, small, and annoying, and it happens every day to the people who actually run networks.

IPv6 even has its own little trick for this: you can write “::” once in an address to skip a run of repeated zero groups, just so the thing is shorter to type. Which is funny, because the whole reason you need a shortcut is that the address was too long to begin with.

I doubt the people who designed IPv6 spend their days typing these addresses into config files, SSH sessions, and firewall rules. The people who do are DevOps, IT, and network engineers, and for them a 128-bit address is just more to deal with, every single day, on top of everything else on their plate. I think that’s the real, unglamorous reason IPv6 still hasn’t fully replaced IPv4 after twenty-plus years. Not politics. Not laziness. Just death by a thousand small paper cuts.

IPv4 versus IPv6 address format lengthAn IPv4 address such as 192.168.1.1 is short, while an equivalent IPv6 address is much longer and written in hexadecimal separated by colons.IPv4192.168.1.1IPv62001:0db8:85a3:0000:0000:8a2e:0370:7334same job, very different amount of typing
Same job, very different amount of typing.

The Real Problem With IPv6 #

IPv6 was built to solve the address shortage once and for all. Jumping from 32 bits to 128 bits does that, but it also makes addresses harder to read, type, and remember for the people who use them daily. IPv6 solved a problem we don’t fully have yet, at the cost of simplicity we already had.

It’s a lot like over-engineering in software in general: you add layers and options for cases that may never happen, and the result is harder to use than the simple version would have been. IPv6 didn’t make a small fix. It replaced the whole system.

IPv6 Makes You Easier to Track #

Here’s something that doesn’t get talked about enough: IPv6 has a privacy problem.

With IPv4, most home and office networks share one public address across every device behind NAT. Your phone, laptop, and smart TV all leave the building looking like the same single address to any website or server on the other end. That’s not privacy by design, it’s just a side effect of running out of addresses, but it works like privacy anyway. A server can’t easily tell your phone from your laptop from your neighbor’s laptop if you’re all sharing the same address.

IPv6 removes that side effect. There are enough addresses for every device on earth to get its own, so there’s no real need for NAT anymore. Each phone, laptop, and smart fridge can carry its own permanent, globally unique address. That address can follow the device from network to network, which means it can work a lot like a tracking ID that travels with you.

IPv4 with NAT hides devices, IPv6 exposes each oneThree devices behind IPv4 and NAT all share one public address, so they look like a single entity from outside. The same three devices on IPv6 each get their own public address, so each one is individually visible from outside.IPv4 + NAT1looks like one device from outsideIPv6every device gets its own address
One shared address hides the crowd. A unique address per device does not.

Early IPv6 made this worse. The standard way to auto-generate an address baked your network card’s MAC address directly into the last part of the IPv6 address. That’s a hardware ID that never changes, sitting in public, in every packet your device sends. Anyone watching traffic across different networks and different days could match up “this device again” without much effort.

There are fixes. Most operating systems now use IPv6 privacy extensions, which rotate the device part of the address every so often so it can’t be used as a long-term fingerprint. But it’s opt-in, or on by default only on some platforms, and it only hides the device. The network you’re on still gets its own address block, so a server can often tell “same household or company” even when it can’t tell “same device.”

I don’t think anyone designing IPv6 set out to make tracking easier. But privacy clearly wasn’t high on the list either. It feels like something that got noticed after the fact and patched over, not something the protocol was built around from day one. Given how much of the internet’s business runs on tracking people, handing out one traceable address per device, worldwide, doesn’t feel like a small footnote. It feels like a real cost that’s easy to skip past when you’re busy being impressed by 340 undecillion addresses.

A Simpler Idea: Address Space Prefixes #

IPv4 needed more addresses. IPv6 solved that by replacing everything. I think there was a middle path: a small change that could have bought IPv4 a lot more time, without asking the whole internet to switch to a new system at once.

What Is an Address Space Prefix? #

Here’s the idea: instead of replacing IPv4 addresses, add a small number in front of them. Call it an Address Space Prefix, or ASP.

Every address in use today would get an implied prefix of 0, so nothing changes for anyone. When the world needs more addresses, we introduce prefix 1. That instantly doubles the address space, from about 4 billion to about 8 billion, using the exact same familiar address format. Need more later? Add prefix 2, and so on.

It’s a bit like adding an area code to a phone number, instead of making every phone number twice as long.

The Address Space Prefix ideaA small prefix number is attached in front of a normal IPv4 address. Prefix 0 is every address in use today. Prefix 1 would open up a whole new set of addresses, using the exact same familiar address format.same familiar address, with a small prefix attached in fronttoday0192.168.1.1later1192.168.1.1
A small prefix in front of the address unlocks a whole new block of addresses, without changing the address itself.

How It Would Fit Into IPv4 #

The IPv4 header already has some reserved space that isn’t used for anything today. That’s exactly where a small prefix number could live.

Old devices that don’t know about ASP would just keep ignoring that reserved space, like they always have, and keep working with prefix-0 addresses as normal. Newer devices could read the prefix and know they’re looking at a different block of addresses. Nothing about the core 32-bit address format has to change.

Why This Is Easier Than IPv6 #

The big difference between ASP and IPv6 is how much has to change, and when.

With IPv6, every router and device eventually needs to understand a completely new, much longer address format, even if it never plans to use one. With ASP, only the networks that actually run out of prefix-0 addresses need to upgrade. Everyone else keeps working exactly as they do today, with the addresses they already know.

Rollout effort: IPv6 versus ASPA grid of eighteen squares represents networks worldwide. For IPv6, all eighteen must change before it works end to end. For ASP, only the few networks that actually need more addresses have to change; the rest keep working exactly as before.IPv618 / 18 networks must changeASP2 / 18 networks changed so far
IPv6 asks everyone to upgrade at once. ASP only asks the networks that actually need more addresses.

A Simple Example #

Say a network runs out of normal IPv4 addresses. Instead of a full switch to IPv6, it could start handing out prefix-1 addresses, maybe written as 1-192.168.1.1. Still short. Still easy to read. Still typed on a normal keyboard, no shift-key gymnastics.

Only that network, and whoever it talks to using prefix-1 addresses, needs to know about the new prefix. The rest of the internet keeps working like nothing happened.

What This Doesn’t Fix #

ASP isn’t a perfect, forever solution like IPv6 claims to be. It buys more time (doubling the address space each time a new prefix is added) rather than solving the shortage permanently.

But I don’t think we need “forever.” We need “enough for a long time, with the least disruption possible.” IPv4 has worked for decades by solving the problem in front of it, not the one 50 years away. ASP keeps that same spirit.

IPv6 is the more complete fix. But a smaller, incremental step like ASP could have kept things simple for a lot longer, and simplicity is exactly what I think IPv4 has going for it.