← Back to context

Comment by MisterMunchkin

1 day ago

I still think we should just extend the length of IPv4. In my proposed system, existing addresses would become a subnet of the new set.

Eg 192.168.0.1 becomes 0.0.0.0.192.168.0.1

And then we dish out all the new address space. You would get the network providers to handle address conversion until software and hardware has been updated. Because all the existing addresses are reserved in the new set, it doesn’t affect them.

Keeps all the nice parts of IPv4, doesn’t require everyone to switch to an entirely new system, backwards compatible with existing hardware/software. Problem solved.

> backwards compatible with existing hardware/software

Absolutely not. Existing IPv4 hardware and software expects addresses to be 4 bytes long. They expect packets to have a 4 byte source address at offset 12 in the header, then a 4 byte destination address at offset 16. Everything breaks if you try to give them a header with an 8 byte source address at offset 12 and an 8 byte destination address at offset 20.

  • > Absolutely not. Existing IPv4 hardware and software expects addresses to be 4 bytes long.

    As does DNS.

    "A" records are fixed at 32 bits, so you have to add a new record type and update all DNS software, plus user-space API/library code and data structures to ask for and store the new record type.

    Just like IPv6.

    There is no "just" adding more addresses: whatever scheme anyone comes up with is the same amount of work as IPv6.

    * https://github.com/becarpenter/misc/blob/main/why6why.md

  • For every complex and difficult problem, someone has an easy, simple and wrong solution. Usually the presence of "just" is a good clue.

  • The set of all ip hardware and software is much much larger than just what currently exists, as it includes all hardware and software that is yet to be produced. Said another way, it’s a foolish consistency.

That would still constitute an entirely new system, just one that looks very like the previous one. So much code and other infrastructure (routing tables in hardware etc.) relies on IPv4 addresses being 32-bits not 64 and that would all need to change, complete with extra new stuff being added for that translation layer while both are in operation (which would end up being near permanent, people will find ways to keep the old stuff running as long as they can). I expect that this new scheme would just become a new version of CGNAT, “Global NAT” perhaps, with the same problems that adds.

IIRC something like that was considered when IPv6 was first being designed, be deemed insufficient for the long-term future. 64-bits is thought to be enough to stave off address starvation though, which is why IPv6 address ranges are usually assigned as /64s (my homer link has a /48 range should I wish to use it all!), so I can see your reasoning on that level.

  • 128 innit? Otherwise your /64 would have no subnets.

    • Yes, the whole address is 128 bits.

      Hence my having a /64 (/48 in fact, should I ever enable more than the current /64) shows that 64-bits is enough for global addressing. If it wasn't then giving me a /64 would be part of a path to creating an address exhaustion problem just like the one with IPv4 (which was exacerbated somewhat by handing out /8 ranges unnecessarily in the early days).

      1 reply →

This is all the bad parts of ipv6 with none of the good parts...

You still need to have routers, clients, and absolutely everything to understand the new scheme to use those new addresses.

  • Not using hex is a plus I guess?

    • Computers use binary. Hex is a human convenience. For anyone in computers hex is much better than decimal for obvious reasons. For anybody not in computers hex makes no sense and I'd need weeks of math lectures (which they wouldn't do the homework for and thus fail) to explain it.

    • Honestly IPv4 addresses should always have been formatted in hex, like FF 00 00 69, with whatever delimiter. Would make it trivial to write directly as a 32-bit int, and parsing and formatting a string would also be cheaper. And you could have funny blocks like CAFE.0.0.

      2 replies →

How does 192.168.0.1 talk to 192.0.0.0.0.168.0.1? Like, literally, how does it make a packet with that destination address?

The entire ipv4 space is already mapped to reserved subsets of ipv6, by the way. e.g. ::ffff:0:0/96 (i.e. 0.0.0.0.0.0.0.0.0.0.255.255.w.x.y.z) or 64:ff9b::/96. v6 devices can already "talk to" v4. The problem is the ipv6 space is obviously not a subset of ipv4, so v4 doesn't have a clean way to talk to or even about v6.

Lots have thoughts on this, few take the time to review the existing implementations/proposals and explain both how it is their approach doesn't run in to the same problems as well as the problems their proposal still doesn't resolve.

Most of the time, this results in people thinking the big problems are one set like "if only there was a way to translate" while the real remaining problems are another set like "and how do you get people to want to transition when it works well enough for those clients in the translated state".

> until software and hardware has been updated

Yeah, about that part. This is a "now draw the rest of the fucking owl" type of idea.

  • It's always the same with those "I hope IPv6 were just IPv4 with more octets" proposals on Hacker News, aka Godwin's law of the Internet Protocol.

    It turns out when you ignore the hardest part of the problem, you can always make a good-looking proposal!

