| Internet-Draft | Group Address Allocation Protocol (GAAP) | September 2026 |
| Farinacci & McBride | Expires 7 March 2027 | [Page] |
This document describes a design for a lightweight decentralized multicast group address allocation protocol (named GAAP and pronounced "gap" as in "mind the gap"). GAAP requires no centralized service or coordination for the address-allocation protocol itself, though it depends on ASM-capable multicast routing already being provisioned in the deployment domain, and deployments using encryption or administrative scoping may require additional configuration. The protocol runs among group participants which need a unique group address to send and receive multicast packets. Tailored for IPv4 and IPv6 networks, this design offers a simple, lightweight option rather than extending an existing protocol. This document is Experimental, see Section 8 for the rationale and the criteria for concluding the experiment.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 7 March 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The Group Address Allocation Protocol (GAAP) is a decentralized multicast protocol used by participating applications which send and receive packets to/from a multicast group. The protocol is relatively lightweight, runs with minimized messaging and state so that it can run within a library a multicast application compiles into its executable binary.¶
GAAP is a possible solution to the issues described in problem statement [RFC10019]. This document specifies an Experimental protocol, see Section 8 for why, and for the scope of the experiment.¶
Other approaches to multicast group allocation have been proposed in the past, they include SAP [RFC2974], SDP [RFC8866], mDNS [RFC6762], MADCAP [RFC2730], MASC [RFC2909], and IPv6 Allocation Guidelines [RFC3307]. However, depending on the specific mechanism, these approaches can require global scope (adding latency), explicit configuration, reliance on a single subnet, or a centralized or semi-centralized service; not every limitation applies to every mechanism listed.¶
This document will describe the protocol operation, protocol message formats, the API definition, and how multicast applications use the API.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This section will describe the high-level functionality of the GAAP protocol. Each application runs the GAAP protocol by using the API defined in Section 5.¶
An application is started with a group name.¶
The group name is used to create a random allocated group address.¶
A timestamp is taken when the group address is created.¶
A Claim message, see Section 4, is sent with group name, group address, and timestamp to determine if the group address has been claimed by any other GAAP nodes.¶
The GAAP node waits one periodic Claim interval (see Section 6, roughly 1 minute) after sending its initial Claim message. If no colliding Claim message is received from another GAAP node within that window, the application can start using the group address.¶
If a colliding Claim message is sent in response within that window, a collision has occurred and the GAAP node MUST allocate another group address and send a Claim message for the new group address.¶
Claim messages are sent periodically. They are sent by a single node using a delay-timer suppression mechanism similar to IGMPv2 report suppression [RFC2236]. See Section 6 for details.¶
GAAP nodes are not required to cache information from Claim messages.¶
GAAP is designed to be decentralized and stateless. The nodes that participate in the GAAP protocol are responsible for allocating and claiming group addresses. No other entities are needed.¶
At this time, there is a single defined message called the Claim message with Type value 1. Type value 0 is reserved. A receiver that does not recognize the Type value MUST discard the message without further processing. Claim messages are sent to the GAAP Group Address (see Section 2), a well-known multicast address allocated by IANA (see Section 10), distinct from the addresses GAAP allocates for applications. When an IPv6 GAAP Group Address is used, implementations MUST use an admin-local or organization-local IPv6 scope (not link-local scope) for that address, so that Claim messages can be forwarded beyond a single link when the deployment requires it (see Section 10 for the specific address requested). The Claim message is sent in a UDP checksummed packet where the source port is ephemeral and chosen by the sender and the destination port is a well-known port allocated by IANA specifically for GAAP (see Section 10). GAAP can work behind firewall devices as long as the GAAP destination port is permitted through filters. IPv4 NAT does not translate or forward multicast traffic in any standard way. If a deployment nonetheless places address or port-translating middleboxes on the path, the source-address-dependent mechanisms in this document (Timestamp tie-breaking in this section, and the bad-actor list in Section 6.5) are not expected to function correctly across that path.¶
A sender MUST NOT send a Claim message whose total UDP payload exceeds 1232 octets, so that it fits within the 1280-octet IPv6 minimum MTU without fragmentation, accounting for typical IPv6/UDP header overhead. A node with more (group name, group address) pairs to claim than fit in one message sends them across successive Claim messages, each within the limit. This bounds the number of records per message well below the maximum Record Count of 255 when Group Names are long. A sender SHOULD keep a multi-record Claim message small enough to avoid IP fragmentation on the path more generally, per [RFC8085]. The UDP checksum MUST be enabled and verified. A receiver MUST discard, without further processing, any packet whose UDP payload length (as reported by the UDP header) exceeds 1232 octets. A receiver MUST also validate the Marker before further processing a packet that is within that length, discarding malformed packets as described below.¶
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Type=1 | Reserved | Record Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0xAAAAAAAA Marker |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 Multicast Group Address | \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \
| | R
| IPv6 Multicast | e
| Group Address | c
| | o
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ r
| Timestamp | d
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ /
| Group Name ... | /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ /
| ... |/
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The GAAP API has the following API calls a multicast application will use. A multicast application imports the library before using it in its code logic. This section documents a python library. The following API is illustrative and shows one possible application interface; it is not a normative part of the GAAP protocol specification. Implementations are free to expose different programming interfaces as long as the on-the-wire protocol defined in Section 4 is followed.¶
gaap.init() is used to initialize the GAAP API with an application callback function. The callback function is called when a group address has changed (due to collision) for a group name the application allocated.¶
<CODE BEGINS>
import gaap
status = gaap.init(app_callback_func)
if (status == False):
print("error")
exit(1)
#endif
def app_callback_func(group_name, group_address)
print("Group name {} changed to group address {}". \
format((group_name, group_address))
#enddef
<CODE ENDS>¶
gaap.allocate() is used when the application needs a group address to send or receive on.¶
<CODE BEGINS>
import gaap
group_name = "my-audio-group"
group_address = gaap.allocate(group_name)
if (group_address == None):
print("error")
exit(1)
#endif
print("Name {} allocated address {}".format(group_name, group_address))
<CODE ENDS>¶
gaap.release() is used when an application is finished using a group address.¶
<CODE BEGINS>
import gaap
group_address = gaap.allocate("my-audio-group")
status = gaap.release(group_address)
if (status == False):
print("error")
exit(1)
#endif
print("Released address {}".format(group_address))
<CODE ENDS>¶
gaap.close() is used when an application is finished using the GAAP protocol.¶
<CODE BEGINS>
import gaap
#
# Initialize the GAAP API with no callback function. Return if errored.
#
if (gaap.init() == False):
print("error")
exit(1)
#endif
#
# Do multicast work by allocating, sending, and receiving group addresses.
#
...
#
# Application shutting down. No longer need to run GAAP on local node.
#
gaap.close()
<CODE ENDS>¶
When an application needs a group address it provides the GAAP API with a group name, the group name is used as input to a SHA-256 hash function [RFC6234], hashing the UTF-8 octets of the group name (and, for the collision-fallback candidates below, the literal appended ASCII characters, which are a subset of UTF-8) directly; the null terminator used to mark the end of the Group Name field on the wire (see Section 4) is a wire-format delimiter only and is never itself part of the hash input. Initially, when no group address collision is detected the group name is passed as a string to the hash function and the Hashed Value's low-order bits are used for a group address. The Hashed Value is the 32-bit unsigned integer formed from the last 4 octets of the 32-octet SHA-256 digest, taken in network byte order (that is, the third-to-last digest octet is the most significant octet of the Hashed Value and the last digest octet is the least significant). The address is constructed so that it always falls within the fixed GAAP IPv4 or IPv6 allocation range (see Section 7 for the specific ranges), and never outside it. The following pseudo-code illustrates the functionality, where GAAP_V4_BASE and GAAP_V4_MASK are derived from the fixed GAAP IPv4 allocation, and GAAP_V6_BASE and GAAP_V6_MASK are derived from the fixed GAAP IPv6 allocation:¶
hashed_value = hashed_value_of(sha256(group_name))
if (v4):
# GAAP_V4_BASE/GAAP_V4_MASK are derived from the
# fixed GAAP IPv4 allocation range (239.0.0.0/10).
group_address = GAAP_V4_BASE | (hashed_value & GAAP_V4_MASK)
#endif
if (v6):
# GAAP_V6_BASE/GAAP_V6_MASK are derived from the
# fixed GAAP IPv6 allocation range.
group_address = GAAP_V6_BASE | (hashed_value & GAAP_V6_MASK)
#endif
return(group_address)
¶
For IPv6, GAAP derives only the group ID. The group ID is formed by placing the low-order bits of the Hashed Value into the host portion of the GAAP group ID range (see Section 10 for how many bits that range leaves available). The remaining bits of the multicast address - flags, scope, and, where the [RFC3306] or [RFC3956] formats are in use, the embedded prefix or Rendezvous Point information - are determined by the deployment and are outside the scope of this document, other than the scope constraint in Section 10.¶
When the hash function is used to resolve a collision, the following pseudo-code will illustrate how 3 more attempts are used to find a unique group address:¶
for append in ["+1", "+2", "+3"]:
hashed_value = hashed_value_of(sha256(group_name + append))
group_address = make_group_from_hash(hashed_value)
collision = send_claim(group_address)
if (collision == False):
return(group_address)
#endfor
# All 4 candidate addresses (see "Acceptable Group Hash
# List" in Section 2) collided. gaap.allocate() returns
# an error to the calling application; the application
# MAY retry later or select a different group name. This
# condition MUST be logged and exposed via the local
# management interface (see Section 7), including the group
# name, the four contested addresses, and, where known, the
# claimants.
return(None)
¶
Two distinct group names can, by construction of the strings above, occasionally produce the same candidate string. For example, a group name that itself ends in the literal characters "+1" produces the same input to the hash function as a different group name's second candidate. This is not treated as a special case as it results in an ordinary collision between the two group names on that candidate address and resolved by the normal collision procedure described in Section 4 and below, the same as any other hash collision between unrelated group names.¶
If all 4 candidate addresses for a group name collide, the GAAP API returns an error to the application, as shown above. GAAP does not define automatic retry behavior in this case, since retrying with the same group name would deterministically produce the same 4 candidate addresses. This condition is permanent for that group name within the deployment domain until resolved out of band (for example, by every participant independently being reconfigured to use a different group name; this document defines no in-band coordination mechanism for that). Because the failure would otherwise be silent, a GAAP node MUST log this condition and expose it - at minimum, the group name, the four contested addresses, and, where known, the claimants - through the local management interface described in Section 7. Note that a GAAP node receiving a Claim message for the same group name and the same group address it is already claiming is not a collision, per the Definition of Terms; two independent partitions using the same group name are therefore expected to converge on the same address once they can communicate.¶
When a group address collision is detected by 2 GAAP nodes, the node with the earliest timestamp for the group address creation wins the collision and keeps using the address. The node with a later timestamp has the responsibility to allocate a new group address to prevent the collision.¶
When a group address is allocated by a GAAP node, it will build and send a Claim message. Included in the Claim message is the group name, group address, and timestamp. If the group address collides with other GAAP nodes already using the address, one of the nodes will send a Claim message to notify the colliding node that it needs to allocate a new group address.¶
Collisions can occur two ways, the first is when multiple group names produce the same hash, the second is when different hashes are produced but when truncated to fit into a group address format, those bits are the same.¶
A collision is defined to be the same group address allocated to 2 different group names. So if a GAAP node is claiming a group address for its group name and a Claim is received with the same group name with the same group address, it is not a collision. It is simply a peer group participant claiming the group address you both agree to be using.¶
Each GAAP node will periodically send Claim messages for all group names for the applications running on the node. It will do this in a multi-record Claim message. The periodic Claim message is sent by setting a periodic timer to a random value in the range 60 to 66 seconds (a base of 1 minute, plus jitter of 0 to 10% of 1 minute). When the timer expires, a Claim message is sent. Suppression is per (group name, group address) pair: a receiver of a Claim message that carries both the same group address and the same group name as one the receiver is claiming resets its own timer for that pair, thereby suppressing its own Claim for it; timers for other group addresses the node is claiming are unaffected. This allows only a single GAAP node that is using a given (group name, group address) pair to keep claiming that the pair is still in use. A Claim message that carries the same group address with a different group name is a collision (see above) and MUST NOT suppress the receiver's timer for its own (group name, group address) pair; the receiver instead processes it as described below.¶
On receiving a Claim message carrying a group address it is currently claiming with a different group name (an ordinary collision, as opposed to the new-node case below), a GAAP node MUST send a Claim message for that (group name, group address) pair after a random delay uniformly distributed in [0, 1] second, rather than waiting for its periodic timer, unless it receives an equivalent Claim from another node claiming the same pair during that delay, in which case it suppresses its own per the suppression rule above. A GAAP node MUST NOT send more than one such triggered Claim per (group name, group address) pair per second.¶
A new GAAP node may come up after a group address collision has already been resolved by other nodes using a later entry in the Acceptable Group Hash List. It will send a Claim message for the first group hash from the Acceptable Group Hash List, since it has no way to know a prior collision occurred. For a given group name, a later-list-position address, once established among the group's participants by a prior collision resolution, always prevails over an earlier-list-position address for that same group name. A GAAP node using a later-list address that receives a Claim message carrying its own group name with an earlier-list address continues claiming its own (later) address and MUST send a triggered Claim, per the delay and rate limit above, rather than yielding; a GAAP node using an earlier-list address (such as a newly started node) that receives a Claim message carrying its own group name with a later-list address MUST yield and switch to that later address, rather than continuing to use, or allocating, an earlier one. Timestamps are not used for this comparison, only position in the Acceptable Group Hash List. If more than one existing node responds, the new node processes the first valid response it receives and MAY discard duplicates; the new node's own Claim for the earlier-list address is then withdrawn implicitly by no longer being refreshed. If a triggered Claim is lost in transit, the node still claiming the later-list address continues to periodically re-claim it; the node claiming the earlier-list address will observe the unsuppressed Claim on its own next periodic timer expiry (or trigger again immediately on receipt of the repeated Claim) and retransmit its own Claim, so the state converges without a bound on the number of retries.¶
There will be network outage situations where all GAAP nodes may not receive Claim messages. During a partition, duplicate group addresses may be allocated and used by nodes on each side of the partition. During this condition, multicast nodes can operate normally and there is no conflict until the partition heals. When the partition heals, duplicate group addresses will be detected and fixed. The group address with the earliest Timestamp is used to determine who keeps the collided group address, using the same comparison and tie-breaking rule defined in Section 4 for equal or skewed Timestamps. All others will have to rehash a new group address and have the applications start using the new address (meaning senders will send to the new group address and receivers will leave the collided group and join the new group).¶
This repair mechanism detects and resolves the case where both sides of a partition end up using the same address for a group name (a same-address collision, per the Definition of Terms). It does not detect the case where the two sides independently fall back to different candidate addresses for the same group name (for example, one side falls back to the "+1" candidate and the other to "+2", each due to an unrelated local collision on its own side): since the two sides are then using different addresses, nothing collides, and the group remains split on healing. Resolving this case is an open question for the experiment described in Section 8.¶
When applications are no longer sending to a group address or not joined to a group address, they can inform the GAAP API to release the group. Release is purely a local action: no GAAP release message is sent on the wire. When this happens, the GAAP protocol stops claiming the group address in periodic messages and will not respond to a Claim for this address for a different group name. It is important for receiver applications to leave the group before releasing the group address. If more than one local application on the same node uses the same group name (and therefore the same group address), the GAAP implementation MUST track this locally and continue claiming the group address on behalf of the remaining applications until the last local application using that group name has released it.¶
The periodic and jittered Claim timer described above already bounds the sending rate of a well-behaved node; implementations SHOULD additionally rate-limit processing of received Claim messages per source to bound the cost of handling a misbehaving or malicious sender. A cooperating node that identifies a Claim message as misbehaving under either of the two cases below SHOULD place the apparent source of that message on a local bad-actor list and ignore further messages from it: (1) a Claim message claiming a group address not derived from one of the group name inputs used for the Acceptable Group Hash List (Section 2); or (2) a source sending Claim messages more often than the periodic and triggered-Claim procedures in this document permit. Losing a Timestamp comparison is not itself grounds for bad-actor listing: exactly one side of every ordinary, honest collision loses that comparison, and the skew-tolerant treatment of an implausible Timestamp in Section 4 already prevents a fabricated or skewed Timestamp from winning a collision it should not, without needing to separately flag the sender. A node on the bad-actor list MUST NOT have its Claim messages trigger a Claim response, reset a periodic timer, or otherwise be treated as suppressing traffic from other nodes. Because Claim message source addresses can be spoofed, implementations SHOULD bound the size of the bad-actor list and treat its entries as advisory hints rather than authoritative state; see Section 9 for the rationale behind each case. GAAP Claim messages, whether for the well-known GAAP Group Address or for application group addresses, are intended for delivery within the scope implied by the multicast group address used (see Section 10), and implementations SHOULD set the IPv4 TTL or IPv6 Hop Limit consistently with that scope rather than defaulting to a large value.¶
This section summarizes operational considerations for GAAP deployment. Implementations should provide a local management interface through which operators can observe GAAP's local active-claim state (see below) and the exhausted-candidate-address condition described in Section 6.¶
Group name selection is application deployment specific and may be driven by configuration, applications, or provisioning systems. Operators should define policies to avoid administrative conflicts.¶
GAAP is expected to co-exist with other multicast address allocation mechanisms. Deployments should ensure that GAAP operates within defined address ranges to avoid conflicts with non-GAAP assigned multicast addresses. Operators should also be aware that, due to Layer-2 multicast address mapping, multiple IPv4 multicast addresses, allocated by different multicast allocation procedures, may map to the same ethernet multicast MAC address, which may result in hosts receiving multicast traffic for groups to which they did not explicitly subscribe.¶
GAAP is intended for deployment within a single routed multicast administrative domain that already provides ASM-capable multicast routing and forwarding (see below); it is not intended for deployment on a single link or IP subnet without such infrastructure, and this document does not define behavior for GAAP Claim messages crossing administrative domain boundaries. What GAAP removes, relative to [RFC10019]'s zeroconf goals, is centralized coordination and configuration of the application-level group-address-allocation function itself: within a domain with multicast routing already provisioned, applications obtain and defend unique group addresses without a centralized allocation service, explicit per-application configuration, or reliance on a single subnet. GAAP's decentralized, periodic Claim-based model is not intended as a general replacement for existing address allocation mechanisms in traditionally managed networks, and networks that already have a centralized or administratively assigned multicast address allocation scheme in place do not need to deploy GAAP alongside it. A narrower first experiment confined to a single link or subnet, exercising the derivation, collision detection, and suppression mechanisms without requiring ASM/RP infrastructure across the whole domain, is also a reasonable deployment for early experimentation; see Section 8.¶
GAAP does not require receivers to be GAAP aware. However, all nodes allocating multicast addresses for the same application or group name are expected to use GAAP in order for collision detection to operate correctly. GAAP allocated groups and non GAAP allocated groups may co-exist in the same network when used by different applications or services. Deployment within a coordinated administrative domain is recommended to avoid conflicts between allocation methods.¶
GAAP defines a method for deriving multicast addresses from group names and detecting address allocation conflicts. Applications use the derived multicast addresses for communication. A group name is intended to be shared by, and only by, the participants of a single application or session that need to rendezvous on the same group address; deployments are responsible for keeping group names unique across unrelated applications within their administrative domain, for example through a naming convention. GAAP's collision detection mechanism handles the case where two unrelated group names happen to hash to the same address, but it cannot detect or prevent two unrelated applications from being deliberately or accidentally configured with the same group name. The creation, distribution and discovery of group names are application specific functions and are outside the scope of this document.¶
GAAP is stateless in the sense that no node is required to persist claim information across restarts, and no node needs to keep a complete table of every group name and address in use by other nodes in order for the protocol to function; each node only needs to track the group names and addresses its own local applications have allocated. The soft state a GAAP node does keep locally (its own allocations and their periodic timers) is rebuilt from scratch on restart via a new round of Claim messages. The local management interface referenced above should also allow operators to clear or reset this state for operational purposes.¶
Deployments should include protections against spoofed claims using appropriate authentication mechanisms, though specific methods are outside the scope of this document.¶
Implementations may limit the number of records per message and should perform basic validation, including detection of duplicate multicast address claims.¶
While strict time synchronization is not required, loosely synchronized clocks are recommended to ensure consistent timer behavior.¶
GAAP requires the underlying network to support IP multicast group membership (IGMP/MLD) and ASM-capable multicast routing/forwarding (e.g., PIM-SM) for delivery of Claim messages, consistent with the routed-administrative-domain scope described above. Applications using GAAP-allocated addresses will typically also rely on ASM delivery for their own traffic, though an application with a single known source could in principle use PIM-SSM for its own data plane once its address has been allocated and claimed via GAAP. In IPv4 deployments using PIM-SM, the Rendezvous Point(s) serving the GAAP Group Address and the GAAP IPv4 allocation range need to be configured to support the full range described in Section 10, since a GAAP node may allocate any address within it.¶
In practice, native multicast routing/forwarding support across underlay networks remains inconsistent enough that GAAP is expected most often to be deployed with Claim messages, and the application traffic using GAAP-allocated addresses, carried over an overlay network rather than relying directly on the underlay's multicast capability. Running over an overlay also allows GAAP to work across NAT and other underlay level connectivity restrictions between participants, since the overlay is what actually delivers the multicast packets between GAAP nodes. This document does not mandate an overlay and describes GAAP's requirements in terms of the multicast service it needs, which an overlay or a natively multicast capable underlay can both provide.¶
GAAP's application use address ranges are drawn from space that requires no per user IANA assignment. Because two independently implemented GAAP nodes must still interoperate for GAAP to be genuinely decentralized, each address family's range is a single value fixed by this document, not an operator-configurable setting. An operator can control which applications run in a domain, but not which independently written GAAP implementations those applications might use, so a configurable range would only be reliably compatible with itself.¶
For IPv4, GAAP implementations MUST use 239.0.0.0/10 as the application-use range. This is one of the three ranges (239.0.0.0/10, 239.64.0.0/10 and 239.128.0.0/10) that Section 6.2.1 of [RFC2365] records as unassigned and available for expansion of the IPv4 Organization-Local scope, within the Administratively Scoped Block that [RFC5771] records as requiring no IANA assignment policy. A /10 keeps collisions infrequent enough, combined with the up to 4 candidate addresses per group name (see "Acceptable Group Hash List" in Section 2), that a GAAP node rarely needs to fall back past its first candidate address.¶
For IPv6, GAAP implementations MUST use the Experimental Use range 0xFE000000-0xFEFFFFFF of the 32-bit Group ID space defined by [RFC10028] as the application-use range, which states that range "may be used for experimentation with new dynamic allocation protocols" without IANA action. Other experimental protocols may also draw on this same range; GAAP does not have it exclusively, which is an inherent property of Experimental status rather than something this document can change.¶
The GAAP_V4_MASK and GAAP_V6_MASK referenced in Section 6 are derived from the fixed ranges above. Transitioning any part of the IPv6 range to a permanent Standards Action assignment, should GAAP or a successor advance beyond Experimental, is a topic for that future document rather than this one.¶
This document does not define GAAP-specific behavior for inter-AS multicast delivery (e.g., use of the RPF Vector [RFC5496]) or for delivery over a Multicast VPN [RFC6513] [RFC6514]. GAAP relies entirely on the underlying multicast routing and forwarding infrastructure for delivery of both Claim messages and application traffic. No GAAP-specific considerations beyond normal multicast deployment practice are known for these environments.¶
GAAP is published as Experimental because decentralized hash-based multicast group address allocation has not been deployed. The experiment aims to determine whether the collision detection and resolution mechanisms defined in this document are sufficient for practical deployments and what collision rates occur in networks of varying scale. The experiment is considered complete when operational experience demonstrates the protocol is suitable for Standards Track or when fundamental limitations are identified that require a revision.¶
The scalability of periodic Claim traffic has not yet been measured for deployments with large numbers of GAAP nodes claiming the same group name. Operators of such deployments should monitor Claim traffic volume and tune deployment-specific parameters as needed; this is expected to be an area of active investigation as operational experience with this experimental protocol accumulates. A narrower first experiment confined to a single link or subnet, per Section 7, would exercise the derivation, collision detection, and suppression mechanisms - where every open question in this document lies - without requiring ASM/RP infrastructure across a full administrative domain.¶
It is suggested that the GAAP protocol run over an encrypted multicast channel, particularly on networks where GAAP traffic could be observed or injected by untrusted parties. This document does not define a mandatory-to-implement encryption mechanism. Deployments that enable encryption need to agree out of band on a common mechanism and key management procedure, which could be difficult in embedded devices with different configurations. The message Marker (see Section 4) provides an implicit signal of whether a received Claim message is encrypted: an unencrypted Claim carries the Marker as cleartext 0xAAAAAAAA, while an encrypted Claim has the Marker encrypted along with the rest of the record data and so will not match 0xAAAAAAAA on the wire. A receiver that sees a non-matching Marker and has a shared key configured attempts decryption. If that fails, or the receiver has no shared key configured, the message MUST be dropped. Note that this single mismatch-triggered check does not distinguish, from the receiver's perspective, between a wrong or missing key, a mismatched encryption mechanism between sender and receiver, and a mutated packet. All three result in the message being dropped, without a diagnostic distinction between them.¶
Because whether a given Claim message is encrypted is signaled only implicitly via the Marker rather than declared in cleartext, a deployment where some nodes are configured with a shared key and others are not does not fail outright. Unkeyed nodes can still exchange unencrypted Claims with each other, and keyed nodes can exchange encrypted Claims with each other, but a keyed node's encrypted Claims are indistinguishable from noise to an unkeyed node and vice versa. For a single group name split across both populations, this results in two collision-detection sub-groups that function correctly within themselves but are mutually invisible to one another, rather than a single interoperable group. This is a consequence of misconfiguration that this document does not attempt to prevent or detect.¶
ChaCha20 [RFC8439] without a message authentication code has been used to encrypt GAAP messages. Deployments choosing an encryption mechanism SHOULD prefer an Authenticated Encryption with Associated Data (AEAD) construction such as ChaCha20-Poly1305 [RFC8439], which additionally authenticates the message, over ChaCha20 alone. Where a shared key is configured with the application, key management is a deployment responsibility; see below.¶
Deployments enabling encryption MUST use a mechanism that provides both confidentiality and integrity, such as an AEAD construction (e.g., ChaCha20-Poly1305); using ChaCha20 without a message authentication code is NOT RECOMMENDED, since a matching decrypted Marker on its own is not a cryptographic integrity check over the rest of the message. Implementations MUST ensure nonce uniqueness per key across all senders sharing that key. A receiver configured with a shared key MUST reject an unencrypted Claim message rather than process it, to prevent downgrade to the unauthenticated base mode. This document does not specify a nonce construction or associated data binding scheme, these are implementation and deployment responsibilities when encryption is enabled.¶
Dynamic rekeying mechanisms are outside the scope of this document. However, GAAP can operate with external key management systems, including automated or Dynamic Key Management (DKM) solutions. In the absence of such mechanisms, keys may be provisioned manually.¶
The base (unauthenticated, unencrypted) mode of GAAP offers no protection against an on-network attacker and is suitable only for deployment within a trusted domain where all participants are assumed non-malicious. When GAAP is deployed with out-of-band pre-shared keys and encryption, an attacker without the shared key cannot forge, replay-with-modification or selectively spoof Claim messages. This substantially mitigates the denial-of-allocation, timestamp-spoofing and bad-actor-list-poisoning threats. This does not protect against an authorized, keyed participant that behaves maliciously.¶
Encryption alone does not protect against a legitimate, keyed GAAP node behaving badly. The message validation guidance in Section 4 and the per-source rate limiting and duplicate-detection guidance in Section 6 apply regardless of whether encryption is in use. Rationale for three specific threats, with pointers to the normative mitigations defined elsewhere in this document, follows:¶
Even when an encrypted channel is used, a bad actor could be claiming a group address not derived from one of the group name inputs used for the Acceptable Group Hash List (see Definition of Terms section). This is why cooperating nodes ignore such messages rather than send Claim messages to correct the bad actor node, and why the bad-actor list is bounded and advisory rather than authoritative, per Section 6; a bad actor can spoof the source address of another node's Claim message, so source-address based mitigations are best-effort in any case.¶
A bad actor could send a fabricated or artificially early Timestamp giving it tie-breaking priority when a group address collision occurs. This is not mitigated by placing the sender on the bad-actor list, since losing a Timestamp comparison is the expected, honest behavior of one side of any ordinary collision and is not on its own evidence of bad faith - see Section 6. Instead, this is why a Timestamp that appears more than a small, locally configured skew allowance ahead of, or behind, the receiver's own clock is treated as an equal timestamp for tie-breaking purposes, per Section 4, rather than assumed to win or lose outright - since it may equally result from a misconfigured or unsynchronized clock rather than bad faith, and this comparison rule denies a fabricated Timestamp the outright win it was sent to obtain regardless of intent.¶
A bad actor could send messages too often and is not adhering to the random delay or periodic timer procedures in this document. This is why cooperating nodes ignore messages from a node on the bad-actor list rather than reset or cancel timers, or send triggered Claims, in response to them, per Section 6.¶
This section lists the IANA actions requested for GAAP, one per subsection.¶
IANA is requested to assign one UDP port number for the GAAP protocol from the User Ports range, registered per the Service Name and Transport Protocol Port Number Registry guidance in [RFC6335]. A User Ports assignment, rather than use of the Dynamic Ports range, is requested because GAAP Claim messages are sent to a well-known, IANA-assigned multicast group address by design (see Section 4 and "GAAP Protocol Multicast Addresses" below); a GAAP node cannot negotiate or discover a dynamically-chosen port for this traffic out of band the way an application-layer protocol with an existing rendezvous mechanism could, since GAAP itself is that rendezvous mechanism, so a fixed, documented port is necessary for interoperability among independently implemented GAAP nodes that have never communicated before. A System Ports assignment is not requested, since GAAP does not require privileged-port semantics and a User Ports assignment is sufficient.¶
| Service Name | Port Number | Transport Protocol | Description | Assignee | Contact | Reference |
|---|---|---|---|---|---|---|
| gaap | TBD (User Ports) | udp | GAAP Control Packets | IESG | IETF Chair | RFCXXXX |
IANA is requested to assign one multicast address from the IPv4 Internetwork Control Block 224.0.1.0/24 [RFC5771], and one multicast address from the IPv6 Variable Scope Multicast Addresses Block FF0X::/16, for the operation of the GAAP protocol. The registry description field for each entry should indicate "GAAP". GAAP control messages sent to these addresses are intended to reach all GAAP nodes within an administrative domain rather than being confined to a single link; consistent with that, the IPv4 address is requested from the Internetwork Control Block rather than the Local Network Control Block. The scope value X selected for the IPv6 address is expected to be admin-local or organization-local (not link-local), so that control messages can be forwarded beyond a single link when the deployment requires it; this requirement on implementations is stated normatively in Section 4.¶
| Address | Description | Reference |
|---|---|---|
| TBD1 (from 224.0.1.0/24) | GAAP | RFCXXXX |
| TBD2 (from FF0X::/16) | GAAP | RFCXXXX |
IANA is requested to create the "GAAP Message Types" registry in a new "Group Address Allocation Protocol (GAAP)" registry group. The registration policy is IETF Review. Each entry contains a Value (a 4-bit unsigned integer), a Name, and a Reference. The initial contents are:¶
| Value | Name | Reference |
|---|---|---|
| 0 | Reserved | RFCXXXX |
| 1 | Claim | RFCXXXX |
| 2-15 | Unassigned |
The authors would like to thank the following people for their motivation to start this draft. They include Chris Hopps, Acee Lindem, David Lamparter, Jeff Tantsura, Nate Karstens, and Lenny Giuliano. And thank you to Gunter Van de Velde for the extensive review prior to publication.¶
Note to the RFC Editor: please remove this appendix before publication as an RFC.¶
Submitted July 2026.¶
Addressed review comments from Gunter Van de Velde. Major changes: aligned the IPv4 address pseudocode with the requested /10 allocation; clarified that GAAP's collision detection is network-layer only; softened the encryption interoperability claim and recommended ChaCha20-Poly1305 [RFC8439] as a stronger alternative; made the dependency on draft-ietf-pim-updt-ipv6-dyn-mcast-addr-grp-id normative; added UDP usage guidance per RFC8085. Minor clarifications: distinguished the GAAP protocol address from the application allocation range; defined multi-record parsing rules and a Timestamp comparison/tie-breaking rule; removed the RFC8536 timestamp reference; marked the GAAP API as illustrative; fully specified the IPv6 address format; clarified the claim/response wait window, per-group-address suppression, and the new-node collision state machine; clarified that address release is local-only; clarified group-name uniqueness scope and GAAP's soft-state model; and aligned the IANA UDP port and multicast address requests with RFC6335 and RFC5771 guidance.¶
Changes made by Mike.¶
Initial posting November 2022.¶