Applied stage summary

14 min 10 concepts 10 figures

Foundations gave you the vocabulary of the request path and the order the steps happen in. The Applied stage takes each protocol standing on that path and asks the harder question: how does it behave when the link is congested, when a packet is lost, when a firewall is in the way, when the address family runs out, and when somebody is lying to it. Ten modules work along the path in order, from the byte stream that carries most of the web, through the name lookup that starts every connection, out to the inter-domain routing that decides whose network the packets cross.

One argument runs through the stage. Every protocol on the path solves a specific problem by holding state somewhere, and almost every networking misconception comes from crediting a protocol with a promise it never made. UDP was never faster, it just made you wait for less. NAT was never a firewall, it just cannot match return traffic it has no record of. HTTPS was never a judgement about a site, it just proves control of a name. Encrypted DNS was never anonymity, it just moved the log. Learn what each protocol actually contracts for and the folklore stops being persuasive.

The sections follow the stage's teaching order, so you can read straight through to rebuild the stage in your head, or jump to the protocol you need. Each section links back to its module for the full treatment, the worked evidence and the standards text behind the claim.

What you carry out of this stage

  • Read a TCP trace and say whether the sender was held back by the advertised receive window, by its own congestion window, or by a retransmission timeout
  • Contrast loss-based CUBIC with model-based BBR, explain bufferbloat, and say why buying bandwidth does not empty a full buffer
  • Choose a transport from a stated requirement and explain what QUIC redesigned, instead of repeating that UDP is faster
  • Trace a DNS resolution end to end, pick between DoT, DoH and DoQ against a real firewall constraint, and state exactly what encrypted DNS still leaks
  • Classify a BGP announcement as Valid, Invalid or NotFound and say what a validating router does with each
  • Predict which return packet a NAT admits, and describe how an IPv6 network reaches the same default-deny position without translation
  • Plan an IPv6-mostly segment, naming what DHCPv4 option 108, NAT64 with DNS64, and 464XLAT each rescue
  • State what TLS promises and what it does not, and work out when the next certificate renewal deadline lands under the published validity schedule
  • Run the diagnostic loop on an unfamiliar fault: state the symptom precisely, isolate by layer, name the cheapest next test, and separate the finding from the fault in writing

Four stages carry a learner from vocabulary to frontier judgement

Foundations, Applied and Practice run along the top row and Frontiers returns to the exam terminus, and each connector names what the stage before it hands on, so a stage taken out of order arrives without the language the next one assumes.

The course is one request path learned four times over, each pass deeper than the last, then examined: vocabulary, protocol behaviour, operational judgement, frontier readiness, two papers. Source: blueprint sections 1 and 4.

Four stages carry a learner from vocabulary to frontier judgement A serpentine map of five stage cards, module chips in brackets. Row one, left to right: Stage 1 Foundations, vocabulary of the path (IPv6, Wi-Fi, URL to first byte); Stage 2 Applied, the living protocols (TCP and congestion, DNS, TLS); Stage 3 Practice, securing and observing the path (zero trust, cloud, DDoS). The chain turns down the right into row two, read right to left: Stage 4 Frontiers, where the path is going (post-quantum, automation, measurement); then the Stage 5 exam and certification terminus, tinted red (revision guide, exam practice, mock exams). Connectors read shared vocabulary, protocol behaviour, operational judgement, frontier readiness, two papers one certificate. Stage 1Foundationsthe vocabulary of the pathIPv6Wi-FiURL to first byte Stage 2Appliedthe living protocolsTCP and congestionDNSTLS Stage 3Practicesecuring and observing thepathzero trustcloudDDoS Stage 4Frontierswhere the path is goingpost-quantumautomationmeasurement Stage 5Exam andcertificationFoundation andPractitioner papersrevision guideexam practicemock exams sharedvocabulary protocolbehaviour operationaljudgement frontier readinesstwo papers, one certificate

TCP builds reliability out of inferences, and two separate windows decide the sending rate

TCP has no view of the network. It opens with a three-way handshake to agree starting sequence numbers, then numbers every byte and infers from the acknowledgements coming back what the far end received. Loss is never reported to it; loss is deduced. Duplicate acknowledgements say a later segment arrived while an earlier one did not, which is a fast and specific signal. A retransmission timeout says nothing came back at all, which is slower and much less specific. Reading which of the two a sender reacted to is the first piece of evidence any transport diagnosis needs, because the two describe very different paths.

Two windows limit how much data is in flight, and they belong to different parties. The receive window is the receiver's own statement of what it can absorb, advertised in every acknowledgement, and it shrinks to zero when the receiving application stops keeping up. Wireshark labels those moments TCP Window Full and TCP ZeroWindow, and they explain the connection that crawls on a link with no loss at all. The congestion window is the sender's private estimate of what the path between them can carry, built by probing because no switch or queue on the way advertises its limit. The effective sending rate is the smaller of the two, which is why the sentence bandwidth is fine settles nothing.