There is barely any legacy hardware/software that doesn't work with IPv6. It's just not an issue.

Dual-stack is also the default, and CG-NAT exists as a fallback. For IPv6 only websites there is still the option to use a HTTP proxy.

  • There's still quite a few pockets of the industry where IPv6 just isn't available. Industrial control systems, for instance - there's lots of PLCs and SCADA software that are still IPv4-only. It's changing slowly, but industrial computing runs on thirty year time scales and there's still a lot of stuff out there that won't even run on modern operating systems. We use 32-bit Windows XP VMs or sometimes even FreeDOS for some of the software we use.

This seems achievable if you can figure out how to fit 64-bits into 32. ;)

  • Kids these days can fit 64-bits into a 3-bit hole, and if you squint hard enough it still sounds like a robot. Amazing times, I tell you.

  • You just drop the top half. Or xor it? That'd make for some nice traffic-pattern art ;)

    Now the reason this doesn't work is that the address length is not encoded, so if you make the address longer, no one knows about it and they [routers and destinations] just assume the wrong address and send it on or discard the frame

>Eg 192.168.0.1 becomes 0.0.0.0.192.168.0.1

How is this different from ::192.168.0.1? :)

  • I can read one at a glance and the other makes me fill in the blanks myself after having to count how many invisible blanks I need to fill in.

    Of all the sins of IPv6, its tied between using ':' as the separator, and the god awful '::' "just skip writing the address because we made them too fucking big lol"

    Wouldn't have been a problem if they hadn't given every square millimeter of the planet 100 billion addresses.

    • You are telling me ::192.168.0.1 is not immediately visible as 16-4 bytes?

      Fine, let's change the question.

      Without counting, how many zeroes are there in 192.168.0.0.0.0.0.1?

      2 replies →

    • > I can read one at a glance and the other makes me fill in the blanks myself after having to count how many invisible blanks I need to fill in.

      The protocol chosen for IPng, SIPP, did actually have "only" 64 bits, but this was deemed not enough as folks did not want to have to worry about running out again (amongst other reasons), and so tweaked it to have a fixed 128 bits:

      * https://datatracker.ietf.org/doc/html/rfc1752

      SIPP originally was variable-length capable, but it was decided fixed-length was better (e.g., for hardware like ASICs).

      > Wouldn't have been a problem if they hadn't given every square millimeter of the planet 100 billion addresses.

      For the record: IPv6 gives 10¹⁷ addresses per mm²; in terms of volume, 10⁸ IPv6 addresses per mm³ throughout the Earth.

      3 replies →

    • My blog's hosted on either 3106689564 or 42540619367231808600192856535952785520 depending on your addressing scheme.

      See, no colons in sight!

      1 reply →

I believe that was proposed before IPv6.

That being said, we should take the time to understand why IPv4 is still hanging around when IPv6 has been around since before most people got internet access. What is really holding IPv6 back?

  • Everything in v6 was for a good reason, but it was targeting now-outdated use cases. Separately, there's no good migration path from v4. They should've kept the v4 address blocks in v6, and following the natural consequences of that, it'd be way easier to migrate. But they didn't do this with v6 because they were trying to solve the address fragmentation issue upfront, which again had valid reasoning but in hindsight wasn't the right move.

> I still think we should just extend the length of IPv4. In my proposed system, existing addresses would become a subnet of the new set.

There is no "just" extending the address length:

      So it's a matter of mathematical and physical fact that to expand
      the address size, you must change the protocol, and that means 
      [three] things immediately:

            You have to change the version number.

            You have to add new code to handle the new version.

      […]

            You need a coexistence technique so that updated systems, 
            with the new protocol, can connect to old systems that know 
            nothing of the new protocol.

      Two minutes of thought show that this third requirement has only 
      two solutions:

            (3A) Dual stack, in which the new machines speak both 
                 the old (IPv4) and new (IPng) protocol.

            (3B) Translation, in which something translates addresses
                 between the old and new protocols.

* https://github.com/becarpenter/misc/blob/main/why6why.md

* https://datatracker.ietf.org/doc/html/rfc1671

> Keeps all the nice parts of IPv4, doesn’t require everyone to switch to an entirely new system, backwards compatible with existing hardware/software. Problem solved.

You have to ship new code to every 'network element' to support your "IPv4+" plan. Just like with IPv6.

