<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-martin-retry-over-ipv6-04" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true" consensus="true">

<front>
<title abbrev="retry-over-ipv6">HTTP Signaling of Planned IPv4 Unavailability</title><seriesInfo value="draft-martin-retry-over-ipv6-04" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="F." surname="Martin" fullname="Franck Martin"><organization>Peachymango.org</organization><address><postal><street></street>
</postal><email>franck@peachymango.org</email>
</address></author><date year="2026" month="July" day="28"></date>
<area>art</area>
<workgroup>HTTP Working Group</workgroup>
<keyword>IPv6</keyword>
<keyword>IPv4</keyword>
<keyword>HTTP</keyword>
<keyword>retry</keyword>
<keyword>dual-stack</keyword>
<keyword>Happy Eyeballs</keyword>

<abstract>
<t>As operators transition services to IPv6-only, planned IPv4 outages help identify
remaining dependencies before permanent decommission. Such outages must be
measurable, reversible, and understandable to end users. This document defines
HTTP signaling for an intentional, often time-bounded IPv4 outage: the existing
<tt>503 Service Unavailable</tt> status code together with the mandatory
<tt>Retry-Over-IPv6</tt> response header field (and optional related fields) that
instruct aware clients to retry over IPv6 after closing the IPv4 connection, and
allow clients to confirm successful IPv6 recovery via an optional correlation
token so operators can distinguish soft failures from hard failures in
centralized logs. Machine-readable response bodies MAY use Problem Details
(RFC 9457) with a registered problem type URI. The mechanism supports staged
enterprise rollouts, internal HTTP services, and permanent IPv6-only migration;
coordinated public events (for example, 6/6 drills) remain possible with advance
notice. The primary intended deployment is operator-controlled environments
where provider and users share operational responsibility. Legacy clients that
do not implement this specification treat the response as ordinary service
unavailability and MAY use the response body for human-readable guidance.</t>
</abstract>

<note><name>About This Document</name>
<t>This note is to be removed before publishing as an RFC.</t>
<t>The latest revision of this draft can be found at
<eref target="https://github.com/franckhlmartin/ietf-draft-retry-over-ipv6/">https://github.com/franckhlmartin/ietf-draft-retry-over-ipv6/</eref>.
Status information for this document may be found at
<eref target="https://datatracker.ietf.org/doc/draft-martin-retry-over-ipv6/">https://datatracker.ietf.org/doc/draft-martin-retry-over-ipv6/</eref>.</t>
<t>Discussion of this document takes place primarily on the v6ops Working Group
mailing list (<eref target="mailto:v6ops@ietf.org">mailto:v6ops@ietf.org</eref>), which is archived at
<eref target="https://mailarchive.ietf.org/arch/browse/v6ops/">https://mailarchive.ietf.org/arch/browse/v6ops/</eref>. Subscribe at
<eref target="https://www.ietf.org/mailman/listinfo/v6ops/">https://www.ietf.org/mailman/listinfo/v6ops/</eref>. Expert input is also sought from
the HTTP Working Group (httpbis).</t>
<t>Source for this draft and an issue tracker can be found at
<eref target="https://github.com/franckhlmartin/ietf-draft-retry-over-ipv6">https://github.com/franckhlmartin/ietf-draft-retry-over-ipv6</eref>.</t>
<t>This revision (<tt>-04</tt>) no longer proposes a new HTTP status code. Planned IPv4
unavailability is signaled with <tt>503 Service Unavailable</tt> and
<tt>Retry-Over-IPv6: ?1</tt>. Earlier revisions used a provisional <tt>5NN</tt> / <tt>566</tt>
stand-in; that approach is discussed only as a design alternative.</t>
</note>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>

<section anchor="why-planned-ipv4-outages"><name>Why Planned IPv4 Outages</name>
<t>IPv6 deployment has been validated through coordinated industry events. On
World IPv6 Day (8 June 2011), major content providers enabled IPv6 for 24 hours
to measure brokenness in clients, networks, and middleboxes
<xref target="WORLD-IPV6-DAY"></xref>. World IPv6 Launch (6 June 2012) moved many of those sites
to permanently enabled IPv6 <xref target="WORLD-IPV6-LAUNCH"></xref>. Some participants retained
IPv6; others reverted toward IPv4-only operation until a later 6/6 commitment.
These events tested enabling IPv6; the inverse problem --- identifying what still
breaks when IPv4 is intentionally unavailable --- remains under-specified at the
application layer.</t>
<t>Operators have adopted time-bounded <strong>planned IPv4 outages</strong> as a complement:
deliberately making IPv4 service unavailable for minutes, hours, or days to
expose software, protocol, and operational gaps before irreversible
decommissioning. The IETF meeting network ran an early example at IETF 71
(Philadelphia, March 2008): an IPv6-only wireless network was available
throughout the week, and IPv4 on the main meeting network was disabled for
roughly one hour during the Wednesday plenary on 12 March 2008 so attendees
could use IPv6-only Internet access and surface client stacks, applications,
and services that still depended on IPv4 <xref target="IETF71-IPV4-OUTAGE"></xref>.</t>
<t>Governments are publishing IPv6 transition policies with varying specificity.
The Czech Republic approved a plan for state administration services to stop
providing IPv4 on <strong>6 June 2032</strong> (6/6/2032) <xref target="KONEC-IPV4-CZ"></xref> --- one of the
few published fixed IPv4 end dates. Other governments set phased milestones or
adoption requirements rather than a single shutdown date. The United States
Office of Management and Budget Memorandum M-21-07 <xref target="OMB-M-21-07"></xref> requires
federal agencies to operate at least 20%, 50%, and 80% of IP-enabled assets in
IPv6-only environments by the end of fiscal years 2023, 2024, and 2025
respectively, with strategic intent to phase out IPv4. The Netherlands places
IPv6 on the mandatory &quot;use-or-explain&quot; list for public-sector procurement
<xref target="NL-FS-IPV6"></xref>. Washington State policy EA-04 <xref target="WA-EA-04"></xref> requires state
agencies to migrate infrastructure and applications to IPv6 as IPv4 becomes
unsupported. Such mandates are frequently declared yet only partially met; a
contributing factor may be the absence of standardized, reversible transition
mechanisms at the application layer, which this document aims to address.
Operators facing such deadlines need staged transition mechanisms
--- including time-bounded planned outages, clear user messaging, and measurable
HTTP-layer signals --- long before the final cutover date.</t>
<t>Network-layer IPv4 removal is a poor fit for staged drills:</t>

<ul spacing="compact">
<li>Rollback is hard --- routing, ACL, and DNS changes propagate slowly and are
error-prone under pressure.</li>
<li>Blast radius is all-or-nothing --- withdrawing A records (or equivalent DNS
changes) typically affects every client that resolves the name, or none; there
is no fine-grained way to limit exposure to a canary cohort, percentage of
traffic, or single application while leaving others on IPv4.</li>
<li>End users lack context --- a silent timeout looks like a site outage, not an
IPv4-path policy.</li>
<li>Impact is unmeasured --- without an HTTP-visible signal, operators cannot count
affected clients or quantify business loss (even a small percentage of
requests can be material).</li>
</ul>
<t>HTTP-layer IPv4 outages address these gaps:</t>

<ul spacing="compact">
<li><strong>Easy rollback</strong> --- disable the IPv4-unavailability policy at the load
balancer or origin without waiting for DNS TTL expiry.</li>
<li><strong>Controlled blast radius</strong> --- enable the signal per virtual host, path,
method, or traffic slice at the edge without changing DNS for the whole
authority.</li>
<li><strong>Advance communication</strong> --- site banners, email, and status pages can
reference the same window as <tt>IPv4-Unavailable-Until</tt>.</li>
<li><strong>Clear user messaging</strong> --- a response body explains that IPv4 is
intentionally unavailable, when service may resume, and what the reader can
try next (including an IPv6-only link when published).</li>
<li><strong>Operator metrics</strong> --- count responses that carry <tt>Retry-Over-IPv6: ?1</tt>
and join them with <tt>Retry-Over-IPv6-Recovery</tt> (and optional tokens) in
centralized logs to estimate soft versus hard failure rates.</li>
</ul>
</section>

<section anchor="scope"><name>Scope</name>
<t>HTTP is not the only application protocol on the Internet. This document
addresses HTTP first because it is widely deployed, visible to end users (for
example in browsers), and pervasive in enterprise environments for web
applications, APIs, and microservices behind load balancers. Container
networking, prefix delegation, and CNI configuration are out of scope; this
document defines HTTP signaling only on paths where it is deployed. Operators
<bcp14>MAY</bcp14> apply the same signaling on internal HTTP load balancers, API gateways,
or service-mesh ingress when IPv4 is intentionally unavailable on that hop.
Other protocols might adopt analogous techniques for planned IPv4 outages;
defining those signals is out of scope for this document.</t>
</section>