RFC 9293 describes what TCP provides in one line: a reliable, in-order, byte-stream service. Each word is a boundary. Reliable means lost segments are retransmitted, not that delivery is guaranteed under any condition, because a path that fails entirely ends with the connection closing and the application seeing an error. In-order means segments are handed up in sequence, which is also why one lost segment stalls everything queued behind it. Byte-stream means TCP does not preserve message boundaries at all, so framing is the application's job. TCP can confirm bytes reached the receiving kernel; it cannot confirm anybody processed them.

TCP reliability is sequence, acknowledgement, and repair

The same sequence and acknowledgement counters that open the TCP connection also number the data, so the lost DATA 2 segment announces itself only as a missing acknowledgement and the sender waits out the retransmission timer before sending those bytes again.

Every TCP segment carries a sequence number and an acknowledgement number. The same mechanism that opens the connection also detects loss and triggers retransmission.

TCP reliability: sequence numbers, acknowledgements, retransmission A sequence diagram with two vertical lifelines (Client on the left, Server on the right). Eight horizontal arrows show the segments exchanged. The first three form the three-way handshake: SYN seq=100, SYN-ACK seq=500 ack=101, ACK seq=101 ack=501. Then DATA 1 with seq=101 ack=501 len=200 is sent and acknowledged. DATA 2 is lost (shown as a dashed arrow), the retransmission is sent after RTO and acknowledged. Each arrow carries the segment name, the sequence and acknowledgement numbers, and a short flag describing the state transition. Client Server SYN seq=100, ack=0 open SYN-ACK seq=500, ack=101 accept ACK seq=101, ack=501 established DATA 1 seq=101, ack=501, len=200 first send ACK seq=501, ack=301 received 200 B DATA 2 (lost) seq=301, ack=501, len=200 no ACK received DATA 2 (retransmit) seq=301, ack=501, len=200 after RTO ACK seq=501, ack=501 received 200 B

Congestion control is distributed cooperation, so loss is a signal before it is a fault

The network gives senders no explicit capacity signal, so every congestion control algorithm is a way of guessing from indirect evidence. That framing matters more than any single algorithm: congestion control is millions of independent senders cooperating without negotiating, and the shape of the guess decides how the internet shares a bottleneck. CUBIC, standardised in RFC 9438 in August 2023 and the default in both Linux and Windows, still infers congestion from loss, but grows its window in a shape designed for the long, fast paths the classical Reno-era algorithms handled badly.

BBR takes the other route. Rather than waiting for loss, it estimates the bottleneck bandwidth and the round-trip time of the path and paces against that model, which keeps queues shorter on paths where loss is a poor proxy for congestion. Version 3 is an Internet-Draft, draft-ietf-ccwg-bbr, and calling it a published standard is a citation error the stage keeps refusing. That the field needed RFC 9743 in March 2025 to set out what any new congestion control algorithm must demonstrate is itself evidence that this is live engineering rather than settled history.

Bufferbloat is where the theory meets a user complaint. Deep buffers in home routers and access equipment absorb bursts instead of dropping them, which converts congestion into latency and hides the signal the sender needed. L4S, specified across RFC 9330, RFC 9331 and RFC 9332 in January 2023, marks packets with ECN before queues build so senders slow down while latency stays low, loss stays low and throughput still scales. It ships in DOCSIS low-latency modes and has been interoperability-tested by Comcast, Apple, Google and NVIDIA. The operational lesson is blunt: a latency problem caused by a full buffer does not improve when you buy more bandwidth.

CUBIC reacts to loss while BBR models the path

The two lanes react to different signals: CUBIC's window collapses at every marked loss event while BBR's rate holds against its own bandwidth estimate and dips only when it chooses to probe, and only the left one is a published RFC.

CUBIC (RFC 9438, August 2023) is the loss-based default in Linux and Windows; BBRv3 (draft-ietf-ccwg-bbr, still an Internet-Draft) paces to a measured bandwidth and round-trip model instead.

CUBIC reacts to loss while BBR models the path A two-lane behaviour map. The left lane, CUBIC, plots the congestion window over time: it climbs towards a dashed line marking the window held before the last loss, plateaus, probes above it, then collapses at each marked loss event. Its strip reads: reacts to packet loss. The right lane, BBR, plots the sending rate hugging a dashed estimated bottleneck bandwidth line, with a bandwidth probe pulse above it and a minimum RTT probe dip below it. Its strip reads: reacts to its own path model. Two status cards below state that CUBIC is RFC 9438 of August 2023 and the default in Linux and Windows, while draft-ietf-ccwg-bbr is an Internet-Draft, so BBRv3 is not an RFC. CUBIC: loss-based Grows the congestion window until a packet is lost congestion window time window held before the last loss loss event Reacts to: packet loss Capacity is inferred from what the path drops. BBR: model-based Paces sending to an estimate of the bottleneck sending rate time estimated bottleneck bandwidth bandwidth probe minimum RTT probe Reacts to: its own path model Bandwidth and round-trip samples, measured live. loss-based control, standardised model-based control, still a draft RFC 9438, August 2023 A published standard. Default in Linux and Windows. draft-ietf-ccwg-bbr An Internet-Draft. BBRv3 is not an RFC. Sources: RFC 9438 (CUBIC), draft-ietf-ccwg-bbr (BBRv3), RFC 9743 (March 2025) on specifying new algorithms.