You also have to update DNS to create new resource record types ("A" is hard-coded to 32-bits) to support the new longer addresses, and have all user-land code start asking for, using, and understanding the new record replies. Just like with IPv6. (A lot of legacy code did not have room in data structures for multiple reply types: sure you'd get the "A" but unless you updated the code to get the "A+" address (for "IPv4+" addresses) you could never get to the longer with address… just like IPv6 needed code updates to recognize AAAA, otherwise you were A-only.)

You need to update socket APIs to hold new data structures for longer addresses so your app can tell the kernel to send packets to the new addresses. Just like with IPv6. In any 'address extension' plan the legacy code cannot use the new address space; you have to:

* update the IP stack (like with IPv6)

* tell applications about new DNS records (like IPv6)

* set up translation layers for legacy-only code that cannot be update to reach IPv4+-only destination (like IPv6 with DNS64/NAT64, CLAT, etc)

You're updating the exact same code paths in both the "IPv4+" and IPv6 scenarios: dual-stack, DNS, socket address structures, dealing with legacy-only code that is never touched to deal with the larger address space.

"Just adding more bits" means updating a whole bunch of code (routers, firewalls, DNS, APIs, userland, etc) to handle the new data structures. There is no "just": it's the same work for IPv6 as with any other idea.

You could just use something like fd00:dead:beef::192:168:0:1 for your internal IPv4 host(s). Basically do a human-readable mapping of your IPv4 LAN IPs into a IPv6 private space. Now you only need to remember the ULA prefix and then can continue to use your IPv4 just with colons instead dots. Problem solved. :-)

This gets brought up on every ipv6-related submission, and the basic idea is sound. https://news.ycombinator.com/item?id=48781622

  • Not really, it assumes people will make IPv5 devices without a reason to. If you can get them to make IPv5 you can use the same mechanism to get them to make IPv4/6 dual-stack.

    • People already make ipv6 devices, that's not the problem though. It's also maybe possible to do ipv5 with ipv6 hardware at least on the hosts, since the v6 header is totally fine for this.

      2 replies →

You can do this in IPv6

  • Not really. My home IP is 71.177.17.171, how do I get an equivalent v6 that gets routed directly to me? NAT64 and 6to4 don't do this.

    • It's not clear what you're asking for exactly.

      You have 2002:47b1:11ab::/48. If your ISP supports it, packets sent to that /48 will be delivered to you as native v6 packets, otherwise they'll be stuffed into a v4 packet which will be sent to 71.177.17.171. Or there's ::ffff:71.177.17.171 which will reach you using unmodified v4 packets.

      That's two different ways your v4 address is present in v6.

      3 replies →

I recall something like this, what did you call this? ipv8?

the thing is that it does require a switch similar to ipv6. but maybe there’s a subnet that maps 1 to 1 with the legacy block?

something like this could theoretically be pinned onto ipv6 AND anyone could do it, just select a 98 bit prefix you own, and the rest of the 32 bits you can map to ipv4.

phase -1 could be tunneling traffic through a single zone proxy which would be inefficient and is purely conceptual

phase 0 would be the same, but with an anycast ipv6,same ip that resolves differently based on location, like 8.8.8.8

phase 1 would be the mapping prefix to ipv4 (and viceversa?) being distributed to the routing tables like, which could be done via application logic (most efficient), or via some deep arcane isp routing conf files, or just a hell of a lot of routing table entries for each ipv4 but duplicated, possibly programatically controlled by an application that generates router table files as a target, thus avoiding desyncs and effectively becoming the first option of application level implementation

maybe something like this already exists though

of course it’s horrible hacking (as hacking in the non crime sense often is), but it allows for a purely technical solution to issues of political and administrative nature.. which is all the rage nowadays

  • There already is a subnet. Actually a few. ::ffff:192.168.0.1 is reserved for when you need to pass an ipv4 address through an ipv6 API (e.g. v6 client application on a dual-stack OS on a dual-stack network) and 64:ff9b::192.168.0.1 is reserved as an actual address for NAT64 gateways to use (v6-only client, network has a NAT64 gateway somewhere on it)

That was kinda the way IPv5 proposed to handle it.

But the big big problem isn't windows/Linux/mac. Writing drivers for those are "easy".

The problem lies in all the networking gear speaks only IPv4 and/or 6. LLM assisted hacks can get into maintenance areas, but these devices are also built to support the least amount of things. Like, there may not be enough ram or storage to even run it.

And 20 years in, you see how well IPv6 has taken off :eyeroll:

And even on my network, I disabled IPv6. My upstream ISP is doing something that makes '6 unstable, but '4 is fine. And I find most network engineers don't have to maintain '6, so they never really learn it.

  • I thought IPv5 was a protocol designed for telecoms to route voice data over packet networks, though? It wasn't supposed to be a replacement for IPv4.