<section anchor="intended-deployment"><name>Intended Deployment</name>
<t>Operators deploying planned IPv4 outages with this signaling on the <strong>public
Internet</strong> SHOULD do so with care. Public use can annoy users: legacy clients
treat <tt>503 Service Unavailable</tt> as a general outage (and may wait and retry on
IPv4 if <tt>Retry-After</tt> is present), aware clients must close the IPv4 connection
and retry over IPv6, and users on IPv4-only paths see an error even when the
service remains available over IPv6 on other paths. Unannounced
or frequent public drills can increase support load and reputational risk.
Operators SHOULD weigh those effects against the operational value of the
signal, prefer advance notice, and limit duration and frequency where impact on
unrelated users is likely.</t>
<t>When an operator is <strong>obliged</strong> to run a planned IPv4 outage --- for example, a
fixed government cutover deadline, a coordinated industry drill with advance
notice, or an irreversible network-layer change --- HTTP-layer signaling is a
viable <strong>interim</strong> step compared with silent timeouts or DNS-only withdrawal: it
is reversible, measurable, and gives aware clients an explicit retry path.</t>
<t>This mechanism is <strong>primarily intended</strong> for <strong>closed or operator-controlled
environments</strong> where the service provider and the user population are the same
entity or share operational responsibility --- for example, enterprise
intranets, government administration networks, internal API gateways, staging
environments, and microservice deployments where clients are operated by the
same organization. In those settings, operators can communicate maintenance
windows and interpret soft versus hard failure metrics without imposing
unexplained errors on unrelated Internet users. Even so, operators typically
<strong>do not control every application, client, or coding library</strong> deployed in
the environment: vendor software, open-source dependencies, partner
integrations, and third-party SDKs may still prefer IPv4 or lack a shared
retry convention. This document provides a common HTTP signal so those
diverse code bases can coordinate recovery toward IPv6 for the benefit of
adopters of IPv6-only environments.</t>
<t>Public Internet use <bcp14>MAY</bcp14> remain appropriate for time-bounded, widely
communicated events (for example, 6/6 drills) when advance user communication is
proportional to expected impact.</t>
<t>This specification is HTTP-version-agnostic: the status code usage, header
fields, and client behavior apply equally to HTTP/1.1 <xref target="RFC9112"></xref>, HTTP/2
<xref target="RFC9113"></xref>, and HTTP/3 <xref target="RFC9114"></xref>, as they are defined in terms of HTTP
semantics <xref target="RFC9110"></xref>. Wire-format examples use HTTP/1.1 message syntax for
readability.
Implementations MUST determine whether a request was received over IPv4 at the
transport layer (TCP for HTTP/1.1 and HTTP/2, QUIC for HTTP/3), not from the
HTTP version alone.</t>
</section>

<section anchor="technical-motivation"><name>Technical Motivation</name>
<t>Some operators plan to remove or disable IPv4 while retaining IPv6 service.
During migration, maintenance, or decommissioning, a client that connects over
IPv4 may observe connection failures or HTTP errors even though the same origin
remains available over IPv6.</t>
<t>IPv4-only clients cannot switch address families; they need a clear, loggable
explanation that the service no longer supports IPv4 (optionally until a stated
time). Dual-stack clients on networks where Happy Eyeballs <xref target="RFC8305"></xref> selects
IPv4 may treat the failure as a general outage unless the server explicitly
signals that IPv4 is intentionally unavailable and IPv6 should be used instead.</t>
<t>Application-to-application traffic carried over HTTP (for example REST-style
APIs, gRPC, GraphQL, or JSON-RPC) benefits from a machine-readable signal
distinct from connectivity failures on other addresses. For example, a gRPC
client that tries multiple
resolved addresses may surface an error from the first failing attempt, masking
the fact that the meaningful signal was returned on an IPv4 connection.</t>
<t>HTTP APIs behind ingress are a common place to <strong>start</strong> IPv6 transition drills,
especially in operator-controlled environments (see <xref target="intended-deployment"></xref>).
Some application architectures exhibit <strong>asymmetric dual-stack</strong>: dual-stack or
IPv6-capable <strong>north-south</strong> paths (clients to ingress) alongside IPv4-only
<strong>east-west</strong> paths (ingress to pods, service-to-service calls, or background
workers). Planned IPv4 outages at the HTTP layer help find client and partner
dependencies; they may <strong>miss</strong> internal-only IPv4 unless the same policy is
also applied on internal HTTP entry points (see <xref target="split-stack-deployments"></xref>).</t>
</section>

<section anchor="requirements-language"><name>Requirements Language</name>
<t>The key words &quot;<bcp14>MUST</bcp14>&quot;, &quot;<bcp14>MUST NOT</bcp14>&quot;, &quot;<bcp14>REQUIRED</bcp14>&quot;, &quot;<bcp14>SHALL</bcp14>&quot;,
&quot;<bcp14>SHALL NOT</bcp14>&quot;, &quot;<bcp14>SHOULD</bcp14>&quot;, &quot;<bcp14>SHOULD NOT</bcp14>&quot;, &quot;<bcp14>RECOMMENDED</bcp14>&quot;,
&quot;<bcp14>NOT RECOMMENDED</bcp14>&quot;, &quot;<bcp14>MAY</bcp14>&quot;, and &quot;<bcp14>OPTIONAL</bcp14>&quot; in this document are to be
interpreted as described in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when,
they appear in all capitals, as shown here.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>This document uses terms from <xref target="RFC9110"></xref>. Additional terms:</t>
<t><strong>Authority</strong>: The host and port derived from the target URI.</t>
<t><strong>Planned IPv4 outage</strong>: An operator-initiated period during which IPv4 HTTP
service for an authority is intentionally unavailable while IPv6 service is
expected to remain available.</t>
<t><strong>Aware client</strong>: A client implementation that supports the mechanisms defined
in this document.</t>
<t><strong>Legacy client</strong>: A client that does not implement this document.</t>
<t><strong>Soft failure</strong>: A client receives <tt>503 Service Unavailable</tt> with
<tt>Retry-Over-IPv6: ?1</tt> over IPv4 and subsequently completes the same request
successfully over IPv6. Soft and hard failure classification is <strong>per aware
client and per signaling hop</strong> (the entity that returned the signal), not
end-to-end application success. A soft failure does not guarantee that
downstream processing (for example, origin work reached over an IPv4-only pod
network) succeeded.</t>
<t><strong>Hard failure</strong>: A client receives <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> over IPv4
but cannot successfully complete the request over IPv6.</t>
<t><strong>IPv4-unavailability signal</strong>: A <tt>503 Service Unavailable</tt> response that
includes <tt>Retry-Over-IPv6: ?1</tt>, sent only on an IPv4 client-facing connection
when IPv6 service for the authority is expected to remain available.</t>
</section>
</section>

<section anchor="overview"><name>Overview</name>
<t>When IPv4 service is intentionally unavailable for an authority, the responding
entity that receives a request over IPv4 sends:</t>

<ol spacing="compact">
<li><strong><tt>503 Service Unavailable</tt></strong> --- the IPv4 path is unavailable; this is not
a general outage if IPv6 is expected to work. The status alone is ambiguous
with overload or maintenance that affects all address families; the header
fields below distinguish planned IPv4 unavailability.</li>
<li><strong><tt>Retry-Over-IPv6: ?1</tt></strong> (<strong>mandatory</strong> on this signal) --- the client
should retry the same request over IPv6. This field is the primary
machine-readable trigger for aware clients.</li>
<li><strong><tt>IPv4-Unavailable-Until</tt></strong> (optional) --- when IPv4 service may be restored.</li>
<li><strong><tt>Retry-Over-IPv6-Token</tt></strong> (optional, on the IPv4-unavailability response)
and <strong><tt>Retry-Over-IPv6-Recovery</tt></strong> (on a successful IPv6 retry) --- optional
telemetry so operators can correlate soft failures across load-balanced
backends.</li>
<li>A <strong>response body</strong> (RECOMMENDED) --- human-readable guidance and/or
Problem Details <xref target="RFC9457"></xref> with the registered problem type for IPv4
unavailability (see <xref target="response-body"></xref>).</li>
</ol>
<t>The responding entity <bcp14>MUST</bcp14> send this signal only when the request was
received over an IPv4 transport connection on the client-facing path (see
<xref target="server-and-operational-considerations"></xref>).</t>
<t>Clients that do not implement this specification treat the response as ordinary
<tt>503 Service Unavailable</tt> (Section 15.6.4 of <xref target="RFC9110"></xref>). Operators SHOULD
include a response body explaining the IPv4 outage for human readers and for
logging by generic HTTP clients. Aware clients MUST key retry behavior on
<tt>Retry-Over-IPv6: ?1</tt>, not on the <tt>503</tt> status alone (see <xref target="retry-over-ipv6"></xref>
and <xref target="client-requirements"></xref>).</t>
</section>

<section anchor="design-alternatives"><name>Design Alternatives Considered</name>
<t>This section is informative. It summarizes approaches considered for signaling
planned IPv4 unavailability and explains why this document uses <tt>503 Service
Unavailable</tt> with <tt>Retry-Over-IPv6</tt> and related fields, plus Problem Details
with a registered type URI.</t>

<section anchor="new-status-code-5nn-566"><name>New Status Code (5NN / 566)</name>
<t>Earlier revisions of this document proposed a new 5xx status code (<tt>5NN</tt>, with
interim tests using <tt>566</tt>) analogous to <tt>505 HTTP Version Not Supported</tt>
(Section 15.6.6 of <xref target="RFC9110"></xref>): refuse to complete the request on the path
characteristic the client used (here, IPv4). A dedicated code would appear as a
distinct bucket in status-only metrics (for example Prometheus label
<tt>status=&quot;566&quot;</tt>).</t>
<t>HTTP status codes are a scarce, generic resource (Section 16.2.2 of
<xref target="RFC9110"></xref>). They are potentially applicable to any resource, not one
operational practice. Where the primary deployment is closed or
operator-controlled and only aware clients change behavior, registering a new
code mainly for log or dashboard convenience puts unreasonable pressure on the
status code registry. Unaware clients treat an unrecognized 5xx as <tt>500
Internal Server Error</tt> and still do not switch address family. Aware clients
need the header-defined retry semantics either way. This document therefore
does <strong>not</strong> register a new status code.</t>
</section>

