IANA IPv4 Special Registry: TEST-NET-1, TEST-NET-2, TEST-NET-3 and Every Reserved Block Explained

IANA IPv4 Special Registry: TEST-NET-1, TEST-NET-2, TEST-NET-3 and Every Reserved Block Explained

192.0.2.0/24, 198.51.100.0/24 and 203.0.113.0/24 are the three IPv4 blocks reserved for documentation. IANA lists them as TEST-NET-1, TEST-NET-2 and TEST-NET-3 in its IPv4 Special-Purpose Address Space registry, next to 22 other entries that cover private networks, loopback, the carrier-grade NAT range and a few anycast services. The IPv6 registry has 25 entries of its own. Both were last updated on October 9, 2025.

This page goes through all 50. On September 29, 2026, we also sent one address from each entry to the Ipregistry API and checked the prefixes against RIPE's routing data, because "reserved" covers three different situations. Some addresses cannot be located because they exist in millions of networks at once. Some are bogons that should never show up in a packet. And a handful are announced in BGP right now and will answer you from anywhere.

How to read a row of the IANA special-purpose registries

Until 2013 the IETF cataloged special addresses by publishing a fresh RFC every few years, the last ones being RFC 5735 for IPv4 and RFC 5156 for IPv6. RFC 6890 (April 2013, BCP 153) replaced those with two living registries that share one set of columns. A new row requires IETF Review.

Five boolean columns carry the meaning. Source and Destination say whether an address from the block is valid in that field of a packet that transits two devices. Forwardable says whether a router may pass such a packet between external interfaces, and Globally Reachable whether it may travel beyond a single administrative domain. Reserved-by-Protocol is true when the defining RFC obliges every IP implementation to treat the block specially, as with 127.0.0.0/8.

The fourth column used to be called "Global". RFC 8190 renamed it in June 2017 because the word was ambiguous: an address can be global in allocation scope without being globally reachable. One rule ties the columns together: if Destination is false, Forwardable and Globally Reachable must be false too.

Block Source Destination Forwardable Globally reachable Reserved by protocol 10.0.0.0/8 Private-Use 100.64.0.0/10 Shared Address Space (CGNAT) 127.0.0.0/8 Loopback 169.254.0.0/16 Link Local 192.0.2.0/24 TEST-NET-1 (same for 2 and 3) 192.175.48.0/24 AS112 service 240.0.0.0/4 Reserved 255.255.255.255/32 Limited Broadcast 2001:db8::/32 Documentation 64:ff9b::/96 NAT64 well-known prefix fe80::/10 Link-Local Unicast True False
The five flags for eleven entries, as published by IANA. Documentation space has every flag set to False, as do the two umbrella blocks 192.0.0.0/24 and 2001::/23, which are usable only through the more specific entries inside them.

A word on names, since it changes what you type into a search box. IANA now titles the pages "IPv4 Special-Purpose Address Space" and "IPv6 Special-Purpose Address Space", each with a note saying it was formerly known as the IANA IPv4 (or IPv6) Special-Purpose Address Registry. The URLs still contain iana-ipv4-special-registry, and every RFC written before the rename uses the old name.

TEST-NET-1, TEST-NET-2 and TEST-NET-3, the documentation ranges

BlockNameRangeDefined by
192.0.2.0/24 Documentation (TEST-NET-1) 192.0.2.0 to 192.0.2.255 RFC 5737
198.51.100.0/24 Documentation (TEST-NET-2) 198.51.100.0 to 198.51.100.255 RFC 5737
203.0.113.0/24 Documentation (TEST-NET-3) 203.0.113.0 to 203.0.113.255 RFC 5737
2001:db8::/32 Documentation 2001:db8:: to 2001:db8:ffff:ffff:ffff:ffff:ffff:ffff RFC 3849
3fff::/20 Documentation 3fff:: to 3fff:fff:ffff:ffff:ffff:ffff:ffff:ffff RFC 9637

