I am trying to use the Alt-Svc header or HTTP2 frame on a project and I cannot get it working. I have read RFC 7838 and the MDN documentation. The format of the header and goals of the feature are explained but documentation about how it's actually used by browsers/heuristics is very poor it seems. My main service is HTTP2, and the alternative service is also HTTP2, specified by IP and port rather than a domain name. The alternative service is on my local network with ports 80 and 443 forwarded, hairpinning works, and there is no CGNAT.
If I specify a WAN, LAN, or VPN IPv4 address: It works on Firefox perfectly (it doesn't send the Alt-Used header, but can verify by server logs and Wireshark). Chrome and Safari won't even try.
If I specify a GUA IPv6 address: Chrome, Firefox, and Safari will not even attempt to connect to it (verified via Wireshark), but if I manually enter the IP address, I can reach the server. If I use the Chrome network log export and viewer, it does list my domain and the alternative service I specified in the "Alt-Svc" tab. In "Events" I see: HTTP_STREAM_JOB_CONTROLLER_ALT_SVC_FOUND with is_broken = false, but it continues using the original HTTP2 stream. If I wait for the connection to time-out and reload the page it still won't use the alternative service.
I verified at caniuse.com that my browsers are all current enough to support the feature. My certificate is valid. I've tried sending both the HTTP header and the HTTP2 frame. If you have gotten this obscure feature working, I'd love to know what I'm missing.