<section anchor="existing-503-with-retry-after-only"><name>Existing 503 with Retry-After Only</name>
<t><tt>503 Service Unavailable</tt> with <tt>Retry-After</tt> (Sections 15.6.4 and 10.2.3 of
<xref target="RFC9110"></xref>) tells the client to wait, then make a follow-up request. That
encodes delay-then-retry on the same path, not an immediate switch to IPv6.
Using <tt>Retry-After</tt> as the IPv6-retry or outage-end signal teaches the wrong
behavior. This document uses <tt>IPv4-Unavailable-Until</tt> for the planned IPv4
window and keeps <tt>Retry-After</tt> optional only for legacy clients that wait on
IPv4 (see <xref target="ipv4-unavailable-until"></xref>).</t>
</section>

<section anchor="existing-500-with-descriptive-body-only"><name>Existing 500 with Descriptive Body Only</name>
<t><tt>500 Internal Server Error</tt> with a human-readable body does not provide
structured address-family retry semantics. It also misframes an intentional
policy as an unexpected server fault. Bodies alone are a poor machine trigger:
clients often decide retry policy before parsing content, and operators also
need HTML or plain text for browsers.</t>
</section>

<section anchor="dedicated-media-type-without-headers"><name>Dedicated Media Type without Headers</name>
<t>A media type such as <tt>application/ipv4-unavailable+json</tt> could carry structured
fields in the body. Content-Type identifies the format of the representation; it
does not by itself trigger protocol behavior. Many clients act on status and
header fields before reading a body; bodies may be empty, stripped, or not
buffered. Human-facing <tt>text/html</tt> responses would lose machine signaling unless
JSON were mandatory. Recovery telemetry still needs a request header to echo a
token. This document therefore keeps response headers as the control plane and
uses <tt>application/problem+json</tt> with a registered problem <tt>type</tt> URI for
API-oriented bodies (see <xref target="response-body"></xref>), rather than minting a dedicated
media type.</t>
</section>

<section anchor="alt-3xx-redirect"><name>Redirect (3xx)</name>
<t>A <tt>3xx</tt> (Redirection) response with a <tt>Location</tt> URI (Section 15.4 of
<xref target="RFC9110"></xref>) is a poor fit. There is no standard URI flag meaning &quot;resolve this
name for IPv6 only&quot; on a dual-stack hostname; redirecting to the same name risks
an infinite loop or repeated IPv4 selection under Happy Eyeballs. Redirecting to
a distinct IPv6-only-reachable hostname requires DNS and certificate operations
that remain optional for human messaging in the body, not a prerequisite for
machine retry of the same target URI. For IPv4-only clients, a redirect to an
IPv6-only name typically becomes a connection or name-resolution failure rather
than a stable HTTP error with a representation.</t>
</section>

<section anchor="alt-421"><name>Misdirected Request (421)</name>
<t><tt>421 Misdirected Request</tt> (Section 15.5.20 of <xref target="RFC9110"></xref>) rejects a request
when connection context is inappropriate and allows retry on a different
connection. It is defined for HTTP origin routing and connection coalescing
(Section 7.4 of <xref target="RFC9110"></xref>), not for intentional IPv4 path withdrawal.
Reusing it risks confusion with existing HTTP/2 deployments and still requires
IPv6-specific header fields.</t>
</section>

<section anchor="chosen-approach"><name>Chosen Approach</name>
<t>This document uses:</t>

<ul spacing="compact">
<li><strong><tt>503 Service Unavailable</tt></strong> as the status code (already registered;
maps cleanly in many stacks, including gRPC HTTP-to-RPC mapping);</li>
<li><strong><tt>Retry-Over-IPv6: ?1</tt></strong> as the mandatory machine trigger for address-family
retry;</li>
<li>optional <strong><tt>IPv4-Unavailable-Until</tt></strong>, <strong><tt>Retry-Over-IPv6-Token</tt></strong>, and
<strong><tt>Retry-Over-IPv6-Recovery</tt></strong> for window and soft/hard failure telemetry; and</li>
<li><strong><tt>application/problem+json</tt></strong> with a registered problem type URI for
machine-readable bodies, without a new status code or dedicated media type.</li>
</ul>
<t>Aware clients MUST NOT treat every <tt>503</tt> as an IPv4-unavailability signal ---
only those with <tt>Retry-Over-IPv6: ?1</tt> on an IPv4 connection.</t>
</section>
</section>

<section anchor="using-503"><name>Using 503 for Planned IPv4 Unavailability</name>
<t>A planned IPv4-unavailability response uses the <tt>503 Service Unavailable</tt>
status code (Section 15.6.4 of <xref target="RFC9110"></xref>) together with
<tt>Retry-Over-IPv6: ?1</tt>. The combination indicates that the responding entity is
intentionally not offering the requested service over IPv4 for this authority,
while service over IPv6 is expected to be available. The client SHOULD retry
the same request to the same target URI using IPv6 if IPv6 connectivity is
available.</t>
<t>This signal applies when the responding entity received the request over IPv4.
It MUST NOT be used to indicate general server overload or maintenance that
affects all address families unless <tt>Retry-Over-IPv6: ?1</tt> is also appropriate
--- in the ordinary overload case, omit <tt>Retry-Over-IPv6</tt> so aware clients do
not force an IPv6 retry for an address-family-independent outage. The signal is
generally inappropriate on the IPv4 loopback interface (see
<xref target="when-to-send-signal"></xref>).</t>
<t>By default, the signal applies only to the request corresponding to the response
in which it occurs. It does not by itself invalidate other in-flight or future
requests to the authority. Aware clients MAY prefer IPv6 for subsequent
connections as described in <xref target="client-requirements"></xref>; that preference is client
policy.</t>

<section anchor="relationship-to-retry-after"><name>Relationship to Retry-After</name>
<t><tt>Retry-After</tt> on a <tt>503</tt> response suggests how long the client ought to wait
before a follow-up request (Section 10.2.3 of <xref target="RFC9110"></xref>). That is the wrong
primary control for planned IPv4 unavailability: aware clients SHOULD retry
over IPv6 promptly, not wait for IPv4 to return.</t>
<t><tt>IPv4-Unavailable-Until</tt> marks the end of the planned IPv4 window (see
<xref target="ipv4-unavailable-until"></xref>). Operators MAY also send <tt>Retry-After</tt> so legacy
clients that only understand <tt>503</tt> delay before retrying on IPv4; aware clients
MUST prefer <tt>Retry-Over-IPv6</tt> and <tt>IPv4-Unavailable-Until</tt> over inferring
address-family retry from <tt>Retry-After</tt>.</t>
</section>

<section anchor="cacheability-and-intermediaries"><name>Cacheability and Intermediaries</name>
<t>Intermediaries and caches MUST NOT transform an IPv4-unavailability response
into a successful response. Caching is governed by normal HTTP cache rules
<xref target="RFC9111"></xref>; operators SHOULD send <tt>Cache-Control: private, no-store</tt> when
responses are generated dynamically based on the client-facing address family
(see <xref target="security-considerations"></xref>).</t>
<t>A <tt>503</tt> response MUST NOT disallow content. The response MAY include a
representation and SHOULD include one for human guidance (see <xref target="response-body"></xref>).
Any representation explains the IPv4 outage; an optional IPv6-only-reachable
alternate URI in the body is informational and does not redefine the identity
of the original target resource (Section 6.4.2 of <xref target="RFC9110"></xref>).</t>
<t>An IPv4-unavailability response MUST include <tt>Retry-Over-IPv6</tt> with value
<tt>?1</tt>. It MAY include <tt>IPv4-Unavailable-Until</tt>, a response body, and
<tt>Retry-Over-IPv6-Token</tt>.</t>
</section>

<section anchor="example"><name>Example</name>

<sourcecode type="http"><![CDATA[HTTP/1.1 503 Service Unavailable
Retry-Over-IPv6: ?1
IPv4-Unavailable-Until: Sun, 07 Jun 2026 00:00:00 GMT
Retry-Over-IPv6-Token: "a1b2c3d4e5f6"
Content-Type: application/problem+json
Cache-Control: private, no-store

]]></sourcecode>
</section>
</section>

<section anchor="response-header-fields"><name>Response Header Fields</name>

<section anchor="retry-over-ipv6"><name>Retry-Over-IPv6</name>
<t>The <tt>Retry-Over-IPv6</tt> response header field indicates that the client should
retry the same request over IPv6.</t>

<section anchor="syntax"><name>Syntax</name>
<t>The field value is a Boolean (see <xref target="RFC9651"></xref>):</t>

<sourcecode type="abnf"><![CDATA[Retry-Over-IPv6 = "Retry-Over-IPv6" OWS ":" OWS boolean
boolean         = "?0" / "?1"
]]></sourcecode>
<t>On IPv4-unavailability responses defined by this document, the value <bcp14>MUST</bcp14>
be <tt>?1</tt>. Ordinary <tt>503</tt> responses that indicate overload or maintenance affecting
all address families MUST NOT include <tt>Retry-Over-IPv6: ?1</tt>.</t>
</section>

<section anchor="semantics"><name>Semantics</name>
<t>When a client receives <tt>Retry-Over-IPv6: ?1</tt>, it SHOULD retry the same request
to the same target URI using IPv6 transport if IPv6 connectivity is available,
but only if the response was received on an IPv4 connection. If the client
already used IPv6 for that attempt, it MUST NOT retry solely because of this
header field.</t>
<t>The header field conveys intent only. It does not guarantee that a retry over
IPv6 will succeed.</t>
<t>This header field is a response header field as defined in Section 6.3 of
<xref target="RFC9110"></xref>.</t>
</section>
</section>

<section anchor="ipv4-unavailable-until"><name>IPv4-Unavailable-Until</name>
<t>The <tt>IPv4-Unavailable-Until</tt> response header field indicates the time after
which IPv4 service for this authority may be restored.</t>

<section anchor="syntax-1"><name>Syntax</name>