UDP is not faster than TCP, and QUIC is the proof that this was never the contest

Both transports put bits on the wire at the same rate, because the link, the queues along the path and the distance decide that, and an eight-byte header does not travel faster than a twenty-byte one. What differs is what each makes you wait for. TCP asks for a handshake before the first byte of data, holds itself back when it detects loss, and delivers one ordered byte stream, so one lost segment stalls everything behind it. UDP skips all three, which is why a DNS query feels instant and why voice and video reach for it: late data is worse than missing data when the deadline has already passed.

QUIC, specified in RFC 9000, keeps the guarantees and removes the waiting. It folds the transport and TLS handshakes into a single exchange, carries independent streams that recover separately so a loss on one does not block the others, and identifies a connection by an identifier rather than by the four-tuple, so a session survives a phone moving from Wi-Fi to cellular. Version 2, RFC 9369, exists mainly to keep middleboxes from ossifying around one wire image. HTTP/3, RFC 9114, is the application layer built on top of it.

The 2026 picture needs a dated, method-qualified number rather than a headline. Measured on 13 July 2026, QUIC carried roughly 21 to 35 percent of traffic depending on the window and method used by Cloudflare Radar, while about 39 percent of websites advertised HTTP/3 support according to W3Techs. Two different questions, two different numbers, both worth quoting with their source. MASQUE has also standardised proxying inside the protocol, with CONNECT-UDP in RFC 9298 and CONNECT-IP in RFC 9484 underpinning products such as iCloud Private Relay. Multipath QUIC remains an Internet-Draft.

Choose the delivery contract, not the protocol reputation

TCP, UDP and QUIC each pair what the transport provides with what the application still owns: UDP hands back the connection state, reliability, ordering and congestion control that TCP provides, so the choice is only where that work lives, never whether it is done.

Choose a transport by what you can afford to own. UDP gives the application everything; TCP gives a reliable byte stream; QUIC gives independent reliable streams plus connection migration.

Each transport draws a different line between protocol and application Three columns compare UDP, TCP (emphasis), and QUIC. Each column has three stacked blocks. The top block names the protocol, the RFC, the header size, and the cost framing. The middle block is white with the brand-red left accent and lists what the protocol provides: UDP gives port multiplexing, checksum, and message framing; TCP gives connection state, reliable byte stream, in-order delivery, and congestion control; QUIC gives multiplexed streams, per-stream recovery, integrated TLS 1.3, and connection migration. The bottom block is deemphasised neutral grey and lists what the application still owns under each protocol. RFC 768 UDP 8-byte header minimal overhead PROVIDES Port multiplexing Checksum (optional v6) Message framing APP STILL OWNS Connection state Reliability and recovery Ordering and dedup Congestion control RFC 9293 TCP 20-byte minimum reliable cost PROVIDES Connection state Reliable byte stream In-order delivery Congestion control APP STILL OWNS Message boundaries Per-stream recovery Migration across IPs RFC 9000 QUIC variable header per-stream cost PROVIDES Multiplexed streams Per-stream recovery Integrated TLS 1.3 Connection migration APP STILL OWNS Application semantics Stream priority policy 0-RTT replay policy

Encrypted DNS moved the trust question rather than removing it

Resolution is a hierarchy with three roles: the stub resolver in the operating system asks a recursive resolver, and the recursive resolver walks the authoritative servers from the root down until it holds an answer. Caching sits over the whole thing with time-to-live values attached, which is the real reason a DNS change appears to work for some users and not others for hours afterwards. Nothing was rejected; different recursive resolvers simply hold copies with different remaining lifetimes. RFC 9499, published as BCP 219 in March 2024, is the canonical vocabulary for all of it.

Three standards now carry those queries over an encrypted channel, and the difference between them is which existing traffic they resemble. DNS over TLS, RFC 7858, uses a dedicated TCP port 853, so a network can see the category and permit or block it without reading the names. DNS over QUIC, RFC 9250, keeps that dedicated-port honesty on UDP 853 while taking QUIC's faster setup and freedom from head-of-line blocking. DNS over HTTPS, RFC 8484, shares port 443 with the rest of the web and is correspondingly hard to single out. Discovery of Designated Resolvers, RFC 9462, lets a client upgrade automatically without anybody changing a setting.

In practice the firewall picks the transport, not the design document: sites that permit outbound TCP 443 and little else block DoQ and DoT by default, and DoH survives because blocking it means blocking the web. What none of them deliver is anonymity. The resolver now holds an attributable log of every name asked for, the destination IP address of the connection that follows is in the clear, and without Encrypted Client Hello the Server Name Indication field names the site in plain text during the TLS handshake. RFC 9849 closes that gap only where client, DNS records and server deployment all support it, and only down to the fronting deployment rather than the individual tenant.

A cold DNS lookup walks authority, then caches the result

Root and TLD only refer and just the authority answers, making the recursive resolver pay for the whole walk once and then serve the same name from its own cache until the three hundred second TTL runs out.

A cold lookup walks the DNS hierarchy. Each tier refers the resolver to the next; only the authority answers; the recursive resolver caches what it learned.

