The very fact that IPv6 adoption actually requires dual-stack IPv4+IPv6 adoption first is the very reason that adoption took such a hugely long time. If IPv6 could have been made backwards compatible somehow (it's probably mathematically impossible) then adoption would have been much faster (just look at HTTP -> HTTP2 -> HTTP3 already).
Thinking about it more, the salient difference is that HTTP->HTTP2->HTTP3 is not a network-level problem to a similar extent (apart from clients and servers, you do have proxies and CDNs that need to support both, but these are far fewer actors, and it's much easier to switch CDN to one that supports HTTPx than it is to switch ISP as a server operator), that is the reason why adoption was much faster.
The only advantage that IPv6 with public IPs behind a firewall has compared to NAT is that each host can use the same port behind the firewall, you don't need a unique port for each host. I don't see this as a major advantage for an end-user (though it is helpful for large internal networks).
The same approach does not work reliably with NAT, mainly because you do not know translated port numbers. It also may fail if both sides are behind the same NAT, as NAT pinning is sometimes not implemented.
It is not hacky, it is essentially how stateful outgoing-only firewall is supposed to work for UDP.
There shouldn't really be any rush to move servers into IPv6, it's end users' ISPs that should. Somehow things are happening completely backwards.
The problem is people who run servers typically pay for their IPs, while people who run clients typically don't. So, as an end-user, I don't care if I have an IPv4 or an IPv6. As someone running a server, I might.
As an ISP, I of course care if I need to acquire more IPv4's to cover all my clients. But, if all the world's servers are IPv4, I still need to provide IPv4 IPs to my clients, even if I run dual stack, so IPv6 is at best an extra cost, it doesn't save me any money.
> IPv6 clients can be backward compatible, servers aren't.
Not sure what you mean. How would an IPv4-only server send a reply packet to an IPv6-only client? There is CGNAT of course, but there we're again in dual-stack territory.
That's the incorrect part. You don't need it. You can translate 6 to 4, it's not exactly CGNAT but it appears exactly the same for the IPv4 servers. That will save you from getting an address to any of your users, only the translation servers need it.
Can it be done without stateful connection tracking?
On the other hand, 6to4 is stateless, so it has that going for it.
https://datatracker.ietf.org/doc/html/draft-ietf-v6ops-trans...
I recall that DJB made pretty much this argument in the distance past when he predicted IPv6 would fail.
Ultimately tunnelling and anycast is the way to do interoperability.
For the inverse direction there is the DNS64+NAT64 combo which works fairly well.
IPv4 to IPv6 is nowhere as simple, IPv6 brings tons of new baggage along with it.
Switching the communication protocol is a local, remote and all the parts in between problem.