<sourcecode type="abnf"><![CDATA[IPv4-Unavailable-Until = "IPv4-Unavailable-Until" OWS ":"
                          OWS HTTP-date
]]></sourcecode>
<t><tt>HTTP-date</tt> is defined in Section 5.6.7 of <xref target="RFC9110"></xref>.</t>
</section>

<section anchor="semantics-1"><name>Semantics</name>
<t>For a permanent IPv6-only transition, this field MAY be omitted; permanence
SHOULD be stated in the response body instead.</t>
<t>This field is informational for logging and client caching. It does not mean
the client should wait until that time before retrying over IPv6 --- the IPv6
retry SHOULD happen promptly (subject to the client algorithm in
<xref target="client-requirements"></xref>).</t>
<t><tt>IPv4-Unavailable-Until</tt> differs from <tt>Retry-After</tt> <xref target="RFC9110"></xref>: <tt>Retry-After</tt>
indicates how long to wait before a follow-up request in overload or rate-limit
scenarios, while <tt>IPv4-Unavailable-Until</tt> marks the end of a planned IPv4
unavailability window.</t>
<t>Operators MAY also send <tt>Retry-After</tt> for legacy clients that do not understand
this signal or <tt>IPv4-Unavailable-Until</tt>.</t>
</section>
</section>

<section anchor="retry-over-ipv6-token"><name>Retry-Over-IPv6-Token</name>
<t>The <tt>Retry-Over-IPv6-Token</tt> response header field carries an opaque token that
a client MAY echo on a subsequent successful IPv6 retry so operators can
correlate an IPv4-unavailability response with a recovery in centralized logs.</t>

<section anchor="syntax-2"><name>Syntax</name>

<sourcecode type="abnf"><![CDATA[Retry-Over-IPv6-Token = "Retry-Over-IPv6-Token" OWS ":"
                        OWS quoted-string
]]></sourcecode>
<t><tt>quoted-string</tt> is defined in Section 5.6.4 of <xref target="RFC9110"></xref>.</t>
</section>

<section anchor="semantics-2"><name>Semantics</name>
<t>The token is opaque to the client. The client MUST NOT interpret its internal
structure.</t>
<t>Tokens SHOULD be short-lived (on the order of minutes, and not extending beyond
<tt>IPv4-Unavailable-Until</tt> when that header is present). Deployments SHOULD use
stateless tokens verifiable or loggable by any node in a load-balanced fleet
without session affinity to a particular origin server.</t>
<t>This header is RECOMMENDED on IPv4-unavailability responses when operators want
pairwise signal-to-recovery correlation across backends.</t>
</section>
</section>

<section anchor="legacy-client-compatibility"><name>Legacy Client Compatibility</name>
<t>Legacy clients that do not implement this document might still benefit from:</t>

<ul spacing="compact">
<li><tt>Retry-After</tt> with seconds until the outage ends.</li>
<li><tt>Cache-Control: no-store</tt> on dynamically generated outage responses.</li>
<li>A response body with plain language (see <xref target="response-body"></xref>).</li>
</ul>
<t>Aware clients MUST prefer <tt>Retry-Over-IPv6</tt> and <tt>IPv4-Unavailable-Until</tt> over
inferring outage semantics from the body or from <tt>503</tt> alone.</t>
</section>
</section>

<section anchor="request-header-fields"><name>Request Header Fields</name>

<section anchor="retry-over-ipv6-recovery"><name>Retry-Over-IPv6-Recovery</name>
<t>The <tt>Retry-Over-IPv6-Recovery</tt> request header field allows an aware client to
confirm that a successful request over IPv6 is the retry following an IPv4-unavailability signal (<tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt>) received over IPv4.</t>

<section anchor="syntax-3"><name>Syntax</name>

<sourcecode type="abnf"><![CDATA[Retry-Over-IPv6-Recovery = "Retry-Over-IPv6-Recovery" OWS ":"
                           OWS "recovered"
                           *( OWS ";" OWS recovery-param )
recovery-param           = token "=" ( token / quoted-string )
]]></sourcecode>
<t>The only recovery parameter defined by this document is <tt>token</tt>, whose value
SHOULD be copied from <tt>Retry-Over-IPv6-Token</tt> on the prior IPv4-unavailability response.</t>
</section>

<section anchor="semantics-3"><name>Semantics</name>
<t>The field value <tt>recovered</tt> means: the responding entity previously returned
<tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> on an IPv4 connection for this
logical request attempt, and this request is the successful retry over IPv6.</t>
<t>The client MUST send this header on the first successful IPv6 request that
follows such a response for the same target URI. The client MUST NOT send it on
every subsequent request to the authority.</t>
<t>The client MUST NOT send this header to unrelated origins. The header MUST NOT
contain personally identifiable information.</t>
<t>There is no failure variant defined in this document. If the IPv6 connection
attempt fails before any HTTP response is received, the client cannot report that
failure in-band to the origin during a full IPv4 outage.</t>
</section>

<section anchor="connection-lifecycle"><name>Connection Lifecycle</name>
<t>In typical implementations, a client does not keep the IPv4 connection open while
also retrying the same request over IPv6. Maintaining both connections in
parallel for one logical request increases operational complexity (connection
state, cancellation, and handling of duplicate or late responses) and is
therefore uncommon.</t>
<t>For this reason, <tt>Retry-Over-IPv6-Recovery</tt> is carried on the <strong>IPv6</strong> retry
request. Operators <bcp14>MUST NOT</bcp14> expect recovery signaling on the IPv4
connection that received <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt>.</t>
<t>A typical sequence is:</t>

<ol spacing="compact">
<li>Receive <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> (and optional <tt>Retry-Over-IPv6-Token</tt>) on IPv4.</li>
<li>Close or abandon the IPv4 connection.</li>
<li>Open a new connection over IPv6 and retry the same request.</li>
<li>On success, include <tt>Retry-Over-IPv6-Recovery</tt> on that IPv6 request.</li>
</ol>
</section>

<section anchor="cross-backend-logging"><name>Cross-Backend Logging</name>
<t>In load-balanced deployments, the IPv4-unavailability response and the recovery request often
reach different origin servers. Correlation is an operator responsibility:</t>

<ul spacing="compact">
<li>Log IPv4-unavailability events (<tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt>) with <tt>Retry-Over-IPv6-Token</tt> at the edge, load balancer, or
origin.</li>
<li>Log <tt>Retry-Over-IPv6-Recovery</tt> (and echoed <tt>token</tt>) at the same aggregation
tier when possible.</li>
<li>Join events off-box by token across all backend logs.</li>
</ul>
<t>Operators SHOULD NOT assume that the origin server that emitted the signal will
receive the recovery report.</t>
<t>Without tokens, operators MAY compare aggregate IPv4-unavailability counts with aggregate
recovery counts over an outage window; this yields ratio estimates only, not
per-session pairing.</t>
</section>

<section anchor="interaction-with-happy-eyeballs"><name>Interaction with Happy Eyeballs</name>
<t>Implementations using the connection establishment algorithm in <xref target="RFC8305"></xref>
MAY attempt IPv4 and IPv6 connections in parallel, with staggered starts.
That specification assumes a destination-address preference that favors IPv6
(Section 2 of <xref target="RFC8305"></xref>): for example, a <strong>Resolution Delay</strong> before acting
on an early <tt>A</tt> response so an <tt>AAAA</tt> response can arrive, and interleaving of
address families when connection attempts begin. Implementations MAY adapt those
delays when local policy differs, and Section 4 of <xref target="RFC8305"></xref> permits
address sorting that reflects measured round-trip times or prior use --- in
practice, some stacks therefore make a <strong>best effort to prefer IPv6</strong>, while
others under some network conditions will <strong>attempt IPv4 earlier or more
often</strong> than a strict IPv6-first policy would suggest.</t>
<t>Happy Eyeballs defines <strong>connection-establishment</strong> success, not
application-layer HTTP success. Section 5 of <xref target="RFC8305"></xref> treats a connection attempt as
successful when the transport handshake completes (generally TCP), then
<strong>SHOULD cancel</strong> other in-flight connection attempts that have not yet
succeeded. Section 9 of <xref target="RFC8305"></xref> states that Happy Eyeballs handles failures
at the TCP/IP layer only; Section 9.2 explicitly notes that the application
(for example, TLS or <strong>HTTP</strong>) may not be operational on every resolved address.
<strong>RFC 8305 does not specify that an HTTP <tt>5xx</tt> response on one connection
counts as failure for all parallel connection attempts.</strong> A <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> is an HTTP response on an already-established
connection; handling it --- including whether to retry over the other address
family --- is <strong>outside</strong> the Happy Eyeballs connection-race algorithm and is
left to the HTTP client or application.</t>
<t>Implications for this document:</t>

<ul spacing="compact">
<li>If IPv6 completes the transport handshake and delivers a successful HTTP
response first, the client MAY cancel the IPv4 attempt before the signal is
received. No <tt>Retry-Over-IPv6-Recovery</tt> is sent. Signal counts may
under-represent total exposure --- this is often the desired outcome during an
outage.</li>
<li>The client MUST send <tt>Retry-Over-IPv6-Recovery</tt> only if it fully received
<tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> on an IPv4 connection for this
logical request attempt.</li>
<li>If IPv6 already succeeded for this logical request attempt at the HTTP
layer, the client MUST NOT treat a late or abandoned IPv4-unavailability signal as requiring
another IPv6 retry or recovery signal --- regardless of how Happy Eyeballs
raced the underlying connections.</li>
<li>An aware client that receives the signal only on IPv4 and has not yet succeeded
over IPv6 MUST apply the IPv6 retry requirements in <xref target="ipv6-retry"></xref>; that
behavior is an HTTP-layer extension beyond <xref target="RFC8305"></xref>.</li>
</ul>