Cold DNS lookup: hierarchy walk with referrals A five-lifeline sequence diagram showing a cache-miss DNS query for api.example.com. The stub forwards the query to the recursive resolver. The resolver walks the hierarchy: asks the root (refers to .com TLD), asks the TLD (refers to example.com authority), asks the authority (answers with A record and TTL). The recursive resolver caches the answer and responds to the stub. Eight horizontal arrows show each leg with sequence and referral details. Stub YOUR MACHINE Recursive ISP, 1.1.1.1, 8.8.8.8 Root 13 ROOT SERVERS TLD .COM AUTHORITY Authority EXAMPLE.COM NS QUERY api.example.com stub forwards Who handles .com? no cache yet Refer to .com TLD NS records returned Who handles example.com? ask TLD Refer to authority NS for example.com A for api.example.com? ask authority ANSWER 93.184.216.34 with TTL 300 s RESPONSE to stub and cache for 300 s

Routing builds the table, forwarding does the lookup, and route origin validation is a measurable partial fix

The two words name two different planes. The control plane runs the routing protocols, exchanges reachability with neighbours, applies policy and produces a forwarding table. The data plane takes each arriving packet and does one thing with it: a longest prefix match against that table, then out of the matching interface. A packet for 10.0.0.5 leaves by the interface for 10.0.0.0/24 rather than 10.0.0.0/16 because the more specific entry wins, and no fresh path calculation happens per packet. Traceroute reads off this machinery, which is why it is evidence about one direction at one moment and not proof of the return path.

BGP-4, RFC 4271, has no way to decide whether an announcement is truthful. A router checks that the message is well formed and that policy permits the neighbour, then believes what the neighbour said. That is the design, not a defect nobody noticed. Route Origin Validation, RFC 6811, adds the missing check: the address holder publishes a Route Origin Authorisation naming the prefix, the maximum length permitted and the autonomous system authorised to originate it, and routers compare announcements against the validated set. The comparison yields Valid, Invalid or NotFound, and RFC 6811 deliberately leaves the action to local policy.

The settled operational norm is to drop Invalid, accept Valid and accept NotFound, because rejecting NotFound would disconnect every network that has not signed its space yet. The numbers turn this into engineering rather than an anecdote about a bad day: reading the NIST RPKI Monitor, ROAs now cover more than half the IPv4 routes in the global table from a published set of roughly 480,000 ROAs, while only about 12 percent of stub autonomous systems are fully protected. The limit is worth stating too. Validation checks the origin of a route, not the AS path attached to it, so a forged path with a correct origin still passes.

Routing decides paths; forwarding moves packets

The planes run on different clocks, minutes on the left and microseconds on the right, and only the compile arrow joins them, so a route can already be correct in the RIB while packets keep following a FIB entry that has not been pushed yet.

Routing builds knowledge; forwarding spends it. A router can hold a route and still drop a packet because the two planes answer different questions on different clocks.

Every router runs two planes on two different clocks Two side-by-side plane regions fill the canvas. The left plane (white) is Plane 1 Control, carrying three stacked blocks top to bottom: Routing protocol input (minutes/seconds tag), Best-path selection, and RIB (Routing Information Base, emphasised). The right plane (light red, emphasised) is Plane 2 Data, carrying three stacked blocks top to bottom: FIB (Forwarding Information Base, emphasised, microseconds tag), Packet lookup, and TTL decrement and rewrite. A diagonal arrow labelled COMPILE / push FIB crosses from the control plane RIB block to the data plane FIB block. A footer names the two clocks and the two questions each plane answers. PLANE 1: CONTROL Builds the routing table MINUTES / SECONDS Routing protocol input BGP updates, OSPF LSAs, static config Best-path selection policy, AD, metric, longest prefix RIB (Routing Information Base) candidate routes per destination PLANE 2: DATA Moves each packet MICROSECONDS FIB (Forwarding Information Base) selected route per destination, often in ASIC Packet lookup longest prefix match on dst IP TTL decrement and re-write L2 rewrite, send out egress interface COMPILE push FIB Two clocks, two questions. The control plane asks "what is the network?" The data plane asks "what do I do with this packet, now?"

NAT is address sharing, and the protection people credit it with is a side effect of keeping state

A NAT device rewrites addresses, and in the port-translating form almost everyone runs it rewrites ports as well, so many inside hosts share one outside address. The record of each rewrite is the state table, and it is the only reason return traffic can find its way home: an arriving packet is matched against an existing entry or it is dropped for want of one. Entries expire when idle, and the expiry timers are why an SSH session left alone over lunch is dead when you return, while the same session at home survives. Keepalives shorter than the timeout are the fix, not a longer wait.

That drop-unsolicited behaviour is what gets mistaken for security. RFC 4787 is the specification for how NAT must behave, covering mapping, filtering and hairpinning, and it is a behavioural document rather than a protective one; its own text is clear that its mapping choices do not determine the security properties of the device. NAT offers no authentication, no access-control policy you can express or audit, and no view of what a permitted connection carries once it is open. A network that names NAT as its security boundary has a boundary it cannot describe.

