IPv6: Motivation and Datagram Format

In 1981, IPv4 shipped with a 32-bit address field. That was enough for about 4.3 billion unique addresses. Nobody designing the early ARPANET imagined billions of phones, sensors, cars, and light bulbs. Each of these would want a globally routable address. By the early 2010s the Internet Assigned Numbers Authority had handed out the last free blocks of IPv4 space. Regional registries began rationing what remained. The stopgap that kept the Internet running was Network Address Translation (NAT). It let many private hosts share one public address. But it broke the end-to-end model the Internet was built on. It also complicated everything from peer-to-peer gaming to VoIP. IPv6 is the long-planned replacement for IPv4's addressing scheme. It was engineered not just to widen the address space. It also aimed to simplify router processing and clean up decades of accumulated header cruft. Its headline feature is a 128-bit address. This is large enough to assign a unique address to every grain of sand on Earth many times over. Its less-advertised but equally important feature is a redesigned header. This header has a fixed length of 40 bytes. Routers can parse and forward it with far less work. This is compared to IPv4's variable-length, option-laden header. This article explains why IPv4 addresses ran out. It shows how IPv6 solves the exhaustion problem structurally rather than cosmetically. It also explains exactly what changed in the datagram format. This is done field by field, compared side by side with IPv4. It also covers how the Internet is transitioning between the two protocols. IPv4 and IPv6 hosts must coexist for years, likely decades. This will continue before any global cutover is complete. The payoff is a clear mental model of two coexisting internets. One is running out of room and patched together with translation boxes. The other is designed from scratch with abundant address space. It also has a leaner packet format. Understanding both is essential background. So is understanding the mechanisms that bridge them. This knowledge is needed before studying how routers actually find paths through a network. That is the subject of Routing Algorithms: The Graph Abstraction.

Key takeaways
  • IPv4's 32-bit address space (~4.3 billion addresses) was exhausted by growth that its 1981 designers never anticipated.
  • IPv6 uses 128-bit addresses (2¹²⁸ ≈ 3.4×10³⁸), eliminating exhaustion for any realistic future demand.
  • The IPv6 header is fixed at 40 bytes, drops five IPv4 fields, and removes in-network fragmentation and header checksums.
  • Extension headers replace IPv4's options mechanism, keeping the common-case header lean while allowing optional features.
  • Dual-stack, tunneling, and NAT64/translation are the three main strategies for IPv4-IPv6 interoperability during transition.
  • IPv6 adoption is real but partial — global deployment sits well under 50% of traffic by most measurements, so transition mechanisms remain essential infrastructure.
The core insight

IPv6 solves address exhaustion by quadrupling the address width to 128 bits while simultaneously simplifying the packet header so routers do less work per datagram, not more.

The idea

An IP address is the numeric identifier a host uses to be reachable on an internetwork; IPv4 encodes it in 32 bits, giving a theoretical maximum of 2³² ≈ 4,294,967,296 addresses. In practice usable space is far smaller once you subtract reserved ranges (private blocks like 10.0.0.0/8, loopback, multicast, and other special-use allocations). Combined with historically wasteful allocation — entire /8 blocks (16.7 million addresses each) handed to single organizations in the 1980s — the effective supply ran out much faster than the raw bit-count suggests. Address exhaustion is the structural depletion of unallocated IPv4 space by regional Internet registries, formally completed for the last major registries between 2011 and 2019.