<section anchor="happy-eyeballs-specification-versions"><name>Happy Eyeballs Specification Versions</name>
<t>All published Happy Eyeballs specifications operate at connection establishment
only. <xref target="RFC6555"></xref> defined the original dual-stack racing algorithm; <xref target="RFC8305"></xref>
obsoletes it with parallel <tt>A</tt> and <tt>AAAA</tt> queries, address interleaving, a
Connection Attempt Delay (recommended 250 ms), and caching of the successful
address family (Section 5.2). Work on a Version 3 algorithm adds SVCB/HTTPS
resource records and QUIC/TCP interleaving (<xref target="HEV3"></xref>) but still does not define
HTTP status handling. None of these specifications treats an HTTP 4xx or 5xx
response on one established connection as failure for other parallel connection
attempts (Section 9.2 of <xref target="RFC8305"></xref>).</t>
<t>Typical outcomes when IPv4 returns <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> during a Happy Eyeballs race:</t>

<ul spacing="compact">
<li>IPv6 delivers a successful HTTP response first --- the IPv4 attempt may be
cancelled before the signal is received; no recovery signal is needed.</li>
<li>IPv4 wins the transport race and returns the signal before IPv6 connects --- other
attempts are likely already cancelled; an aware client MUST still apply
<xref target="ipv6-retry"></xref>.</li>
<li>Both connections are up --- completion order at the HTTP layer determines
whether a late IPv4 signal requires further action (see above).</li>
</ul>
</section>

<section anchor="common-client-stack-behavior"><name>Common Client Stack Behavior</name>
<t>This subsection is informative. Major HTTP clients do not automatically retry
over IPv6 on <tt>503</tt> with <tt>Retry-Over-IPv6</tt>, or unknown 4xx/5xx codes
unless they implement this specification or application-specific logic.</t>
<t><strong>Web browsers.</strong> Chromium and Firefox implement Happy Eyeballs (<xref target="RFC8305"></xref> or
successor algorithms) at the transport layer: the first successful TCP/TLS or
QUIC handshake cancels other in-flight attempts. Neither browser automatically
resends a request over the other address family because of an HTTP <tt>503</tt> response with <tt>Retry-Over-IPv6</tt>. Chromium does automatically resend in some other cases (for
example <tt>421 Misdirected Request</tt>, certain connection errors on reused sockets,
and limited HTTP/2 or QUIC protocol retries); those paths are unrelated to
IPv4-unavailability signaling.</t>
<t><strong>gRPC.</strong> Name resolution and load balancing (for example <tt>pick_first</tt> or
<tt>round_robin</tt>) select among resolved addresses at connect time. Default gRPC
retry behavior covers only uncommitted transparent retries; configured retry
policies typically list <tt>UNAVAILABLE</tt> as a retryable code
(<xref target="GRPC-HTTP-MAPPING"></xref>). That mapping lists <tt>503 Service Unavailable</tt> (and
selected gateway and overload responses) as <tt>UNAVAILABLE</tt> but maps unknown
status codes to <tt>UNKNOWN</tt>. gRPC implementations that support this document
SHOULD honor <tt>Retry-Over-IPv6</tt> before treating multi-address <tt>UNAVAILABLE</tt> errors
as hard failures or blindly retrying the same address list (see <xref target="grpc-and-other-http-apis"></xref>).</t>
<t><strong>Rest.li and similar HTTP API frameworks.</strong> Client-side retry in Rest.li-style
deployments is oriented toward failover to a different host in a cluster (for
example after <tt>503 Service Unavailable</tt> from overload detection), not toward
switching address family on the same hostname. Arbitrary 4xx or 5xx responses
surface as application errors unless the framework or operator configures
explicit retry rules.</t>
<t>Because none of these stacks substitutes for the IPv6 retry behavior in
<xref target="ipv6-retry"></xref>, operators deploying planned IPv4 outages SHOULD NOT assume that
Happy Eyeballs or generic HTTP client libraries will recover automatically.</t>
<t>Operators interpreting IPv4-unavailability and recovery metrics during planned outages SHOULD
account for Happy Eyeballs transport racing and for the fact that HTTP status
codes are not part of the RFC 8305 success definition.</t>
</section>
</section>

<section anchor="example-1"><name>Example</name>

<sourcecode type="http"><![CDATA[GET /api/v1/resource HTTP/1.1
Host: example.com
Retry-Over-IPv6-Recovery: recovered; token="a1b2c3d4e5f6"

]]></sourcecode>
</section>
</section>
</section>

<section anchor="response-body"><name>Response Body</name>
<t>IPv4-unavailability responses SHOULD include a body explaining the planned IPv4 outage
for legacy clients and human readers.</t>
<t>Operators SHOULD make the body as clear as possible for non-technical readers.
The body SHOULD NOT assume that the reader understands IPv4, IPv6, or the
difference between them. The body SHOULD NOT assume that the reader can resolve
the problem themselves (for example, by changing browser or device settings).
The body SHOULD briefly explain, in plain language, that the Internet is
transitioning to a newer protocol generation (IPv6) and that this service may
not be reachable over the older generation (IPv4) on the reader's network path.
When an IPv6-only-reachable alternate URI is published (see
<xref target="ipv6-only-reachable-alternate-site"></xref>), the body SHOULD present that link before
suggesting external help: some dual-stack clients keep selecting IPv4 under
Happy Eyeballs <xref target="RFC8305"></xref> even when IPv6 would work (see
<xref target="interaction-with-happy-eyeballs"></xref>).
The body SHOULD NOT imply that the Internet service provider (ISP) is
necessarily at fault, and SHOULD NOT urge every reader to open a provider
support ticket: the cause may be the network, the device, or client software
that prefers the older connection. When further help is appropriate, the body
MAY suggest trying another browser or device, contacting organization IT if
available, and contacting the ISP only after those steps if the reader still
needs help checking whether IPv6 works on their connection.
Before suggesting ISP contact, the body MAY invite the reader to check whether
they have working IPv6 connectivity --- for example by visiting a &quot;what is my
IP&quot; service that reports an IPv6 address, or an IPv6 evaluation site such as
<xref target="TEST-IPV6"></xref>. Operators that include a third-party diagnostic URI SHOULD pick
a stable, brand-neutral service they are willing to recommend, and SHOULD NOT
treat that check as proving the ISP is at fault when the result is mixed (for
example IPv6 works on a test site but Happy Eyeballs still selects IPv4 for
the dual-stack name). When <tt>IPv4-Unavailable-Until</tt> is present, the body SHOULD
state when service over the older connection may resume in plain language.</t>

<section anchor="ipv6-only-reachable-alternate-site"><name>IPv6-Only-Reachable Alternate Site</name>
<t>When an operator publishes a <strong>distinct hostname or URI that is
IPv6-only-reachable</strong> --- for example, a name with AAAA records and no usable
A records, or where IPv4 is deliberately not served --- and that name has a
valid certificate for HTTPS, the response body <bcp14>SHOULD</bcp14> include a clear
human-readable link to that URI. For example, an IPv4-unavailability response for
<tt>https://www.example.com/</tt> MAY point users to
<tt>https://ipv6.example.com/</tt> when the latter is IPv6-only-reachable.</t>
<t>This link is intended for end users when Happy Eyeballs or other connection
selection keeps preferring IPv4 on the original dual-stack name: refreshing the
same hostname may not establish IPv6, while opening an IPv6-only hostname can
force a native IPv6 path. The alternate URI MUST identify a resource the
operator intends users to visit (same organization or otherwise expected
destination). Operators MUST NOT use this guidance as a license for open
redirects to unrelated third parties.</t>
<t>Aware clients and automated HTTP clients <bcp14>MUST NOT</bcp14> be required to follow the
alternate-site link. They continue to apply <tt>Retry-Over-IPv6</tt> on the <strong>same</strong>
target URI and authority as specified in <xref target="ipv6-retry"></xref>. The link is
presentation for humans; it does not replace machine-readable retry signaling.</t>
<t>The following plain-text examples are suitable for <tt>Content-Type: text/plain</tt> or
as the text content of an HTML page as <tt>Content-Type: text/html</tt>.</t>

<section anchor="body-example-with-ipv6-only-site"><name>Example with an IPv6-only-reachable alternate URI</name>
<blockquote><t>This site is not available on your current Internet connection.</t>
<t>The Internet is moving to a newer protocol generation called IPv6. This
service is not reachable over the older generation (IPv4) on your network.
You probably cannot fix this yourself.</t>
<t>If you can open this IPv6-only address in your browser, try:
<eref target="https://ipv6.example.com/">https://ipv6.example.com/</eref></t>
<t>If that does not work either, the problem may be your network, your device,
or your browser --- not necessarily your Internet provider. Some software
prefers the older connection even when a newer one would work. Try another
browser or device if you can. You can also check whether IPv6 works for you
on a &quot;what is my IP&quot; site or an IPv6 test such as <eref target="https://test-ipv6.com/">https://test-ipv6.com/</eref>.
If you still need help, contact your organization's IT help desk, or ask
your Internet provider to check whether IPv6 works on your connection.</t>
<t>Service over the older connection may resume after 7 June 2026, 00:00 UTC.</t>
</blockquote></section>