The IPv6 comparison settles the argument cleanly. An IPv6 network reaches the same default-deny position with a stateful firewall and no translation at all, on addresses that stay end to end from source to destination. The state that admits return traffic is still there; the address rewriting is gone. That separation is worth holding, because it shows the two functions were never the same thing, and it explains why removing NAT does not remove protection when the firewall is doing the job it was always doing.

PAT works because the NAT owns a state table

Laptop and Phone both chose source port 53144, so the only thing telling their return traffic apart is the public port the gateway assigned, 62000 against 62001, and a reply can be delivered only while that row is still in the table.

PAT works because the gateway remembers which translated port belongs to which internal host:port. Without that state table, return traffic has nowhere to go.

PAT shares one public IP across many inside hosts via the mapping table Three inside-host cards on the left (Laptop emphasised, Phone, TV) connect through a gateway labelled PAT engine with public IP 198.51.100.7. To the right of the gateway is the NAT mapping table with five columns INSIDE, TRANSLATED, DESTINATION, PROTO, TIMER. Three rows show that Laptop and Phone both happen to use source port 53144 internally but the gateway translates them to different public source ports 62000 and 62001. Arrows connect each host through the gateway to its corresponding table row. Laptop 192.168.1.12 src 53144 Phone 192.168.1.20 src 53144 TV 192.168.1.30 src 49200 GATEWAY PAT engine public IP 198.51.100.7 INSIDE TRANSLATED DESTINATION PROTO TIMER 192.168.1.12 :53144 198.51.100.7 :62000 203.0.113.40 :443 TCP 300 s 192.168.1.20 :53144 198.51.100.7 :62001 203.0.113.40 :443 TCP 300 s 192.168.1.30 :49200 198.51.100.7 :62002 146.75.16.4 :443 TCP 299 s

IPv6-mostly is the ratchet that dual-stack never had

Dual-stack was a truce rather than a transition. Running two internets side by side indefinitely doubles the addressing, the firewall rules, the monitoring and the troubleshooting, and gives nobody a reason to stop. An IPv6-mostly segment changes the incentive by putting three kinds of host on one network: IPv6-only hosts that have let go of IPv4, dual-stack hosts that have not, and IPv4-only devices that never will. DHCPv4 option 108, RFC 8925, is the polite question that makes it work: a capable host asks whether it may drop IPv4 on this network, and the network answers. The operational guidance, draft-ietf-v6ops-6mops, is a draft and is cited as one.

Two translation mechanisms cover what the IPv6-only hosts still need. NAT64, RFC 6146, translates between the address families in the network, and DNS64, RFC 6147, synthesises the IPv6 answers that steer traffic into it, so an IPv6-only client reaches an IPv4-only server without knowing anything happened. The predictable break is the IPv4 literal: an application that carries a hard-coded IPv4 address in configuration or in its own protocol payload never asks DNS, so the synthesis never happens and the connection fails in a way that looks like the network.

464XLAT, RFC 6877, is the fix that runs in your pocket. A CLAT on the host presents a local IPv4 interface to applications that insist on one and translates their traffic into IPv6 for the NAT64 in the network, so the literal case works again. Android, macOS and iOS have shipped it for years, Windows has announced expansion beyond cellular, and Fedora with NetworkManager gained an eBPF-based CLAT in July 2026. That transition works at population scale is not a projection: APNIC Labs measures India above 70 percent IPv6 capability.

One segment, three kinds of host, no second network

Each host answers DHCPv4 option 108 for itself, so the segment sheds IPv4 leases one capable client at a time, and the IPv4-only host in the third lane is the single reason the address pool cannot yet be switched off.

An IPv6-mostly segment runs three kinds of host at once: DHCPv4 option 108 (RFC 8925) lets capable hosts drop IPv4 while NAT64 keeps the IPv4-only server reachable.

One segment, three kinds of host, no second network A three-lane swimlane on a single IPv6-mostly segment. Every lane crosses the same three columns: DHCPv4 exchange, addresses in use, and path to an IPv4 server. Lane A is an IPv6-only host: it is offered option 108, ends up with a global IPv6 address and no IPv4 lease, and reaches IPv4 servers through DNS64 and NAT64. Lane B is a dual-stack host: it ignores option 108, keeps both addresses, and reaches IPv4 servers with no translation. Lane C is an IPv4-only host: it has no IPv6 stack, holds an IPv4 lease, and is the reason the pool stays. A callout names RFC 8925, RFC 6146 and RFC 6147, and flags the IPv6-mostly guidance as an Internet-Draft. DHCPv4 exchange Addresses in use Path to an IPv4 server HOST A IPv6-only host that took option 108 DROPS IPv4 Option 108 offered The client asks for IPv4 and says it can live without it. IPv6 only A global IPv6 address and no IPv4 lease at all. Through NAT64 DNS64 returns a synthetic AAAA; NAT64 rewrites the packet. option 108 accepted, IPv4 dropped AAAA synthesised, then translated HOST B Dual-stack host that kept its IPv4 lease KEEPS BOTH Option 108 ignored The client never signalled support, so the server leases IPv4. IPv6 and IPv4 Two stacks, two addresses, twice the estate to run. Straight over IPv4 No translation is involved, so this host proves nothing. option 108 ignored, IPv4 leased native IPv4, no translation HOST C IPv4-only host that cannot be changed IPv4 ONLY No IPv6 to prefer There is no IPv6 stack here, so option 108 means nothing. IPv4 only It holds one of the leases the pool still has to carry. Straight over IPv4 This host is why the IPv4 pool cannot be switched off yet. no IPv6 stack, plain IPv4 lease the path that keeps the pool alive One segment, no second network to run Option 108 is RFC 8925, NAT64 is RFC 6146 and DNS64 is RFC 6147. Operational guidance for IPv6-mostly segments is draft-ietf-v6ops-6mops, an Internet-Draft, not an RFC.