IPv6 is the successor Internet Protocol standardized to eliminate this ceiling by widening the address field to 128 bits, a change specified in RFC 8200 (obsoleting the earlier RFC 2460). Because address length appears in the very first bits of the packet header, this single decision cascades into a full header redesign: fields that existed in IPv4 largely to manage fragmentation, options, and variable header length were reconsidered from scratch. The result is the IPv6 datagram format, a fixed 40-byte base header followed by an optional chain of extension headers, each identified by a "Next Header" field that plays the role IPv4's Protocol field played but generalizes it into a linked list of header types. A second, distinct idea completes the picture: because IPv6 cannot be deployed everywhere overnight, the Internet needs transition mechanisms — protocols and translation devices that let IPv4-only, IPv6-only, and dual-stack hosts communicate during the multi-decade migration. The three canonical strategies are dual stack (a host or router runs both protocols simultaneously), tunneling (IPv6 packets are encapsulated inside IPv4 packets to cross IPv4-only segments), and translation (a gateway rewrites IPv4 packets into IPv6 packets and vice versa, extending the logic of NAT to cross protocol versions rather than just address spaces).

How it works

Why IPv4 ran out: the arithmetic of exhaustion

IPv4 addresses are 32 bits, structured historically into classes (A, B, C) and later allocated via CIDR (Classless Inter-Domain Routing) in variable-size blocks written as `address/prefix-length`. The core problem is not merely that 4.3 billion is "too small" for billions of devices — it is that address blocks were allocated in large, inflexible chunks decades before efficient allocation practices (and NAT) existed, so huge swaths of address space sat unused inside organizations while the free pool at IANA shrank to zero. Once free pools hit zero, new networks could only obtain addresses via transfer markets or through techniques like NAT and Carrier-Grade NAT (CGN), which let ISPs share one public address among thousands of subscribers by rewriting port numbers.

The 128-bit address

An IPv6 address is written as eight groups of four hexadecimal digits separated by colons, for example: ``` 2001:0db8:85a3:0000:0000:8a2e:0370:7334 ``` Two shorthand rules keep this readable: 1. Leading zeros in each 16-bit group may be dropped: `0db8` → `db8`. 2. One run of consecutive all-zero groups may be replaced with `::` (used at most once per address, to avoid ambiguity). Applying both rules to the address above gives `2001:db8:85a3::8a2e:370:7334`. The address space, 2¹²⁸ ≈ 3.4 × 10³⁸ addresses, is often described informally as enough to assign roughly 6 × 10²³ addresses per square meter of the Earth's surface — the point is not precision but the fact that exhaustion under any realistic growth model is not a near-term concern. IPv6 addresses are typically structured as a 64-bit network prefix (assigned by providers, used for routing) plus a 64-bit interface identifier (often derived from the device's hardware MAC address via EUI-64, or randomized for privacy). This 64/64 split is a deliberate simplification: unlike IPv4's variable-length subnetting battles, IPv6 subnets are conventionally always /64, which drastically simplifies address planning and eliminates most subnetting arithmetic that trips up IPv4 network engineers.

The header redesign

IPv4's header is 20 bytes minimum but variable up to 60 bytes with options, and includes several fields that impose per-packet router work:

Field (IPv4)PurposeKept in IPv6?
VersionProtocol version (4)Yes (as 6)
Header Length (IHL)Variable header sizeRemoved — header is fixed length
Type of ServiceQoS markingRenamed Traffic Class
Total LengthWhole datagram lengthReplaced by Payload Length (payload only)
Identification, Flags, Fragment OffsetFragmentation controlRemoved from base header — moved to extension header, host-only
Time to Live (TTL)Hop limitRenamed Hop Limit, same semantics
ProtocolUpper-layer demuxRenamed Next Header, generalized
Header ChecksumHeader-only checksum, recomputed at every hopRemoved entirely
OptionsVariable-length extrasReplaced by chained Extension Headers
Source/Destination Address32 bits each128 bits each