<section anchor="body-example-without-ipv6-only-site"><name>Example without an IPv6-only-reachable alternate URI</name>
<blockquote><t>This site is not available on your current Internet connection.</t>
<t>The Internet is moving to a newer protocol generation called IPv6. This
service is not reachable over the older generation (IPv4) on your network.
You probably cannot fix this yourself.</t>
<t>The problem may be your network, your device, or your browser --- not
necessarily your Internet provider. Some software prefers the older
connection even when a newer one would work. Try another browser or device
if you can. You can also check whether IPv6 works for you on a &quot;what is my
IP&quot; site or an IPv6 test such as <eref target="https://test-ipv6.com/">https://test-ipv6.com/</eref>. If you still need
help, contact your organization's IT help desk, or ask your Internet
provider to check whether IPv6 works on your connection.</t>
<t>Service over the older connection may resume after 7 June 2026, 00:00 UTC.</t>
</blockquote></section>
</section>

<section anchor="machine-readable-problem-details"><name>Machine-Readable Problem Details</name>
<t>For machine-readable errors, deployments SHOULD use Problem Details
<xref target="RFC9457"></xref> with <tt>Content-Type: application/problem+json</tt> and the problem type
URI registered for IPv4 unavailability (see <xref target="iana-considerations"></xref>):</t>

<sourcecode type="json"><![CDATA[{
  "type": "urn:ietf:params:problem:ipv4-unavailable",
  "title": "IPv4 Unavailable",
  "status": 503,
  "detail": "IPv4 unavailable until 2026-06-07T00:00:00Z.",
  "ipv4UnavailableUntil": "2026-06-07T00:00:00Z",
  "ipv6OnlySite": "https://ipv6.example.com/"
}
]]></sourcecode>
<t>The <tt>type</tt> member identifies this problem class. Extension members such as
<tt>ipv4UnavailableUntil</tt> and <tt>ipv6OnlySite</tt> are optional. Omit <tt>ipv6OnlySite</tt>
when no such alternate URI is available. Extension members are for presentation
layers that render Problem Details to users. They are not a substitute for
<tt>Retry-Over-IPv6</tt>. The <tt>detail</tt> field is primarily for developers and aware
clients; deployments SHOULD still provide a separate human-oriented body (plain
text or HTML) with the guidance above when the response may be shown to end
users.</t>
<t>Aware clients MUST NOT require a Problem Details body to perform the IPv6
retry: <tt>Retry-Over-IPv6: ?1</tt> on the response is sufficient. This document does
not define a dedicated media type such as <tt>application/ipv4-unavailable+json</tt>;
see <xref target="design-alternatives"></xref>.</t>
</section>
</section>

<section anchor="client-requirements"><name>Client Requirements</name>

<section anchor="processing-the-signal"><name>Processing the Signal</name>
<t>When a client receives <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt>:</t>

<ol spacing="compact">
<li>If the client knows the response arrived on an IPv4 connection, it SHOULD
proceed with an IPv6 retry as below.</li>
<li>If the address family is unknown, it MAY retry over IPv6 once.</li>
<li>If a successful <strong>HTTP</strong> response for this logical request attempt was
already delivered over IPv6 (including when Happy Eyeballs <xref target="RFC8305"></xref> raced
the underlying connections; see <xref target="interaction-with-happy-eyeballs"></xref>), the
client MUST NOT perform another retry or send <tt>Retry-Over-IPv6-Recovery</tt>
based on a late IPv4 response.</li>
</ol>
</section>

<section anchor="ipv6-retry"><name>IPv6 Retry</name>
<t>The client SHOULD close or abandon the IPv4 connection before retrying over IPv6,
consistent with the lifecycle described in <xref target="retry-over-ipv6-recovery"></xref>. The
retry MUST use the same method, target URI, and authority. The client SHOULD force address-family selection to IPv6 for this
retry. The client MUST NOT change the host, scheme, or port solely because of <tt>Retry-Over-IPv6</tt>.</t>
</section>

<section anchor="client-idempotent-methods"><name>Idempotent Methods</name>
<t>Aware clients that receive <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> SHOULD retry the same method, target URI, and body over
IPv6 (see <xref target="ipv6-retry"></xref>). For safe methods <xref target="RFC9110"></xref>, such a retry is
generally acceptable. For non-idempotent methods such as <tt>POST</tt>, the same retry
can cause duplicate processing --- for example, a duplicate payment, order, or
database insert. Responding entities and operators SHOULD follow the guidance in
<xref target="idempotent-methods"></xref> on when not to send this signal for such requests.</t>
</section>

<section anchor="loop-prevention"><name>Loop Prevention</name>
<t>The client MUST NOT perform more than one IPv4-to-IPv6 retry per logical
request attempt triggered by <tt>Retry-Over-IPv6</tt>.</t>
<t>After receiving the signal, the client SHOULD prefer IPv6 for subsequent connections
to the authority until <tt>IPv4-Unavailable-Until</tt> (if present) or for a default
period (for example, 10 minutes).</t>
<t>If the IPv6 retry fails with connectivity errors, the client SHOULD apply
backoff before further attempts and SHOULD NOT fall back to IPv4 while
<tt>IPv4-Unavailable-Until</tt> is in the future.</t>
</section>

<section anchor="ipv4-only-clients"><name>IPv4-Only Clients</name>
<t>Clients without IPv6 connectivity cannot retry over IPv6. They SHOULD surface
<tt>IPv4-Unavailable-Until</tt> (if present) and the response body to the user or
calling application for logging and support tickets.</t>
</section>

<section anchor="recovery-signaling"><name>Recovery Signaling</name>
<t>On the first successful IPv6 request following a fully received IPv4-unavailability signal over IPv4,
the client SHOULD send <tt>Retry-Over-IPv6-Recovery: recovered</tt> and SHOULD echo
<tt>Retry-Over-IPv6-Token</tt> in the <tt>token</tt> parameter when a token was provided.</t>
</section>

<section anchor="nat64-and-translation"><name>NAT64 and Translation</name>
<t>Clients on translated IPv4 paths (for example NAT64/464XLAT) might not be able
to initiate a native IPv6 retry even when dual-stack is reported at the API
layer. Implementations SHOULD present the response body explanation to the user;
operators SHOULD not assume all &quot;IPv4&quot; clients can switch address families.</t>
</section>
</section>

<section anchor="server-and-operational-considerations"><name>Server and Operational Considerations</name>

<section anchor="when-to-send-signal"><name>When to Send the Signal</name>
<t>The responding entity SHOULD send <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> when:</t>

<ul spacing="compact">
<li>IPv4 HTTP service for the authority is intentionally unavailable;</li>
<li>IPv6 service for the requested resource is expected to be available; and</li>
<li>The request was received over IPv4 on the client-facing path; and</li>
<li>For non-idempotent methods, duplicate processing of an IPv6 retry is
acceptable or prevented (see <xref target="idempotent-methods"></xref>).</li>
</ul>
<t>The responding entity MAY omit this signal for requests received on the IPv4 loopback interface --- for
example, when the client-facing connection uses addresses in <tt>127.0.0.0/8</tt>
such as <tt>127.0.0.1</tt>. Routable IPv4 service may be disabled during a planned
outage while loopback remains available for local health checks, monitoring, and
administration; those clients do not need a signal to retry over IPv6.</t>
<t>Operators MAY run staged rollouts: short canary outages (for example, one
minute), longer windows (hours or a full day aligned with 6/6), and eventually
permanent IPv6-only service. Operators on the open Internet <bcp14>SHOULD</bcp14> follow
<xref target="intended-deployment"></xref> before enabling IPv4-unavailability policy.</t>
</section>

<section anchor="idempotent-methods"><name>Idempotent Methods and Duplicate Processing</name>
<t>As described in <xref target="client-idempotent-methods"></xref>, aware clients SHOULD retry after
this signal, including for non-idempotent methods --- which can cause duplicate
processing. Clients cannot generally determine whether a given application or
resource tolerates duplicate processing. Responding entities MUST NOT assume that
end-user clients will suppress IPv6 retries for non-idempotent methods.</t>
<t>An IPv4-unavailability response does <strong>not</strong> guarantee that the first request had no effect.
Duplicate risk arises when:</t>

<ul spacing="compact">
<li><strong>The signal is generated at an edge or load balancer</strong> while an origin server
already started or completed processing the request on the IPv4 path.</li>
<li><strong>Policy races during rollout</strong> --- IPv4-unavailability policy may be enabled or
disabled while requests are in flight.</li>
<li><strong>Late IPv4 responses versus an IPv6 retry</strong> --- when Happy Eyeballs
<xref target="RFC8305"></xref> or a prior IPv6 attempt is in play, a client may retry or complete
work without deduplication at the application layer (see
<xref target="interaction-with-happy-eyeballs"></xref>).</li>
</ul>
<t>Because of this uncertainty, the responding entity <bcp14>SHOULD NOT</bcp14> send <tt>503</tt> with <tt>Retry-Over-IPv6: ?1</tt> for non-idempotent methods such as
<tt>POST</tt> when an IPv6 retry of the same request would cause unacceptable duplicate
side effects, unless the application provides deduplication (for example, an
idempotency key), a request identifier, or another mechanism that makes the
retry safe. Where duplicate processing is unacceptable and no such mechanism
exists, <strong>omitting the signal MAY be preferable</strong> to signaling a retry the client
cannot safely evaluate.</t>
<t>Operators SHOULD prefer applying this signal to idempotent methods during outage
tests. APIs that must remain available for non-idempotent methods through a
planned IPv4 outage SHOULD document and implement application-level
deduplication or other safe-retry semantics explicitly.</t>
</section>

<section anchor="measuring-outage-impact"><name>Measuring Outage Impact</name>
<t>Operators SHOULD instrument at the edge or load balancer, aggregating all
backends. Status code <tt>503</tt> alone is insufficient to distinguish planned IPv4
unavailability from overload: operators SHOULD count responses that include
<tt>Retry-Over-IPv6: ?1</tt> (or emit a dedicated metric label) rather than relying on
generic <tt>503</tt> dashboards. Common monitoring stacks such as Prometheus and
Grafana do not automatically parse <tt>application/problem+json</tt> bodies or
response headers into time series; those fields must be logged or exported
explicitly.</t>
<table>
<thead>
<tr>
<th>Metric</th>
<th>Source</th>
</tr>
</thead>