TLS authenticates a name and encrypts a channel, and the certificate behind it now expires in months

TLS 1.3 was republished in July 2026 as RFC 9846, obsoleting RFC 8446 while keeping the protocol version at 1.3; the revision forbids KeyShare reuse and bans negotiating TLS 1.0 and 1.1. Where it sits differs by transport. Over TCP it is a second handshake layered on a connection that is already up, which is why a capture shows the connection and the negotiation as separate events. Inside QUIC the transport and cryptographic handshakes are one exchange, which is why the same capture shows far less and why the placement question changes what evidence you can gather at all.

What it promises is narrow and worth saying out loud. The chain of certificates is validated back to a trust store, Certificate Transparency under RFC 9162 makes issuance publicly auditable, and forward secrecy means a later key compromise does not decrypt yesterday's recorded sessions. None of that is a judgement about the site. Proving control of a domain is exactly what a phishing operator can do, so phishing sites hold valid certificates as a matter of routine, and the padlock reports that proof rather than any opinion about honesty. Read the name in the address bar, not the icon beside it.

The economics of certificates changed on a published schedule. The CA/Browser Forum approved ballot SC-081v3 on 11 April 2025: the maximum validity of a publicly trusted TLS certificate is 200 days from 15 March 2026, 100 days from March 2027 and 47 days from March 2029, with the reuse period for domain validation data shrinking on the same curve. A 47-day certificate cannot be a diary entry owned by a named person. ACME automation stops being an efficiency and becomes the baseline, and any manual step left in the renewal path is an outage waiting for a holiday. Private internal CAs sit outside the schedule, which is precisely why an inventory matters.

TLS protects the channel, not every system risk

Every property in the left column belongs to bytes while they are in transit, so the right column is not a weakness in TLS but the set of questions a valid certificate never answers, including whether the operator you reached deserves trust.

TLS gives confidentiality, integrity, and server identity for bytes in transit. It does not stop a buggy endpoint from leaking keys, nor does it certify that the server you reached deserves your trust.

TLS draws a line in transit. The endpoint and the application live outside that line. Two side-by-side columns with the same row scale. The left column PROTECTS (emphasis) titled 'TLS gives you' lists four properties: Confidentiality of transit bytes (RFC 8446 §5.2), Integrity of transit bytes (§5.2), Server identity with mTLS option (§4.4.2), Forward secrecy via ECDHE (§4.1.2). The right column DOES NOT PROTECT titled 'TLS will not stop' lists four boundaries: Endpoint implementation bugs (Heartbleed CVE-2014-0160), Application logic and content, Trustworthiness of the operator (phishing sites use valid certs), Data at rest after decryption (NIST SP 800-52). PROTECTS TLS gives you Confidentiality of transit bytes AES-GCM / ChaCha20-Poly1305 keep payload secret from observers. RFC 8446 §5.2 Integrity of transit bytes Any tamper between client and server is detected by the AEAD tag. RFC 8446 §5.2 Server identity (and client with mTLS) CA-signed certificate proves which hostname you reached. RFC 8446 §4.4.2 Forward secrecy Ephemeral ECDHE means a future key compromise does not decrypt past sessions. RFC 8446 §4.1.2 DOES NOT PROTECT TLS will not stop Endpoint implementation bugs Heartbleed (CVE-2014-0160) leaked 64 KB of process memory per request. OPENSSL ADVISORY 2014 Application logic and content TLS does not validate the request body, the SQL, or the rendered page. APPLICATION CONTROLS Trustworthiness of the operator Phishing sites and malware C2 servers use valid certificates too. RFC 6962 CT HELPS Data at rest on either endpoint Once decrypted, the bytes live in process memory, logs, and disk. NIST SP 800-52

The method is a loop: state the symptom, isolate by layer, name the cheapest next test

Most bad diagnoses fail at the first step, because the symptom was never stated precisely enough to be tested. Slow is not a symptom; slow for these users, to this name, since this time, while another location is unaffected, is a symptom with edges. From there the discipline is to isolate by layer and let each layer's tools produce a different class of evidence, then to pick the next test by what it costs against what it would rule out. The loop closes when the remaining hypotheses are narrow enough that one measurement separates them.

Error messages are distinctions, not noise. A connection refused means something answered and declined; a timeout means nothing answered at all; a negotiated h2 where h3 was expected means the connection succeeded over a different transport from the one the client wanted. That last one is the stage's worked example. A site feels slower in the office than on a hotspot, and the only evidence is the browser's protocol column reading h2 in one place and h3 in the other. HTTP/3 runs QUIC over UDP port 443, per RFC 9114, so a rule set written as allow 443 for TCP only drops the QUIC attempt silently and the client falls back. A short capture filtered to udp port 443 settles it in seconds, and an ICMP administratively-prohibited reply names the device doing it.