Three removals deserve emphasis because they explain most of the performance gain routers see with IPv6:

  • No header checksum. IPv4 routers recompute the header checksum at every hop because the TTL field changes each hop, forcing a checksum update. IPv6 drops this entirely, relying on link-layer checksums (Ethernet CRC) and end-to-end transport checksums (TCP/UDP) to catch corruption. This is a deliberate layering argument: if the ends already verify correctness, redundant per-hop verification is wasted work on every router in the path.
  • No in-network fragmentation. In IPv4, any router along a path may fragment a datagram that exceeds the next link's MTU — see IP Fragmentation and the TTL Field. IPv6 forbids this: only the source host may fragment, and it must first discover the path MTU (via ICMPv6 "Packet Too Big" messages) and fragment before sending. Routers that cannot forward an oversized packet simply drop it and send an error back to the sender. This removes a costly, stateful operation from the router's fast path entirely.
  • Fixed-length header. IPv4's variable IHL field means a router must read the header length before it knows where the payload starts. IPv6's header is always exactly 40 bytes, so a router can jump straight to a known offset, simplifying hardware pipelining.

The IPv6 base header, field by field

``` 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| Traffic Class | Flow Label | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Payload Length | Next Header | Hop Limit | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Source Address (128 bits) + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + + | | + Destination Address (128 bits) + | | + + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ```

  • Version (4 bits): always `0110` (6).
  • Traffic Class (8 bits): analogous to IPv4's Type of Service; used for QoS/differentiated services marking.
  • Flow Label (20 bits): a new field. Routers can use it, together with source/destination address, as a hash key to keep all packets of one flow on the same path without inspecting transport-layer ports — useful for load balancing and for keeping encrypted traffic's flow identifiable without decryption.
  • Payload Length (16 bits): length of everything after the base header (extension headers + upper-layer data), in bytes. Unlike IPv4's Total Length, it excludes the header itself, since the header is always 40 bytes.
  • Next Header (8 bits): identifies the type of the header immediately following — either an extension header (e.g., Hop-by-Hop Options, Fragment, Routing) or an upper-layer protocol (TCP = 6, UDP = 17), generalizing IPv4's Protocol field into a chain.
  • Hop Limit (8 bits): decremented by each forwarding router; datagram is discarded when it reaches zero. Functionally identical to IPv4's TTL, renamed to reflect what it actually measures.
  • Source / Destination Address (128 bits each): the enlarged addresses.

Extension headers as a linked list

Where IPv4 crammed optional features into a variable-length Options field inside the main header (forcing every router to at least check for options), IPv6 chains extension headers after the fixed base header, each carrying its own Next Header field pointing to the next one: ``` [ IPv6 base header ] -> Next Header = Routing [ Routing header ] -> Next Header = Fragment [ Fragment header ] -> Next Header = TCP [ TCP segment ] ``` A router that does not need to process a particular extension header (most routers only care about the base header and the final upper-layer protocol) can, in principle, skip past known extension header types using their fixed or self-declared lengths, without parsing their contents — keeping the router's fast path lean while still allowing sources to attach arbitrary optional metadata.

Pseudocode: forwarding logic contrast

The following pseudocode makes the router-side simplification concrete by contrasting the core forwarding decision loop for IPv4 versus IPv6. ``` // IPv4 router forwarding (simplified core loop) function forward_ipv4(packet): if packet.TTL == 0: send_icmp_time_exceeded(packet) drop(packet) return if not checksum_valid(packet.header): // must verify on every hop drop(packet) return packet.TTL = packet.TTL - 1 packet.header_checksum = recompute_checksum(packet.header) // must redo every hop next_hop, out_link = lookup_route(packet.dest_addr) if packet.length > mtu(out_link): if packet.flags.DF == false: fragments = fragment(packet, mtu(out_link)) // router does the work for f in fragments: send(f, out_link) else: send_icmp_frag_needed(packet) drop(packet) return send(packet, out_link)

// IPv6 router forwarding (simplified core loop) function forward_ipv6(packet): if packet.hop_limit == 0: send_icmpv6_time_exceeded(packet) drop(packet) return packet.hop_limit = packet.hop_limit - 1 // no checksum to verify or recompute — none exists in the header next_hop, out_link = lookup_route(packet.dest_addr) if packet.length > mtu(out_link): send_icmpv6_packet_too_big(packet, mtu(out_link)) // router never fragments drop(packet) return skip_extension_headers_if_unneeded(packet) // O(1) jump for the common case send(packet, out_link) ``` Two lines disappear entirely in the IPv6 version — checksum verification and checksum recomputation — and the fragmentation branch collapses from "fragment-or-signal" to "always signal, never fragment." Both changes remove per-packet, per-hop CPU work that scales with the size of the Internet's core routing infrastructure, which is exactly where such savings matter most.