<tbody>
<tr>
<td>Signal count</td>
<td><tt>503</tt> responses with <tt>Retry-Over-IPv6: ?1</tt> logged with optional token</td>
</tr>

<tr>
<td>Recovery count</td>
<td>Requests carrying <tt>Retry-Over-IPv6-Recovery</tt></td>
</tr>

<tr>
<td>Paired recoveries</td>
<td>Off-box join on matching token values</td>
</tr>

<tr>
<td>Unrecovered signals</td>
<td><tt>signal count - paired recoveries</tt> (estimated hard fail and legacy clients)</td>
</tr>
</tbody>
</table><t>Hard-failure counts are estimates: clients with no IPv6 path cannot send
recovery signals in-band.</t>
<t>Interpreting metrics during a drill:</t>

<ul spacing="compact">
<li><strong>High soft-failure rate with low user-visible errors</strong> --- client path to the
signaling entity is likely OK; a good result <strong>at that hop</strong>.</li>
<li><strong>High soft-failure rate with elevated origin 5xx or latency</strong> --- possible
<strong>split-stack</strong> deployment: clients reached IPv6 at the edge while backends or
internal hops still depend on IPv4 (see <xref target="split-stack-deployments"></xref>).</li>
<li><strong>Low recovery relative to signal count</strong> --- hard failures, legacy clients, or
clients without an IPv6 path.</li>
</ul>
<t>Operators <bcp14>SHOULD</bcp14> correlate edge signal and recovery metrics with <strong>origin,
worker, and downstream dependency</strong> health during an outage window, not rely on
edge metrics alone.</t>
<t>The responding entity SHOULD log recovery headers but MUST NOT alter the
response based on them.</t>
</section>

<section anchor="cdn-and-reverse-proxy-deployment"><name>CDN and Reverse Proxy Deployment</name>
<t>When an edge terminates client IPv4 and connects to an origin over IPv6, the
<strong>edge</strong> sends the IPv4-unavailability signal to the client when IPv4 to the edge is disabled --- not
necessarily the origin application. The entity that generates the signal MUST know
the client-facing address family.</t>
<t>When ingress <strong>terminates IPv6</strong> from clients but uses <strong>IPv4 toward
origin servers or pods</strong>, disabling IPv4 <strong>to the edge</strong> exercises client paths;
disabling IPv4 on an <strong>internal HTTP gateway</strong> (ingress-to-origin, API gateway,
or service-mesh ingress) exercises <strong>service-to-service</strong> HTTP that still uses
operator-controlled hostnames. The same signal semantics apply on each hop where
IPv4 is intentionally unavailable.</t>
</section>

<section anchor="split-stack-deployments"><name>Split-Stack and Multi-Hop Deployments</name>
<t>In some container and cloud deployments, <strong>public ingress</strong> is dual-stack while
<strong>pod or cluster networks remain IPv4-only</strong> (or use IPv6 only for ULA or
translation, not for the paths clients use). Platform IPv6 inside the cluster
often lags public dual-stack at the edge.</t>
<t>The signal is emitted based on the <strong>client-facing transport</strong> at the responding
entity (see <xref target="when-to-send-signal"></xref>). It does <strong>not</strong> probe east-west paths,
sidecars, background workers, or callbacks that use cluster-internal IPv4 names
or addresses.</t>
<t>A drill can therefore show <strong>high soft-failure rates</strong> (the client retried over
IPv6 and received success from the load balancer) while <strong>internal HTTP</strong> still
depends on IPv4 and fails or degrades downstream.</t>
<t>Operators <bcp14>SHOULD</bcp14> treat edge-only drills as <strong>necessary but not sufficient</strong>
for IPv6-only readiness. Operators <bcp14>SHOULD</bcp14> extend staged outages to <strong>internal
HTTP gateways</strong> where policy applies and <bcp14>SHOULD</bcp14> correlate edge signal and
recovery metrics with origin and downstream error rates during the window, as
described in <xref target="measuring-outage-impact"></xref>.</t>
</section>

<section anchor="token-generation"><name>Token Generation</name>
<t>Token format and validation are deployment-specific. Tokens SHOULD be
unguessable, short-lived, and loggable without affinity to the issuing server.</t>
</section>
</section>

<section anchor="application-protocol-considerations"><name>Application Protocol Considerations</name>
<t>This section is informative.</t>

<section anchor="http-versions"><name>HTTP Versions</name>
<t>No change to the on-the-wire status code or header field definitions is required
across HTTP versions. Deployment considerations differ mainly in how connections
are managed:</t>

<ul spacing="compact">
<li><strong>HTTP/1.1</strong> --- An IPv4-unavailability response typically applies to one request on a single
TCP connection. The client closes that IPv4 connection before retrying over
IPv6, as described in <xref target="connection-lifecycle"></xref>.</li>
<li><strong>HTTP/2</strong> --- The signal applies to that TCP connection. A
client SHOULD close the IPv4 HTTP/2 connection (affecting all streams on it)
before opening an IPv6 connection for the retry. Servers SHOULD emit the signal on
every IPv4 HTTP/2 connection that receives a request during an outage, not
only on the first stream.</li>
<li><strong>HTTP/3</strong> --- The same semantics apply on a QUIC connection to the authority.
HTTP/3 is a separate transport from HTTP/1.1 or HTTP/2 over TCP; a client MAY
hold concurrent connections of different HTTP versions and address families.
A signal received on an IPv4 QUIC connection does not automatically invalidate
an existing IPv6 HTTP/3 connection, but the client MUST still apply
<xref target="ipv6-retry"></xref> when the logical request attempt that received the signal has not yet
succeeded over IPv6.</li>
</ul>
<t>Clients that discover HTTP/3 via <tt>Alt-Svc</tt> or similar mechanisms on an IPv4
connection still need to evaluate <tt>Retry-Over-IPv6</tt> before treating the
request as a general failure. Operators SHOULD configure load balancers and
origins to emit the same signaling on all HTTP versions they expose.</t>
</section>

<section anchor="grpc-and-other-http-apis"><name>gRPC and Other HTTP APIs</name>
<t>gRPC over HTTP maps response status codes to RPC status when the <tt>grpc-status</tt>
header is absent (<xref target="GRPC-HTTP-MAPPING"></xref>). That table maps <tt>503 Service
Unavailable</tt> (and selected gateway timeouts and overload responses) to
<tt>UNAVAILABLE</tt>. Implementations that support this document SHOULD inspect
<tt>Retry-Over-IPv6</tt> on the HTTP response before aggregating multi-address
connection errors or applying same-path retry, so that an IPv4 policy signal is
not confused with IPv6 connectivity failure or ordinary overload.</t>
<t>Suggested error text for logs: &quot;IPv4 unavailable until &lt;date&gt;; retry over
IPv6.&quot;</t>
<t>Retry policies SHOULD retry over IPv6 when <tt>Retry-Over-IPv6: ?1</tt> is present,
not blindly retry the same address list.</t>
</section>
</section>

<section anchor="deployment-models"><name>Deployment Models</name>
<t>This section compares HTTP-layer signaling with other transition techniques.</t>
<table>
<thead>
<tr>
<th>Method</th>
<th>Limitation for staged outages</th>
</tr>
</thead>

<tbody>
<tr>
<td>DNS-only (withdraw A records)</td>
<td>Hard rollback; all-or-nothing blast radius; poor application errors; difficult time-bounded windows</td>
</tr>

<tr>
<td>Network ACL or routing</td>
<td>Complex rollback; timeouts instead of policy signals; weak metrics</td>
</tr>

<tr>
<td>Happy Eyeballs alone <xref target="RFC8305"></xref></td>
<td>Implicit; may misattribute IPv4 policy as IPv6 brokenness</td>
</tr>

<tr>
<td>Site banner only</td>
<td>Applications and APIs do not see banners; no automatic IPv6 retry</td>
</tr>

