Hacker News new | ask | show | jobs
by bradfitz 1925 days ago
Yeah, that would be the obvious representation if we were willing to go to 32 bytes. (on 64-bit)

But paying 8x memory cost for IPv4 and 2x for IPv6 was a bit hard to swallow. Especially considering how rare IPv6+zones are.

And we didn't want to have be worse in any regard compared to std's net.IP. If we went to 32 bytes then Go's net.IP would win if you parsed an IP and stored it multiple times. Because we'd be a 32 byte value type and Go would be a 24 byte value type containing a pointer to the shared-for-all-copies address bits. Sure, they'd all be aliasing the same memory (danger zone!) but in Go the culture is to behave and risk that.

But staying at 24 bytes, we're never worse than net.IP and strictly better in all regards. (at least by the metrics we highlighted in the blog post... perhaps not by "don't play unsafe shenanigans with IPv6 zone interning")

2 comments

Fair enough. I agree 8x for IPv4 would be hard to swallow.

In either case, having the interning wrapped up in a reusable library is great.

> Especially considering how rare IPv6+zones are.

Who uses IPv6+zones and why?

I'm confused what zones are about. They don't seem to be part of IPv6 packets. Where do they come from? Why does IP type have to deal with them?

A scoped IPv6 address contains a network interface name, which is used to disambiguate which network a link-local address belongs to.

It’s relatively common to encounter them in some network configurations where the routers use link-local addresses rather than global addresses in their RA packets. They are also used in SLAAC, because a device can configure a link-local address without knowing anything about its environment.

[ I think in the past there might have been an idea to use them to disambiguate site-local IPv6 addresses, but network interfaces are not sufficient in that case, and site-local addresses were problematic in lots of other ways, so they have been dropped from the specifications. ]

This was helpful:

https://en.wikipedia.org/wiki/IPv6_address#Scoped_literal_IP...

Apparently it's possible to embed interface name into an address:

fe80::1ff:fe23:4567:890a%eth2

The article also points to an alternative solution - embed interface index into an address:

fe80:3::1ff:fe23:4567:890a

One answer to "who?" question: https://news.ycombinator.com/item?id=26419035

Still unclear why and where do zones come from.