Figure
IPv4 header vs. IPv6 header: field-by-field layout
IPv4 header (20–60 bytes, variable) Ver IHL Type of Svc Total Length Flags FragOff TTL Protocol Hdr Checksum Source Address (32 bits) Destination Address (32 bits) Options (variable, 0–40 bytes) IPv6 header (fixed 40 bytes) Ver Traffic Class Flow Label Payload Length NextHdr HopLim Source Address (128 bits) Destination Address (128 bits) Removed vs IPv4: — Header Length (fixed size now) — Header Checksum (0 verify/hop) — Fragment fields (host-only now) — Options (moved to ext. headers) Net effect: 40-byte fixed header, less per-hop router work IPv4 addresses (32 bits each) IPv6 addresses (128 bits each)

Transition mechanisms

Because the base of Internet-connected devices cannot flip to IPv6 simultaneously, three interoperability strategies coexist: 1. Dual stack. A host or router runs both IPv4 and IPv6 stacks side by side. When communicating, it picks whichever protocol both endpoints support, typically preferring IPv6 (Happy Eyeballs algorithms in modern OSes race both and use whichever connects faster). This is conceptually simplest but requires every device and every hop to eventually support both stacks — expensive at global scale, and it does not by itself reduce IPv4 address consumption. 2. Tunneling. When an IPv6-capable segment needs to cross an IPv4-only network (or vice versa), the sending router encapsulates the IPv6 datagram whole, header and all, inside the payload of an IPv4 datagram, then the receiving tunnel endpoint strips the IPv4 wrapper and forwards the original IPv6 packet onward. This is exactly the encapsulation idea used for VPNs, generalized across protocol versions rather than across administrative domains. 3. Translation (e.g., NAT64/DNS64). A gateway rewrites packets between address families entirely, translating an IPv6 packet's header into an IPv4 header (and its 128-bit address into a 32-bit one via a mapping table) so an IPv6-only client can reach an IPv4-only server, and back again for the response. This extends the rewriting idea behind Network Address Translation (NAT) from "share one IPv4 address among many hosts" to "bridge two entirely different address families," at the cost of the same end-to-end transparency problems NAT already introduces (breaking protocols that embed IP addresses in payloads, complicating peer-to-peer connectivity, requiring per-flow state at the gateway). ``` function tunnel_encapsulate(ipv6_packet, tunnel_endpoint_ipv4_addr): ipv4_wrapper = new_ipv4_header() ipv4_wrapper.protocol = 41 // "IPv6 encapsulated in IPv4" ipv4_wrapper.dest_addr = tunnel_endpoint_ipv4_addr ipv4_wrapper.payload = ipv6_packet // entire IPv6 datagram, header included return ipv4_wrapper function tunnel_decapsulate(ipv4_packet): if ipv4_packet.protocol != 41: error("not a v6-in-v4 tunnel packet") return ipv4_packet.payload // recovers original IPv6 datagram unchanged ```

Complexity & correctness