<tr>
<td>HTTP 503 + Retry-Over-IPv6 (this document)</td>
<td>Reversible at LB; structured retry; measurable soft/hard fail; measures client-to-signaling-entity path only; status alone mixes with overload unless headers or custom metrics are used</td>
</tr>
</tbody>
</table><t>HTTP-layer signaling complements DNS and network changes, especially when A
records remain or when the client already connected over IPv4. Internal
back-end address families and east-west paths require separate drills or
metrics (see <xref target="split-stack-deployments"></xref>).</t>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>An attacker who can inject or modify HTTP responses could attempt to influence
client connection behavior by adding <tt>Retry-Over-IPv6</tt> or related header
fields. Implementations SHOULD only honor these fields on authenticated
transport connections to the intended authority.</t>
<t>Misuse could cause clients to prefer IPv6 paths that are slower, unavailable, or
subject to different policy than the original IPv4 path. Operators SHOULD
monitor IPv6 reachability before signaling clients to retry over IPv6.</t>
<t>Recovery headers and tokens are operational telemetry, not authentication.
Deployments SHOULD rate-limit and treat forged recovery signals as untrusted
hints.</t>
<t>The token carries no meaning to the client. An operator MAY nonetheless
generate tokens that the operator can validate when processing logs, so that
random or forged recovery reports can be discarded. For example, a deployment
might combine a site identifier (such as the authority's domain name) with a
random nonce and protect the value with a keyed authenticator (such as an HMAC)
using a secret shared across the load-balanced fleet. Such validation is for
operational filtering only; clients MUST NOT interpret token structure, and
token validation does not authenticate the client or the recovery signal.</t>
<t>IPv4-unavailability responses that depend on the client-facing address family SHOULD use
<tt>Cache-Control: private, no-store</tt> when appropriate to avoid cache poisoning.</t>
<t>IPv6-only-reachable alternate site links in the response body (see
<xref target="response-body"></xref>) are advisory for human readers. Clients MUST NOT treat such
links as automatic redirects without user action. Operators MUST ensure
alternate URIs use valid certificates for the advertised name and MUST NOT
point users to untrusted third-party destinations.</t>
<t>This mechanism does not by itself provide confidentiality or integrity for
retried requests. Any security properties depend on the underlying transport and
application protocol in use.</t>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>IANA is requested to make the following registrations.</t>

<section anchor="http-field-names"><name>HTTP Field Names</name>
<t>In the &quot;Hypertext Transfer Protocol (HTTP) Field Name Registry&quot;
(<eref target="https://www.iana.org/assignments/http-fields/">https://www.iana.org/assignments/http-fields/</eref>):</t>
<table>
<thead>
<tr>
<th>Field Name</th>
<th>Status</th>
<th>Struct</th>
<th>Reference</th>
</tr>
</thead>

<tbody>
<tr>
<td>Retry-Over-IPv6</td>
<td>permanent</td>
<td>-</td>
<td>This document</td>
</tr>

<tr>
<td>IPv4-Unavailable-Until</td>
<td>permanent</td>
<td>-</td>
<td>This document</td>
</tr>

<tr>
<td>Retry-Over-IPv6-Token</td>
<td>permanent</td>
<td>-</td>
<td>This document</td>
</tr>

<tr>
<td>Retry-Over-IPv6-Recovery</td>
<td>permanent</td>
<td>-</td>
<td>This document</td>
</tr>
</tbody>
</table></section>

<section anchor="problem-type"><name>Problem Type</name>
<t>This document registers the following Problem Details type under the registry
established by <xref target="RFC9457"></xref>:</t>
<table>
<thead>
<tr>
<th>Type URI</th>
<th>Description</th>
<th>Reference</th>
</tr>
</thead>

<tbody>
<tr>
<td><tt>urn:ietf:params:problem:ipv4-unavailable</tt></td>
<td>Planned IPv4 unavailability; retry over IPv6 when <tt>Retry-Over-IPv6: ?1</tt> is present</td>
<td>This document</td>
</tr>
</tbody>
</table><t>This document does <strong>not</strong> register a new HTTP status code.</t>
</section>
</section>

<section anchor="examples"><name>Examples</name>
<t>This section is informative.</t>

<section anchor="dual-stack-browser"><name>Dual-Stack Browser</name>
<t>A browser receives:</t>

<sourcecode type="http"><![CDATA[HTTP/1.1 503 Service Unavailable
Retry-Over-IPv6: ?1
IPv4-Unavailable-Until: Sun, 07 Jun 2026 00:00:00 GMT
Cache-Control: private, no-store
Content-Length: 0

]]></sourcecode>
<t>It closes the IPv4 connection, retries over IPv6, and completes the page load
without displaying an error page.</t>
</section>

<section anchor="legacy-browser-with-html-body"><name>Legacy Browser with HTML Body</name>
<t>The following example includes an IPv6-only-reachable alternate URI. When no
such URI is published, omit the corresponding paragraph (see
<xref target="body-example-without-ipv6-only-site"></xref>).</t>

<sourcecode type="http"><![CDATA[HTTP/1.1 503 Service Unavailable
Retry-After: 86400
Content-Type: text/html; charset=utf-8

<html><body><p>This site is not available on your current
Internet connection.</p><p>The Internet is moving to a newer protocol
generation called IPv6. This service is not reachable over the older
generation (IPv4) on your network. You probably cannot fix this
yourself.</p><p>If you can open this IPv6-only address in your
browser, try:</p>
<p><a
href="https://ipv6.example.com/"
>https://ipv6.example.com/</a></p>
<p>If that does not work either, the problem may be your
network, your device, or your browser --- not necessarily
your Internet provider. Some software prefers the older
connection even when a newer one would work. Try another
browser or device if you can. You can also check whether
IPv6 works for you on a &quot;what is my IP&quot; site or an IPv6
test such as <a href="https://test-ipv6.com/"
>https://test-ipv6.com/</a>. If you still need help,
contact your organization's IT help desk, or ask your
Internet provider to check whether IPv6 works on your
connection.</p>
<p>Service over the older connection may
resume after 7 June 2026, 00:00 UTC.</p></body></html>
]]></sourcecode>
</section>

<section anchor="cross-backend-recovery"><name>Cross-Backend Recovery</name>
<t>Backend A (IPv4 path) returns:</t>

<sourcecode type="http"><![CDATA[HTTP/1.1 503 Service Unavailable
Retry-Over-IPv6: ?1
Retry-Over-IPv6-Token: "abc123"
Content-Length: 0

]]></sourcecode>
<t>The client retries over IPv6; backend B receives:</t>

<sourcecode type="http"><![CDATA[GET /index.html HTTP/1.1
Host: example.com
Retry-Over-IPv6-Recovery: recovered; token="abc123"

]]></sourcecode>
<t>An edge log pipeline joins both events on <tt>token=abc123</tt>.</t>
</section>

<section anchor="ingress-soft-failure-with-internal-ipv4-dependency"><name>Ingress Soft Failure with Internal IPv4 Dependency</name>
<t>This example is informative. It illustrates that <strong>edge soft failure does not
imply stack-wide IPv6 readiness</strong> (see <xref target="split-stack-deployments"></xref>).</t>

<ol spacing="compact">
<li>A dual-stack client connects to public ingress over IPv4 and receives <tt>503</tt>
with <tt>Retry-Over-IPv6: ?1</tt>.</li>
<li>The client retries over IPv6; ingress returns <tt>200 OK</tt> with
<tt>Retry-Over-IPv6-Recovery</tt> --- a <strong>soft failure</strong> at the edge.</li>
<li>Ingress forwards the request to a worker pod over cluster IPv4; the pod cannot
reach a dependency that was only tested over internal IPv4, and the client
eventually receives <tt>502 Bad Gateway</tt> or <tt>504 Gateway Timeout</tt>.</li>
</ol>
<t>Operators SHOULD not conclude IPv6-only migration is complete from edge recovery
metrics alone when internal paths were not exercised.</t>
</section>
</section>

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6555.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8305.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9112.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9113.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9114.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9651.xml"/>
</references>
<references><name>Informative References</name>
<reference anchor="GRPC-HTTP-MAPPING" target="https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md">
  <front>
    <title>HTTP to gRPC Status Code Mapping</title>
    <author>
      <organization>gRPC Authors</organization>
    </author>
  </front>
</reference>
<reference anchor="HEV3" target="https://datatracker.ietf.org/doc/html/draft-pauly-happy-happyeyeballs-v3-00">
  <front>
    <title>Happy Eyeballs Version 3: Better Connectivity Using Concurrency and Protocol Negotiation</title>
    <author fullname="Tommy Pauly" initials="T." surname="Pauly">
      <organization>Apple Inc.</organization>
    </author>
    <author fullname="David Schinazi" initials="D." surname="Schinazi">
      <organization>Apple Inc.</organization>
    </author>
    <date year="2024"></date>
  </front>
</reference>
<reference anchor="IETF71-IPV4-OUTAGE" target="https://web.archive.org/web/20111016062408/wiki.tools.isoc.org/IETF71_IPv4_Outage">
  <front>
    <title>IETF 71 IPv4 Outage</title>
    <author>
      <organization>Internet Society</organization>
    </author>
    <date year="2008"></date>
  </front>
</reference>
<reference anchor="KONEC-IPV4-CZ" target="https://konecipv4.cz/en/">
  <front>
    <title>Konec IPv4 - Czech Republic IPv4 End Date</title>
    <author>
      <organization>CZ.NIC</organization>
    </author>
  </front>
</reference>
<reference anchor="NL-FS-IPV6" target="https://www.forumstandaardisatie.nl/open-standaarden/ipv6">
  <front>
    <title>Internet Protocol version 6 (IPv6)</title>
    <author>
      <organization>Forum Standaardisatie</organization>
    </author>
  </front>
</reference>
<reference anchor="OMB-M-21-07" target="https://www.whitehouse.gov/wp-content/uploads/2020/11/M-21-07.pdf">
  <front>
    <title>Completing the Transition to Internet Protocol Version 6 (IPv6)</title>
    <author>
      <organization>Office of Management and Budget</organization>
    </author>
    <date year="2020" month="November"></date>
  </front>
</reference>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9111.xml"/>
<reference anchor="TEST-IPV6" target="https://test-ipv6.com/">
  <front>
    <title>Test your IPv6</title>
    <author>
      <organization>test-ipv6.com</organization>
    </author>
  </front>
</reference>
<reference anchor="WA-EA-04" target="https://watech.wa.gov/policies/internet-protocol-version-6-ipv6-implementation-policy">
  <front>
    <title>Internet Protocol Version 6 (IPv6) Implementation Policy</title>
    <author>
      <organization>Washington State Office of the Chief Information Officer</organization>
    </author>
  </front>
</reference>
<reference anchor="WORLD-IPV6-DAY" target="https://www.worldipv6launch.org/faq/">
  <front>
    <title>World IPv6 Launch FAQ</title>
    <author>
      <organization>Internet Society</organization>
    </author>
  </front>
</reference>
<reference anchor="WORLD-IPV6-LAUNCH" target="https://www.worldipv6launch.org/">
  <front>
    <title>World IPv6 Launch</title>
    <author>
      <organization>Internet Society</organization>
    </author>
  </front>
</reference>
</references>

</back>

</rfc>