The downgrade is the finding, not yet the fault. HTTP/2 over a healthy path is not slow, and blocking UDP 443 is sometimes deliberate policy so traffic stays inspectable. What the evidence established is that the two networks were never running the same protocol, so any comparison of their performance was measuring a mixture. Writing that down as a diagnosis note, with the measurement, the hypothesis it supports and the hypothesis it does not, is what makes an escalation useful to the person who receives it.

A repeatable diagnostic routine prevents random fixes

The loop can only close on a pass, and a fail leaves it standing at the named fault: keep to one change and one test per lap and the reading at nine o'clock belongs to the thing you altered rather than to the last three.

Diagnosis is a loop, not a guess. Find the first function that did not succeed, test it, read the result, then act. Never change two things at once.

Diagnose by loop, not by guess A four-node clock-face loop. 12 o'clock OBSERVE (emphasis) names the symptom (who, where, when). 3 o'clock PICK the first unproven function (DNS, IP, TCP, TLS, HTTP, in order). 6 o'clock TEST runs one safe command. 9 o'clock READ interprets the result. Four red arcs close the loop with labels narrows, evidence, reading, and 'fail leads to fault, pass returns to loop'. A central red card holds the rule: One change. One test. 1 · OBSERVE Symptom Who, where, when, what they saw. EXAMPLE POST /orders, no response after 30 s, prod app server only 2 · PICK First unproven function Walk DNS, IP, TCP, TLS, HTTP in order. EXAMPLE DNS resolves OK; ping OK; pick TCP next 3 · TEST Run one safe test Change one variable; record output verbatim. EXAMPLE curl --connect-timeout 5 https://api.host:443 4 · READ Read the result Pass moves up the chain; fail names the layer. EXAMPLE Connection timed out → Layer 4 firewall path narrows evidence reading fail → fault; pass → loop RULE OF THE LOOP One change. One test.

A slow website is diagnosed by measurement order, never by the last thing anybody changed

The capstone runs the method on a case with no obvious culprit. Users in the London office report that a checkout site loads slowly or times out, but only since 09:00 today; the same site is fine from New York; no code was deployed and no server was restarted. The symptom is therefore environment-specific and time-bounded, and that shape alone rules out whole families of cause before a single tool is opened. The first measurement is taken from the affected location and against a control: a lookup through the London resolver returning in 3800 ms against the same lookup elsewhere returning in 45 ms is a finding about the resolver, not about the site.

Two branches then have to be considered rather than assumed away. The first is congestion instead of failure. If DNS is healthy, the connection is clean, and only the first byte arrives late while the office backup window runs, nothing is broken; queues are building on a shared link. Loss or an explicit congestion mark in that capture is the signal a working transport depends on, not proof of a fault, and the test that separates the two is idle latency compared with loaded latency. If idle is fine and loaded is not, more bandwidth will not fix it.

The second branch is that the client never used the resolver you tested. A browser or operating system configured for DNS over HTTPS sends its queries inside an HTTPS session to a resolver of its own choosing, so the corporate resolver logs stay empty and its cache state is irrelevant to what the user experienced. Establish which resolver actually answered before drawing any conclusion from resolver-side evidence. Neither branch changes the method. Both change which measurement counts as evidence, and that is the difference between a diagnosis that holds up under challenge and one that names the last thing anybody touched.

A slow website diagnosis separates each delay bucket

Split the page into DNS, TCP, TLS or QUIC, HTTP and transfer and four of those buckets measure the same in both runs, so the entire difference between a 4200 millisecond page and a 445 millisecond one sits in DNS, and the dominant bar rather than the total names the boundary.

Break a slow load into its phases. The dominant phase points at the right boundary. The London scenario showed 3.8 s of DNS hiding inside a 4.2 s 'slow page'.

Slow page is a measurement problem; break it into phases Two stacked proportional timelines of the same curl breakdown at two points in time. The top track (emphasis) Cold lookup after resolver cache flush at London 09:05 totals 4200 ms with a 3800 ms DNS phase (emphasised red block) dominating; TCP 85 ms, TLS 92 ms, HTTP 160 ms and transfer 63 ms follow at normal sizes. The bottom track Same site after cache warms at 09:06 totals only 445 ms with DNS shrinking to 45 ms; the dominant phase is now HTTP (emphasised). Each bar has a readout strip naming its five phases and durations, and a shared millisecond axis emphasises the proportional difference. Notes name DNS as the 90% culprit on the cold lookup and confirm other layers were normal. LONDON, 09:05 TODAY Cold lookup after resolver cache flush TOTAL 4200 ms DNS 3800 ms DNS 3800 ms TCP 85 ms TLS 92 ms HTTP 160 ms transfer 63 ms DNS is 90% of the page time. Other layers are normal. LONDON, 09:06 TODAY Same site after cache warms (second curl) TOTAL 445 ms DNS 45 ms TCP 85 ms TLS 92 ms HTTP 160 ms transfer 63 ms DNS now 10% of the page time. The site itself was never slow. 0 ms 1000 ms 2000 ms 3000 ms 4000 ms