RFC 5737, written by Jari Arkko, Michelle Cotton and Leo Vegoda and published in January 2010, defines the three IPv4 blocks. 192.0.2.0/24 is the old one, which the RFC traces back to RFC 1166 of July 1990. The other two were added "primarily to ease the writing of examples involving addresses from multiple networks". With a single /24 you cannot draw a customer, a transit provider and a server on separate networks without making addresses up.

Their registry rows are the strictest possible, with all five columns set to False. A documentation address is not a valid source, not a valid destination, and no router should forward it. RFC 5737 adds that "these blocks are not for local use", which is where they differ from private space. 10.0.0.1 belongs on a LAN. 192.0.2.1 belongs in a PDF.

The reason to bother is that every other address belongs to someone, or will. RFC 5737 gives its own cautionary example: 128.66.0.0/16 "has been used for some examples in the past" but was never reserved, so it "can be used for regular address assignments with caution". An example that hardcodes 1.2.3.4 gets pasted into a config file sooner or later, and from then on a real network receives the traffic.

1. Inside a documentation block? 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24, 2001:db8::/32 or 3fff::/20 2. Inside private, shared or loopback space? 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 127.0.0.0/8, fc00::/7 3. Anything else 1.2.3.4, 8.8.8.8, 128.66.0.0/16, the address of your own office no no yes yes Use it No network will ever be assigned this address. Fine for a LAN example Wrong as a stand-in for a public address: it can never be one. Replace it Someone holds that address, or will.
Choosing an address for a README, a diagram or a test fixture.