Address space sufficiency. IPv4 supplies at most 2³² ≈ 4.29 × 10⁹ addresses; even under the generous assumption that every allocated address is fully utilized, this cannot uniquely address a world with tens of billions of networked devices plus redundant addressing needs (multiple interfaces per host, subnetting overhead, reserved ranges). IPv6 supplies 2¹²⁸ ≈ 3.4 × 10³⁸ addresses — a factor of roughly 2⁹⁶ (about 7.9 × 10²⁸) more than IPv4. Even reserving huge fractions of this space for hierarchical routing aggregation (which IPv6 does deliberately, unlike IPv4's historically ad hoc allocation), the remaining usable space vastly exceeds any addressing demand extrapolated from current device growth trends. This is not a probabilistic argument, it is a counting argument: the exhaustion problem is solved by brute enlargement of the identifier space, not by cleverer reuse.

Per-hop processing cost. Consider a router forwarding nn packets per second, sustained. In IPv4, each packet requires:

  • one checksum verification, O(L)O(L) in header length LL (typically 20–60 bytes), and
  • one checksum recomputation after decrementing TTL, also O(L)O(L).

In IPv6, both operations are O(0)O(0) — they simply do not exist in the base header path. Removing a constant per-packet cost does not change asymptotic big-OO complexity of "forward nn packets" (both are O(n)O(n) in the number of packets), but it materially reduces the constant factor per packet, which is exactly what matters for line-rate router hardware operating in the nanoseconds-per-packet regime. At core-router scale (hundreds of millions of packets per second), even a small constant-factor reduction per packet is the difference between a design that fits in a hardware fast path and one that needs software fallback.

Fragmentation cost shift. In IPv4, a router performing fragmentation must: split the payload into MTU-sized pieces, replicate and adjust the header for each fragment (recomputing Total Length, Fragment Offset, Flags, and the checksum for each piece), and potentially cause reassembly failures or performance cliffs at the destination if fragments are lost or reordered — this is exactly the fragmentation machinery discussed in IP Fragmentation and the TTL Field. IPv6 moves this entire cost to the sender: the source must perform Path MTU Discovery (send progressively, react to ICMPv6 "Packet Too Big" messages, cache the discovered MTU per destination) before transmitting oversized data. The total work done to deliver oversized data does not vanish — someone must still fragment it — but it is relocated from every router along the path (an O(path length)O(\text{path length}) multiplier on fragmentation cost in the worst case, since a packet could theoretically be refragmented at each hop under old IPv4 semantics) to a single point, the sender, performing it once. This is a genuine efficiency win for the shared network core, traded for extra state (an MTU cache) and one additional round trip's worth of latency at the sender when MTU is first discovered.

Correctness of the extension header chain. The key invariant maintained by the Next Header linked-list design is: at every point in the header chain, the current header unambiguously determines the type and, where necessary, the length of the header that follows. This lets a router (or host) walk the chain safely: ``` function parse_headers(packet): offset = 40 // base header is always exactly 40 bytes next_type = packet.base_header.next_header while next_type is an extension header type: ext = read_header_at(packet, offset) next_type = ext.next_header offset = offset + ext.length_in_bytes() // self-describing length // next_type now names the upper-layer protocol (TCP=6, UDP=17, ...) return offset, next_type ``` Termination is guaranteed because each extension header type has a well-defined, computable length (either fixed by specification or self-declared via a length field inside the header), so `offset` strictly increases each iteration and the loop cannot run past the packet's actual size without hitting a terminal upper-layer Next Header value or the end of the payload — the same "walk a chain until you hit a known terminator" invariant that underlies any linked-list traversal.

Honest tradeoffs. IPv6 is not strictly superior in every dimension. The 128-bit addresses roughly double the per-packet header overhead compared to IPv4's 32-bit addresses even before counting other field changes (40 bytes minimum versus 20 bytes minimum), which matters for very small packets (VoIP, IoT telemetry) where header-to-payload ratio affects effective throughput. Extension header chains, while elegant, complicate middlebox processing (a firewall wanting to see the transport-layer port must walk the whole chain, which is more work than reading a fixed offset in IPv4) — this has led some real-world middleboxes to drop packets with unfamiliar extension headers as a security-conservative default, a practical deployment headache the original design did not fully anticipate.

Worked example

Trace a single web request — a client at address `2001:db8:1::10` fetching from a server at `2001:db8:2::80` over TCP, with the packet passing through two intermediate routers, R1 and R2, where R2's outbound link has a smaller MTU than the packet.

StepActorIPv4 behaviorIPv6 behavior
1. Packet builtClient host20-byte header, checksum computed once40-byte header, no checksum field to compute
2. Arrives at R1R1Verify header checksum; decrement TTL; recompute checksum; forwardDecrement Hop Limit; forward (no checksum work)
3. Arrives at R2, packet too big for R2's outbound linkR2R2 fragments the packet itself into two IPv4 fragments, recomputing headers/checksums for each, forwards bothR2 cannot fragment; drops the packet and sends an ICMPv6 "Packet Too Big" message back to the client stating the link's MTU
4. Client reactionClient hostNo action needed — fragmentation was transparent to the clientClient receives ICMPv6 error, updates its cached Path MTU estimate for this destination, and resegments/refragments the original data itself before resending
5. Delivery to serverServerServer's IP layer reassembles the two IPv4 fragments before handing data to TCPServer receives correctly-sized IPv6 packets requiring no reassembly at this stage
6. Response pathServer → clientSymmetric process in reverseSymmetric process in reverse, with the client's cached Path MTU now avoiding a repeat of the too-big error

What the trace demonstrates. The IPv4 path appears to succeed faster on the first send (no round trip needed) but pushes fragmentation-and-reassembly work onto R2 and the server, work repeated on every oversized flow through that router for every affected packet. The IPv6 path costs one extra round trip on the very first oversized packet (the ICMPv6 error) but after that the client's Path MTU cache means every subsequent packet is correctly sized before it ever reaches R2 — R2 does zero fragmentation work for the remainder of the connection. For a long-lived flow (e.g., a large file transfer or a persistent connection), the amortized cost strongly favors IPv6's design: one discovery round trip versus per-packet, per-router fragmentation overhead for the flow's entire duration. A second short trace shows address compression in practice. A router's routing table stores the server's network as the prefix `2001:0db8:0002:0000::/64`. Written in compressed form (drop leading zeros in each group, collapse the longest run of all-zero groups to `::`): ``` 2001:0db8:0002:0000:0000:0000:0000:0000/64 → drop leading zeros per group: 2001:db8:2:0:0:0:0:0/64 → collapse the run of all-zero groups: 2001:db8:2::/64 ``` The client address `2001:db8:1::10` matches a different /64 prefix (`2001:db8:1::/64`), so R1 and R2 must consult a longest-prefix-match routing table exactly as in IPv4 — the address width changed, but the fundamental forwarding lookup mechanism (longest prefix match), a topic developed further under Routing Algorithms: The Graph Abstraction, is unchanged in spirit.

Common pitfalls & traps

PitfallWhy it happensFix
Assuming IPv6 addresses can compress `::` twiceLearners generalize the zero-compression rule without noticing the ambiguity it createsRemember: `::` may appear at most once per address; two occurrences make the expansion ambiguous and are invalid
Believing IPv6 headers still support in-network fragmentation via a Fragment field like IPv4The base header genuinely lacks fragment fields, but a Fragment extension header still exists for source-side useOnly the originating host may use it; routers never fragment in transit — memorize this as a hard rule, not a preference
Forgetting Payload Length excludes the base headerIPv4's Total Length includes the header, so learners assume symmetryIPv6's Payload Length counts only bytes after the 40-byte base header; add 40 to get total datagram size
Treating NAT64/dual-stack/tunneling as interchangeableAll three "make IPv4 and IPv6 talk," so the mechanisms blur togetherDual stack avoids translation by running both stacks; tunneling carries one protocol unmodified inside the other; translation actually rewrites headers between families — know which one preserves end-to-end semantics (dual stack) and which one breaks them (translation, like NAT)
Assuming removing the header checksum makes IPv6 less reliableChecksums feel like a safety feature, so removing one sounds riskyReliability is preserved by link-layer (Ethernet CRC) and transport-layer (TCP/UDP) checksums; the IPv4 header checksum was redundant work repeated at every hop, not the only line of defense

Pioneers & history

The transition from IPv4 to IPv6 was less the work of a single inventor than a sustained standards effort by the Internet Engineering Task Force (IETF) once address exhaustion became foreseeable in the early 1990s. Steve Deering is generally credited as the primary architect of what became IPv6 (originally called "SIPP," Simple Internet Protocol Plus, one of several competing proposals evaluated by the IETF's IPng — "IP: The Next Generation" — process).

Origins · 1 minSteve Deering and how this was discovered
SD
Steve Deering
born 1955 · Xerox PARC and Cisco Systems, architect of IP multicast and lead designer of IPv6's addressing and header format

Deering's earlier work on IP multicast at Stanford shaped his approach to IPv6: he pushed for a header design that routers could process with minimal per-packet state, directly informing the decision to drop in-network fragmentation and the header checksum.

History
- 1981: RFC 791 formalizes IPv4 with its 32-bit address field, adequate for the ARPANET-era Internet.
- 1992: The IETF launches the "IPng" (IP next generation) process after projections show IPv4 exhaustion within decades.
- 1995: RFC 1883 publishes the first IPv6 specification (then called IPv6, successor to earlier "SIPP" proposals).
- 1998: RFC 2460 supersedes RFC 1883, becoming the widely implemented IPv6 standard for the following two decades.
- 2011: IANA allocates its last remaining IPv4 /8 blocks to the five regional Internet registries.
- 2017: RFC 8200 formally obsoletes RFC 2460, cleaning up ambiguities accumulated over nearly two decades of deployment experience.

Where this matters

Every major operating system (Windows, macOS, Linux, Android, iOS) ships dual-stack networking by default, silently preferring IPv6 when both the local network and the remote server support it — this is why "IPv6 test" websites report large fractions of mobile traffic already using IPv6 even though most users are unaware of the protocol underneath. Mobile carriers, facing the largest device-growth pressure of any access network, were among the earliest large-scale adopters, commonly deploying IPv6-only radio access networks paired with NAT64/DNS64 translation gateways so phones can still reach the IPv4-only remainder of the web. Content delivery networks and hyperscale cloud providers (serving a large fraction of global web traffic) have supported IPv6 for years, meaning a client with a working IPv6 path often reaches popular destinations without ever touching IPv4 or a NAT device at all. Home routers increasingly run dual stack out of the box, tunneling IPv6 over an ISP's IPv4-only last-mile infrastructure via mechanisms like 6rd or DS-Lite where native IPv6 delivery isn't yet available. Understanding the header format and transition mechanisms described here is prerequisite background for network engineers configuring routing policy, for security teams writing firewall rules that must correctly parse extension header chains, and for anyone studying how Routing Algorithms: The Graph Abstraction computes paths across a network that, in practice, is really two overlapping networks in the middle of a decades-long handover.

Ask the tutor: How does Path MTU Discovery actually work step by step when an IPv6 sender's first packet is too large for the path?

Why does IPv6 use 128 bits instead of some smaller number that still exceeds IPv4's 32?

Beyond simply outlasting exhaustion, 128 bits was chosen to support a deliberately wasteful, hierarchical addressing structure that makes routing aggregation and address autoconfiguration easy rather than merely sufficient. IPv6 conventionally allocates a full /64 to every subnet — 64 bits of network prefix and 64 bits of interface identifier — even though a /64 alone (2⁶⁴ addresses) already dwarfs IPv4's entire space. This generosity lets interface identifiers be derived directly from hardware MAC addresses (via EUI-64) or randomized for privacy without any risk of collision, something impossible under IPv4's cramped subnetting. The designers explicitly favored simplicity and long-term headroom over minimal bit-efficiency, judging that address scarcity, the exact problem IPv4 suffered, should never recur.

If IPv6 has no header checksum, how are corrupted packets detected?

Corruption detection moves to other layers rather than disappearing. Link-layer protocols like Ethernet already append a CRC (cyclic redundancy check) that catches bit errors introduced on that specific hop, and transport-layer protocols (TCP and UDP) carry their own checksums covering the segment plus a pseudo-header including the IP addresses, catching errors introduced anywhere end-to-end. The IPv4 header checksum only ever protected the header itself, and had to be recomputed at every single router because the TTL field changes each hop — a large amount of repeated work protecting a small part of the packet. IPv6's designers judged this redundant given the existing link-layer and transport-layer safety nets, and removed it to lighten every router's per-packet workload.

Can IPv4 and IPv6 hosts communicate directly, without any translation device?

No — the protocols are not wire-compatible, since the header formats, address widths, and even ICMP variants (ICMP vs. ICMPv6) differ. A pure IPv4-only host cannot parse a raw IPv6 packet, and vice versa. Communication requires one of the three transition strategies: both hosts running dual stack and choosing a mutually supported protocol, a tunnel carrying one protocol's packets unmodified inside the other across an incompatible segment, or a translation gateway (like NAT64) that actively rewrites headers and addresses between the two families. This incompatibility is precisely why transition mechanisms are considered permanent infrastructure rather than a temporary patch, since a instantaneous global cutover was never realistic.

Does IPv6 eliminate the need for NAT the way NAT eliminated the need for more IPv4 addresses?

For hosts with genuine end-to-end IPv6 connectivity, yes — the address abundance removes the scarcity motivation for NAT, since every device can get its own globally unique address rather than sharing one via port rewriting. In practice, some networks still deploy NAT66 (IPv6-to-IPv6 NAT) for renumbering convenience or perceived security-through-obscurity, but this is a policy choice, not a structural necessity as it is under IPv4. During the transition period, however, translation devices like NAT64 remain essential precisely because large parts of the Internet are still IPv4-only, so IPv6-only clients still need an address-family-crossing gateway to reach them — a different problem than the one classic NAT solved, but similarly named and easy to conflate.

Why does the IPv6 header include a Flow Label field with no clear IPv4 equivalent?

The Flow Label lets a source tag all packets belonging to one logical flow (e.g., one TCP connection or one video stream) with a shared 20-bit value, so routers can use (source address, destination address, flow label) as a stable hash key for load balancing across multiple equal-cost paths. Without it, routers wanting per-flow consistency (so packets from the same connection take the same path, avoiding reordering) must inspect transport-layer port numbers, which requires understanding the transport protocol and fails outright when the payload is encrypted or uses an unfamiliar protocol. The Flow Label lets routers achieve the same consistent-path behavior while staying entirely within the network layer, agnostic to whatever protocol or encryption sits above it.

Is IPv6 fully deployed today, or is the transition still ongoing?

Still ongoing, though substantially advanced compared to a decade ago. Measurements of IPv6 traffic reaching major content providers show adoption well past the early-experimental stage but still short of universal — a large share, often over a third of global users depending on the measurement source, connect over IPv6 for supporting destinations, while a considerable remainder still relies on IPv4, NAT, or translation gateways. Mobile networks tend to lead adoption because they faced address pressure earliest; enterprise and legacy infrastructure lag furthest behind due to hardware refresh cycles and operational inertia. This is exactly why transition mechanisms remain load-bearing infrastructure today rather than a historical footnote.

Why does the extension header design use a "Next Header" chain instead of a single options block like IPv4?

IPv4's Options field is a single variable-length blob a router must parse in full (checking type-length-value entries one by one) even to determine whether any option affects it, because the whole thing sits inline before the router can reach the upper-layer protocol identifier. IPv6's chained extension headers let a router skip past header types it doesn't need to inspect, using each header's self-declared or fixed length to jump directly to the next one, without parsing the contents of headers irrelevant to forwarding. This turns "parse an opaque options blob" into "walk a linked list, skipping uninteresting nodes," which is both conceptually cleaner and typically cheaper for routers that only care about reaching the transport-layer header.

Before this

Where this leads