The traps this stage warns against

  • Reaching for UDP because it is faster than TCP.

    Instead: Both put bits on the wire at the same rate; the link, the queues and the distance decide that. What differs is what each transport makes you wait for: a handshake before data, a slowdown after loss, and one ordered stream that stalls behind a single missing segment. Choose by requirement, and note that QUIC (RFC 9000) removed most of the waiting without giving up reliability or congestion control.

  • Calling NAT the site's firewall because unsolicited inbound traffic does not get through.

    Instead: NAT is address sharing. Unsolicited traffic is dropped because no translation state matches it, which is a side effect of keeping state rather than a policy. RFC 4787 specifies that behaviour, not protection, and states that its mapping choices do not determine the security properties of the device. An IPv6 network reaches the same default-deny position with a stateful firewall and no translation.

  • Reading a firewall rule that permits 443 as covering all HTTPS traffic.

    Instead: Port numbers are per protocol and 443 exists over both. HTTP/1.1 and HTTP/2 use TCP 443; HTTP/3 carries HTTP over QUIC on UDP 443 (RFC 9114). A TCP-only allow does not fail loudly: the QUIC attempt goes unanswered, the client falls back, and the page still loads. Record which protocol was negotiated before comparing two networks.

  • Putting certificate renewal in the calendar once a year and giving it to a named owner.

    Instead: CA/Browser Forum ballot SC-081v3, approved on 11 April 2025, cuts the maximum validity of a publicly trusted TLS certificate to 200 days from 15 March 2026, 100 days from March 2027 and 47 days from March 2029. Automate issuance and installation with ACME, and inventory which certificates are publicly trusted, because private internal CAs sit outside the schedule.

  • Treating a handful of lost packets in a capture as proof of a fault.

    Instead: Loss, or an explicit ECN mark, is the congestion signal loss-based control depends on to find the right sending rate, so a small amount of it is evidence of a working transport. Compare idle latency with latency under load: if idle is fine and loaded is not, the problem is a full buffer and more bandwidth will not empty it (RFC 9330).

  • Telling a user that encrypted DNS makes their browsing private.

    Instead: DoT, DoH and DoQ protect query confidentiality against the network between the client and the resolver, and hand the resolver an attributable log of every name asked for. The destination IP address is still in the clear, and without Encrypted Client Hello the SNI field names the site during the TLS handshake. RFC 9849 closes that gap only where client, DNS and server deployment all support it, and only down to the fronting deployment.

  • Citing BBRv3 or Multipath QUIC as though they were published RFCs.

    Instead: Both are Internet-Drafts, draft-ietf-ccwg-bbr and draft-ietf-quic-multipath, and describing them as standards misstates what an operator can rely on. RFC 9743, published in March 2025, is the document that sets out what any new congestion control algorithm must demonstrate before it becomes one.

Core distinctions

  • Flow control versus congestion control: flow control is the receiver protecting itself and travels in every acknowledgement; congestion control is the sender inferring the limit of a path that never advertises one
  • The receive window is the receiver's stated capacity and the congestion window is the sender's own estimate of the path; the effective sending rate is the smaller of the two
  • Routing versus forwarding: routing is the control plane building a table from protocol metrics and policy; forwarding is the data plane doing one longest-prefix-match lookup per packet, with no fresh calculation
  • DNS over TLS on TCP 853 and DNS over QUIC on UDP 853 sit on a dedicated port a network can see and block as a category; DNS over HTTPS shares port 443 with the web, which is why it survives restrictive egress rules
  • A Valid route origin state means a signed ROA covers the prefix and authorises the announcing AS; NotFound means no ROA covers it at all, which is the honest answer for unsigned space and is accepted rather than dropped
  • NAT64 is translation performed in the network for hosts with no IPv4 at all; 464XLAT adds a CLAT on the host so an application that insists on IPv4, including one carrying an IPv4 literal, keeps working over that same NAT64
  • CUBIC infers congestion from loss; BBR estimates bottleneck bandwidth and round-trip time and paces against that model, and BBRv3 is an Internet-Draft rather than a published RFC
  • TLS over TCP is a second handshake on a connection that is already up; inside QUIC the transport and cryptographic handshakes are one exchange, which changes what a packet capture can still show you
  • A protocol downgrade is a finding and a fault is a conclusion: h2 where h3 was expected names one hypothesis about UDP 443 and nothing more until a capture confirms it

That is the Applied stage in one place. TCP's two windows and the inferences behind them, congestion control from CUBIC through BBR to L4S, what QUIC actually removed, DNS resolution with three encrypted transports and an honest account of what they hide, routing against forwarding with route origin validation measured rather than asserted, NAT as address sharing, the IPv6-mostly transition kit, what TLS promises under 200-day certificates, and the diagnostic loop that turns all of it into evidence. The applied scenario practice now puts that under pressure with situations where the folklore answer is the tempting one, so the reflexes are corrected before stage 3 asks you to secure and observe the same path.

Sources and further reading