Filtering these blocks is a SHOULD in the RFC, and operators have not always done it. RIPEstat shows none of its 327 RIS peers carrying any of the three prefixes on September 29, 2026, but its history has 192.0.2.0/24 in the routing table as late as April 28, 2020, and both 198.51.100.0/24 and 203.0.113.0/24 on January 30, 2023. (Registries slip too: ARIN's RDAP record for 198.51.100.0/24 is named TEST-NET-1.)

Private, shared and loopback space fill most of the IPv4 registry

Counted in addresses, five entries dominate. 240.0.0.0/4, the former Class E, holds 268,435,456 addresses that RFC 1112 (August 1989) reserves "for future addressing modes". Loopback (127.0.0.0/8), "this network" (0.0.0.0/8) and 10.0.0.0/8 take a /8 each, and 100.64.0.0/10 adds 4,194,304 more. All 25 entries together cover 324,274,176 addresses, or 7.55% of IPv4.

0 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 0 10 100 127 169 172 192 198 203 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 Whole /8 in the registry 0 this network, 10 private, 127 loopback 240 to 255 reserved (240.0.0.0/4) Part of the /8 in the registry 100: 100.64.0.0/10 shared address space 169: 169.254.0.0/16 link-local 172: 172.16.0.0/12 private 192: 192.168.0.0/16 and six /24s 198: 198.18.0.0/15, 198.51.100.0/24 203: 203.0.113.0/24 Multicast, 224 to 239 Kept in a separate IANA registry Ordinary unicast space 324,274,176 addresses in the 25 entries, 7.55% of IPv4
IPv4 as 256 blocks of 16.7 million addresses, one cell per /8, read left to right from 0 to 255.

The three RFC 1918 blocks (10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16, 17,891,328 addresses in total) are Forwardable but not Globally Reachable: routers inside one organization may carry them, and they stop at its edge. 100.64.0.0/10 has the same flags and a different tenant. RFC 6598 reserved it in April 2012 for the link between a carrier-grade NAT and the customer's router, so that an ISP's internal numbering never collides with the 192.168.1.0/24 behind the customer's own NAT. We covered what that does to location data in our post on CGNAT.

Link-local space, 169.254.0.0/16, is not Forwardable at all, so packets stay on the link where they were sent. That makes it a natural home for the instance metadata endpoint that cloud providers expose at 169.254.169.254. Benchmarking space (198.18.0.0/15, from RFC 2544) exists so that a test rig plugged into a production network by accident does not collide with anything real.

Some reserved blocks are routed on the internet today

Five IPv4 entries and nine IPv6 entries are marked Globally Reachable. The clearest case is AS112, an anycast service run by volunteer operators that absorbs reverse DNS queries for private addresses, the lookups for names like 1.1.168.192.in-addr.arpa that leak out of home and office networks. Its servers prisoner.iana.org, blackhole-1.iana.org and blackhole-2.iana.org live in 192.175.48.0/24 (RFC 7534), and the newer blackhole.as112.arpa sits at 192.31.196.1 and 2001:4:112::1 (RFC 7535).

These prefixes are as routed as a prefix gets. On September 29, 326 of 327 RIS peers carried 192.175.48.0/24 with origin AS112, and 324 carried 192.31.196.0/24.

Globally Reachable is a permission, though, and most blocks that have it are absent from the global table. No RIS peer saw a route for AMT (192.52.193.0/24 and 2001:3::/32), ORCHIDv2 (2001:20::/28), the drone remote ID prefix (2001:30::/28) or the NAT64 well-known prefix. The rest are single anycast addresses for protocols that need a fixed destination, such as 192.0.0.9 and 2001:1::1 for the Port Control Protocol.

Then there is the block that should be gone. RFC 7526 deprecated the 6to4 relay anycast prefix, 192.88.99.0/24, in May 2015, and the registry gives it a termination date. Eleven years later AS6939 (Hurricane Electric) still originates it, and 243 of 327 RIS peers see the route. The same AS originates 2002::/16 for 6to4 and 2001::/32 for Teredo.

The IPv6 registry, from 2001:db8::/32 to 64:ff9b::/96

IPv6 had a documentation prefix before IPv4 had three. APNIC allocated 2001:db8::/32 after a proposal in its own policy community, and RFC 3849 recorded it in July 2004. In August 2024 Geoff Huston and Nick Buraglio added 3fff::/20 through RFC 9637. Their argument was arithmetic: in August 2023, 25.9% of the 62,770 IPv6 allocations and assignments recorded by the RIRs were larger than a /32, so a /32 could not depict a large network with its real prefix lengths.

64:ff9b::/96 is the NAT64 well-known prefix from RFC 6052. An IPv6-only host reaches an IPv4 server by writing the IPv4 address into the low 32 bits, so 64:ff9b::808:808 means 8.8.8.8 by way of a translator. Its sibling 64:ff9b:1::/48 (RFC 8215) is for translation inside one network and is not Globally Reachable. The mechanics are in our RFC 10001 post.

Most recent additions are on the IPv6 side: 2001:30::/28 for drone remote identification tags (RFC 9374), 5f00::/16 for SRv6 segment identifiers (RFC 9602), and 100:0:0:1::/64, a dummy prefix that RFC 9780 introduced in May 2025 as the destination for OAM packets such as BFD over MPLS, in place of an IPv4-mapped loopback address.

Every entry, with what a lookup returns

The two tables below reproduce the registries as of September 29, 2026. The last column is what the Ipregistry API answered for an address inside the block. Error is HTTP 400 with the code RESERVED_IP_ADDRESS. Bogon is HTTP 200 with security.is_bogon set to true. Record is HTTP 200 with is_bogon false.

IPv4 Special-Purpose Address Space, 25 entries.
BlockNameRFCGlobally reachableLookup
0.0.0.0/8 This network RFC 791 No Error
0.0.0.0/32 This host on this network RFC 1122 No Error
10.0.0.0/8 Private-Use RFC 1918 No Error
100.64.0.0/10 Shared Address Space RFC 6598 No Error
127.0.0.0/8 Loopback RFC 1122 No Error
169.254.0.0/16 Link Local RFC 3927 No Error
172.16.0.0/12 Private-Use RFC 1918 No Error
192.0.0.0/24 IETF Protocol Assignments RFC 6890 No Bogon
192.0.0.0/29 IPv4 Service Continuity Prefix RFC 7335 No Bogon
192.0.0.8/32 IPv4 dummy address RFC 7600 No Bogon
192.0.0.9/32 Port Control Protocol Anycast RFC 7723 Yes Bogon
192.0.0.10/32 Traversal Using Relays around NAT Anycast RFC 8155 Yes Bogon
192.0.0.170/32, 192.0.0.171/32 NAT64/DNS64 Discovery RFC 8880, RFC 7050 No Bogon
192.0.2.0/24 Documentation (TEST-NET-1) RFC 5737 No Bogon
192.31.196.0/24 AS112-v4 RFC 7535 Yes Record (AS112)
192.52.193.0/24 AMT RFC 7450 Yes Record
192.88.99.0/24 Deprecated (6to4 Relay Anycast) RFC 7526 Deprecated Bogon
192.88.99.2/32 6a44-relay anycast address RFC 6751 No Bogon
192.168.0.0/16 Private-Use RFC 1918 No Error
192.175.48.0/24 Direct Delegation AS112 Service RFC 7534 Yes Record (AS112)
198.18.0.0/15 Benchmarking RFC 2544 No Bogon
198.51.100.0/24 Documentation (TEST-NET-2) RFC 5737 No Bogon
203.0.113.0/24 Documentation (TEST-NET-3) RFC 5737 No Bogon
240.0.0.0/4 Reserved RFC 1112 No Bogon
255.255.255.255/32 Limited Broadcast RFC 8190, RFC 919 No Bogon
IPv6 Special-Purpose Address Space, 25 entries.
BlockNameRFCGlobally reachableLookup
::1/128 Loopback Address RFC 4291 No Error
::/128 Unspecified Address RFC 4291 No Error
::ffff:0:0/96 IPv4-mapped Address RFC 4291 No Bogon
64:ff9b::/96 IPv4-IPv6 Translat. RFC 6052 Yes Record (empty)
64:ff9b:1::/48 IPv4-IPv6 Translat. RFC 8215 No Bogon
100::/64 Discard-Only Address Block RFC 6666 No Bogon
100:0:0:1::/64 Dummy IPv6 Prefix RFC 9780 No Bogon
2001::/23 IETF Protocol Assignments RFC 2928 No Record
2001::/32 TEREDO RFC 4380, RFC 8190 N/A Bogon
2001:1::1/128 Port Control Protocol Anycast RFC 7723 Yes Record
2001:1::2/128 Traversal Using Relays around NAT Anycast RFC 8155 Yes Record
2001:1::3/128 DNS-SD Service Registration Protocol Anycast RFC 9665 Yes Record
2001:2::/48 Benchmarking RFC 5180 No Bogon
2001:3::/32 AMT RFC 7450 Yes Record
2001:4:112::/48 AS112-v6 RFC 7535 Yes Record (AS112)
2001:10::/28 Deprecated (previously ORCHID) RFC 4843 Deprecated Bogon
2001:20::/28 ORCHIDv2 RFC 7343 Yes Record
2001:30::/28 Drone Remote ID Protocol Entity Tags (DETs) Prefix RFC 9374 Yes Record
2001:db8::/32 Documentation RFC 3849 No Bogon
2002::/16 6to4 RFC 3056 N/A Bogon
2620:4f:8000::/48 Direct Delegation AS112 Service RFC 7534 Yes Record (AS112)
3fff::/20 Documentation RFC 9637 No Bogon
5f00::/16 Segment Routing (SRv6) SIDs RFC 9602 No Bogon
fc00::/7 Unique-Local RFC 4193, RFC 8190 No Error
fe80::/10 Link-Local Unicast RFC 4291 No Error

Two things are absent. Multicast (224.0.0.0/4 and ff00::/8) has registries of its own, and unallocated space is not special-purpose at all. That is the territory of bogon lists, which combine these reserved blocks with whatever the RIRs have not handed out yet.

What an IP geolocation API returns for a reserved address

Private, shared, loopback, link-local and unique-local addresses are refused outright, and so are 0.0.0.0/8, the unspecified address :: and multicast:

https://api.ipregistry.co/10.1.2.3?key=YOUR_API_KEY

HTTP 400
{
  "code": "RESERVED_IP_ADDRESS",
  "message": "You tried to look up a site local (private) IP address. This kind of IP address cannot be used to deduce geolocation data (learn more at https://en.wikipedia.org/wiki/Private_network).",
  "resolution": "If you got the address from a user request, you should consider the request as a threat. Otherwise, retry with a public and non-reserved IPv4 or IPv6 address."
}

There is nothing to look up. 10.1.2.3 exists in millions of networks at the same moment, and no database can know which one you mean. The resolution field is blunt about an address like this arriving in a user request: "you should consider the request as a threat". The usual culprit is more boring. If your application logs 10.x or 100.64.x addresses as client IPs, it is reading the socket address of its own load balancer and should be parsing the forwarding header that balancer sets.

Documentation, benchmarking, protocol-assignment and Class E addresses get a response, with the bogon flag raised and every location field null:

https://api.ipregistry.co/203.0.113.7?key=YOUR_API_KEY&fields=ip,type,location.country.code,connection.asn,connection.organization,connection.route,security.is_bogon

HTTP 200
{
  "connection": {
    "asn": null,
    "organization": null,
    "route": null
  },
  "ip": "203.0.113.7",
  "location": {
    "country": {
      "code": null
    }
  },
  "security": {
    "is_bogon": true
  },
  "type": "IPv4"
}

Entries that are announced in BGP come back as ordinary records. 192.175.48.1 returns AS112, DNS-OARC, the route 192.175.48.0/24 and is_anycast: true. A city comes attached, but for a prefix served from many sites at once it is registry bookkeeping, and the same goes for protocol anycast addresses like 2001:1::1 that nobody announces. Trust the ASN and ignore the city.

Transition addresses need one step of preprocessing. 64:ff9b::808:808 returns an empty record that is not flagged as a bogon, so to learn where that traffic ends up, take the low 32 bits and look up 8.8.8.8. An IPv4-mapped address such as ::ffff:808:808 already resolves to the location of the embedded IPv4 address, with the bogon flag set because the mapped form is not valid on the wire.

Checking an address against the registry in code

IANA publishes both registries as CSV, so a checker does not need a hardcoded list that goes stale. This Python function downloads them and returns the most specific matching entry. Specificity matters inside 192.0.0.0/24, where a /32 can carry different flags from the /24 around it.

import csv
import ipaddress
import re
import urllib.request

REGISTRY = ("https://www.iana.org/assignments/iana-ipv{v}-special-registry/"
            "iana-ipv{v}-special-registry-1.csv")


def load_registry():
    entries = []
    for version in (4, 6):
        with urllib.request.urlopen(REGISTRY.format(v=version)) as response:
            lines = response.read().decode().splitlines()
        for row in csv.DictReader(lines):
            # Drop footnote markers like "[2]" and split "a/32, b/32" cells
            blocks = re.sub(r"\[\d+\]", "", row["Address Block"]).split(",")
            for block in blocks:
                entries.append((ipaddress.ip_network(block.strip()), row))
    return entries


def special_purpose(address, entries):
    ip = ipaddress.ip_address(address)
    matches = [(net, row) for net, row in entries
               if net.version == ip.version and ip in net]
    # The most specific block wins: 192.0.0.9/32 beats 192.0.0.0/24
    return max(matches, key=lambda match: match[0].prefixlen, default=None)
>>> entries = load_registry()
>>> special_purpose("203.0.113.7", entries)[1]["Name"]
'Documentation (TEST-NET-3)'
>>> special_purpose("192.0.0.9", entries)[1]["Name"]
'Port Control Protocol Anycast'
>>> special_purpose("8.8.8.8", entries) is None
True

Cache the result in production. The registries change slowly: 16 new rows from 2014 to 2025, and none at all in half of those years.

Python's built-in ipaddress module reads the same registries, but its property names mislead. On Python 3.14, ip_address("192.0.2.1").is_private is True although documentation space is not private, ip_address("100.64.1.1").is_private is False, and ip_address("192.88.99.1").is_global is True for a prefix deprecated in 2015.

Ipregistry returns the bogon flag, the origin ASN and the anycast flag in the same response as the location, so a single call tells you whether an address can be located at all. A free account comes with 20,000 lookups to get started.

Engage customers with in-app updates using Noticeable Keep users in the loop Ship release notes that get read. Try Noticeable

Get started with 20,000 free lookups: sign up