Module 32 of 45 · Practice

CDNs, anycast and the edge

27 min 5 outcomes 2 diagrams + knowledge check

Most requests your users make never arrive at the organisation whose name is in the address bar. They are answered nearby, by a machine that ends the encrypted connection, holds a copy of the reply and belongs to somebody else. The site's own server is consulted only when nothing closer has the answer. That is the whole argument of this module, and the rest of it is the mechanism behind the sentence together with the four things it takes away from you: the request rate in your logs, the address of the user, the location of the user, and the assumption that the behaviour users describe is the behaviour your server produced.

By the end of this module you will be able to:

  • Explain anycast, and why one address can answer in every country at once
  • Trace a request through a point of presence, TLS termination and the origin shield
  • Explain how DNS steers a connection before the connection is opened
  • Place edge compute honestly, and name the work that does not belong there
  • Say what standardised in-protocol proxying does to the addresses you record

Apple built a two-hop proxy into ordinary consumer devices, on a tunnel the IETF had already standardised

sends Safari browsing through two separate relays rather than straight to the site. Apple describes the split plainly: the first relay, which Apple runs, sees the user's IP address but not the destination; the second, run by a third party, resolves and connects to the destination without knowing who asked. The design goal is that no single operator on the path holds both halves of the fact that usually identifies a person, which is who you are and where you went.

What makes this a networking case rather than a privacy announcement is the plumbing underneath. The tunnel is not a proprietary invention bolted on to the side of the protocol stack. It is , the IETF work that lets a client ask an HTTP server to act as a proxy from inside an ordinary HTTP connection. RFC 9298 specifies the UDP case, where the client asks the proxy to open a UDP association and then exchanges HTTP datagrams with it. RFC 9484 does the same for IP packets. Proxying stopped being something a network operator imposed at the boundary and became a request a client makes, inside the same connection it uses for everything else, over the same port, indistinguishable from the outside.

The consequence lands on people who never opted into any of it. If you operate a service, some of your traffic now arrives from an address belonging to a relay operator rather than to a user's network, and it arrives that way by the deliberate design of a shipping consumer product rather than by anybody misconfiguring anything. Every control you built that treats an address as an identity, a location or a reputation is now reasoning about the wrong object. This module builds up to that point, because the edge that a content network runs on your behalf and the relay that a user runs on their own behalf turn out to be the same mechanism pointed in two directions.

If a large share of the browsing traffic reaching your service has passed through two proxies designed so that neither one holds the whole story, what do the addresses in your logs still prove?

The nearest edge answers, and only a miss travels on

The user never picks an edge and is never told which one answered, so route A can end at the point of presence while route B travels on to the shield and the origin, and the route rather than the server sets the wait.

Anycast gives every point of presence the same address, so routing hands the user to the nearest edge; only a cache miss travels on to the shield and then the origin (blueprint module P8).

The nearest edge answers, and only a miss travels on A route map read from top to bottom. The opening card is the user, who never picks an edge and is never told which one answered. A labelled arrow leads to a card stating that the same address is announced from every point of presence, so routing chooses the edge. A second labelled arrow reaches the emphasised card for the nearest point of presence, where TLS terminates and the edge cache is checked first. Two labelled arrows then branch: route A is a cache hit served from the edge, and route B is a cache miss that asks the origin shield, with a further arrow on to the origin. A closing card states that the route, not the server, decides the wait. WHERE IT STARTS One user asks for one object The browser holds a name and a single address for it. Nothing the user does picks an edge,and nothing in the reply says which edge answered. THE SETUP One address is announced from every edge A content network gives every point of presence the same address and lets routing decide, sothe user never picks an edge and never sees the choice being made. WHERE THE REQUEST LANDS The nearest point of presence answers Nearest means nearest in routing terms, not in miles. TLS terminates here, and the edgecache is checked before anything travels any further. ROUTE A Cache hit at the edge The object is already at this point ofpresence, so the reply travels one shorthop back to the user and nothing elsemoves. ROUTE B Cache miss asks the shield The edge asks one designated point ofpresence that stands in front of theorigin on behalf of all the other edges. ROUTE B Origin, the last resort Only a shield miss reaches the origin.The response fills the shield and theedge on the way back to the user. WHAT A LEARNER TAKES AWAY The route decides the wait, not the server Route A ends near the user. Route B is the only one that crosses the distance to the origin,and the shield is why many edges share a single origin fetch. one name, one address, wherever the user is anycast: the nearest announcement wins the object is in the edge cache the edge cache has no copy the shield has no copy either first byte from the edge first byte after the long path

28.1 Why the internet feels fast

Start with the one quantity in networking that no budget can buy away. A request has to travel to wherever the answer is and the answer has to travel back. That round trip has a floor set by the distance and the medium, and the floor does not care how many processors the destination has, how well the code is written or how much the hosting costs. Buy a faster server and you shorten the part of the wait the server owns. The journey is untouched.

Now recall what a modern connection actually costs in round trips, because the foundations stage measured it. Resolving the name is a journey. Opening the transport connection is a journey. Agreeing keys is a journey, or part of one. Sending the request and waiting for the first byte of the reply is another. Those journeys multiply the distance rather than adding to it, which is why a service that feels instant to the team that built it, sitting in the same city as the server, feels sluggish to a user on another continent running identical code against identical hardware. The difference between those two experiences is geography.

Once the problem is stated that way the answer is forced. If you cannot make the journey faster, make it shorter, which means putting the answer near the person asking. That is the entire idea of a : a set of caches placed close to users that serve content on the origin's behalf, together with the request routing that decides which cache a given user reaches. The origin stays authoritative and keeps the truth. The caches carry the traffic. Each of the sites holding those caches is a , and where those sites sit is usually the largest single lever anyone has over , because it is the only lever that operates on distance rather than on work.

Which raises the question the rest of the section answers, and it is a harder question than it looks. How does a browser in Lisbon end up talking to a machine in Lisbon, given that the user typed a name, the name resolved to an address, and neither the user nor the browser knows that any of this exists?

The obvious answer is to hand out different addresses to different people, and it is not the answer content networks rely on. The mechanism they rely on is : announce the same address from many separate locations and let ordinary routing deliver each client to one of them. The client does nothing special and is told nothing. It sends to one address. The routing system, doing exactly what it does for every other packet, delivers to whichever announcement of that address it considers best from where the packet entered.

Three consequences follow, and they are the ones worth carrying out of this section. The first is that nearest means nearest in routing terms and not in miles. Routing chooses by the path metrics and business relationships that the routing module took apart, so a user can be served by a site that is further away on a map and closer along the wire, and occasionally by one that is neither, because somebody's routing policy said so. The second is that the choice is invisible from both ends: the user is never told which site answered, and the operator of the origin cannot see the decision being made either. The third is that this is not steering that anybody performs. There is no lookup table of users and no geographic database being consulted per request. Routing is doing what it already does, and the edge selection is a by-product of it.

Naming the machine that answers is only the beginning of the argument. The reason the edge matters to an engineer is not that it is nearby. It is what it does once the request lands there, starting with the fact that the encrypted connection your user believes they have with you actually ends at a machine you do not own.

28.2 Inside a point of presence

When the request lands at the edge, the first thing that happens is the thing people find hardest to accept. terminates there. The certificate the browser checked, which carries the site's name and satisfied every validation rule the TLS module described, was presented by the edge. The keys were agreed with the edge. The encrypted channel the user trusts runs from their device to a machine in a rented rack a short distance away, and it stops there.

Nothing about that is a defect, and TLS is not being weakened by it. The protocol protects a connection between two endpoints, and the edge is genuinely one of those endpoints. What has moved is who the far endpoint belongs to. A second connection, which the user never sees and which usually carries its own separate encryption, runs from the edge back to the origin when the edge needs something. Two connections, two handshakes, two sets of keys, one address bar.

Follow that through and the argument of this section arrives on its own. If the connection ends at the edge, then the edge is what parses the request. It decides which HTTP version the conversation uses. It applies compression, rewrites or adds headers, enforces the rate limit, decides what a request with no matching route deserves, and decides how long it is prepared to wait for the origin before giving up and producing an error page of its own design. Users experience all of that as the behaviour of your server. Most of it is the behaviour of an intermediary you rent, and a good deal of it is governed by a configuration held in that vendor's dashboard rather than anywhere in your repository.

That is the practical reason engineers get stuck on incidents in this stage of the course. A user reports an error your application cannot produce, carrying a reference number that appears in none of your logs, at a moment when your service was healthy. All three observations are true at once, and they are consistent, because the thing that answered was not your service.

Four layers answer a request, and only one is not a cache

A miss is the thing that travels down the stack, so the first layer holding a copy answers and only the origin has to build the response, and that reply then fills every cache it passes on the way back.

Four layers stand between a request and its answer, the browser cache, the edge cache and the shield, and only the origin has to build the response (blueprint module P8, section 2).

Four layers answer a request, and only one is not a cache A layered stack of four full width cards read from top to bottom, each naming what it holds and what a miss there costs. Layer 1 is the browser cache on the user's own machine. Layer 2 is the edge cache at the point of presence that answered. Layer 3 is the shield cache standing in front of the origin on behalf of every edge. Layer 4, emphasised, is the origin, the layer that is not a cache because it builds the response rather than storing someone else's. A labelled arrow between each pair carries the miss down to the next layer, and a final arrow leads to a closing note that the reply fills every layer it passes through on the way back. LAYER 1 on the device Browser cache, on the user's own machine Holds: responses this one user already fetched, kept for as long as the response headersallow.A miss costs: one request leaves the device and joins the network. LAYER 2 at the nearest point of presence Edge cache, at the point of presence that answered Holds: objects that other nearby users have already pulled through this same edge.A miss costs: a request to the shield, further away but still inside the content network. LAYER 3 one edge in front of the origin Shield cache, standing in front of the origin Holds: one shared copy on behalf of every edge that points at it, so the edges do not eachask.A miss costs: the request that actually leaves the content network for the origin. LAYER 4 the source of truth Origin, the layer that is not a cache Holds: nothing on anyone else's behalf. This is the layer that builds the response.There is no next layer to ask: a miss here is simply work the origin has to do. not stored here, so ask the edge not at this edge, so ask the shield not at the shield, so ask the origin what the reply does on its way back ON THE WAY BACK The reply fills every layer it passes through A copy only exists because an earlier request missed and filled it, so the first userthrough pays for the fill and everyone behind them does not.

The figure above stacks the four places an answer can come from, and it is worth reading it as a sequence of questions rather than as a diagram of boxes. The first question is asked on the device itself. The browser cache holds responses this one user already fetched, kept for as long as the response headers allowed, and a hit there means no request leaves the machine at all. This is the cheapest cache in the system and the one operators think about least, which is why response headers that nobody has reviewed for two years are such a common finding.

A miss sends the request to the edge cache at the point of presence that anycast selected. That cache holds objects other nearby users have already pulled through the same site, which is the first point at which one person's request pays for another person's speed. A hit here is the route the primary figure calls route A: the reply travels one short hop back and nothing else in the world moves.

A miss at the edge is where the design gets interesting, and where a naive content network hurts the origin it was bought to protect. Consider what happens without the next layer. A popular object expires. Every point of presence discovers this independently, at roughly the same moment, because they were all serving the same object to their own local users. Every one of them then asks the origin. One expiry produces one request per site, all in the same second, at exactly the moment the object is most in demand. The origin sees a spike that looks like an attack and is in fact its own cache doing its job.

An removes that. It is a caching tier placed between the many edges and the customer's origin, and the rule that makes it work is a restriction rather than an addition: an edge that misses must ask the shield, and only the shield is allowed to ask the origin. The many simultaneous misses collapse into one fetch. The rest are served from the shield, which is further from the user than the edge and much closer than the origin, and which exists precisely so that the edges do not each ask.

Only a miss at the shield reaches the origin, the one layer in the stack that is not a cache because it builds the response rather than storing somebody else's. And on the way back the reply fills every layer it passes through, which is the sentence that explains cache behaviour better than any hit-rate figure. A copy exists only because an earlier request missed and filled it. The first user through pays for the fill; everybody behind them does not.

Now put the two halves of this section together, because the combination is what changes an engineer's working practice. The connection ends at the edge, and most requests never travel past it. Therefore the request log at your origin is not a record of user demand. It is a record of cache misses, which is a small and heavily biased sample: it over-represents the unusual, the uncacheable and the first request after every expiry, and it under-represents everything popular enough to matter. Reading origin traffic as if it were user traffic will mislead you about load, about which pages are used, about which countries you serve and about when your busy period actually is.

Common misconception

The edge is only a cache. My users are really talking to my server.

They are talking to the edge, and the distinction is not academic. TLS terminates at the point of presence, so the connection the browser authenticated ends there and a second connection runs onwards to the origin. The edge decides the HTTP version, applies compression, adds or strips headers, enforces rate limits and produces its own error pages when the origin is slow or unreachable. A user reporting behaviour your application cannot produce, with a reference number absent from your logs, is describing the intermediary rather than imagining things. The operational correction is to treat the content network as part of the system under investigation, with its own configuration, its own logs and its own change history, rather than as a transparent pipe that can be assumed innocent.

Everything so far has assumed the client reaches the edge in the first place. Anycast gets it there once it has an address to send to, and getting an address is the job of a system this course has already taught. What has changed since that module is how much more than an address the client now asks for, and how much of the connection is decided before a single packet is sent to the destination.

28.3 Steering by DNS

The foundations module on the path from a URL to the first byte ended with a correction to the mental model most people carry: the browser no longer looks up an address and then connects. It asks DNS how to connect, and then races. This section is where that correction pays off, because the record it asks for is the mechanism that lets a content network steer a connection before the connection exists.

An address record answers one question and only one: which address. That was sufficient when every service on the internet spoke the same protocol on the same port. It stopped being sufficient once an endpoint might speak several HTTP versions, might prefer a different name for the actual service, might want a different port, and might hold keys that the client needs before it can send the first encrypted message. A client with only an address has to guess, connect, discover it guessed wrong and try again, and every one of those steps is a journey with the floor described in section 28.1.

The is the form of that record specific to the http and https schemes, and the parameter that matters most for this module is . Listing the protocols an endpoint speaks in DNS means a client can start on from its very first connection instead of discovering later that it was available.

Compare that with how the same discovery worked before. HTTP/3 announces itself during the handshake through the ALPN token h3, so the client learns the endpoint speaks it at the moment it is already connecting. To know in advance, a browser had to have been told on a previous response, through the header field, that the same resources were also available over another protocol. That works, and it has one structural weakness: it requires an earlier connection over the older protocol. The first visit always pays. Moving the announcement into DNS moves it before the connection, so the first visit stops paying, and a service can shift its clients between endpoints and protocols by publishing a record.

It is worth being precise about the division of labour between the two steering mechanisms in this module, because they are frequently confused and they fail in opposite ways. DNS steering chooses which endpoint, which protocol and which parameters, and it is coarse: the answer is cached for as long as its lifetime allows, it is the same answer for everyone who asked that , and the that produced it saw the resolver rather than the user. Anycast chooses which instance of the endpoint, and it is fine-grained and current: it is decided by routing, per packet, from wherever the packet actually entered the network, with no cache and no guess about where anybody is.

That is why serious content networks use both rather than picking one. DNS carries the part that has to be known before the connection and changes slowly. Routing carries the part that has to be right at the moment of the packet. A design that tries to do proximity selection in DNS alone inherits every caching and vantage-point problem in the resolution chain, and this course has already shown how long a stale answer can outlive the thing it described.

One further consequence belongs to the security stage rather than to performance. If the connection instructions live in DNS, then whoever answers DNS for your users has acquired influence over which endpoint they reach. Encrypted resolution moved that influence from the local network to the resolver the client chose, which the DNS module treated as a genuine trade rather than as a straightforward improvement. The same record type also carries the keys for , which closes the gap where the requested name travelled in clear text at the start of the handshake, and closes it only for clients that fetched the record.

So far every capability in this module has been about moving copies of an answer closer to people. The next step is the one vendors sell hardest, and it is a different claim: not moving the answer, but moving the code that produces it.

28.4 Compute moves to the edge

The same estate of points of presence that stores objects can also run code, and the platforms that do it are familiar: Workers and Lambda@Edge class services, where a short piece of application logic executes at the site that answered rather than in one central region. That is , and the honest way to place it is with one sentence you should keep. It buys latency, not capacity.

Test any proposal against that sentence and most of the argument resolves itself. Work that is round-trip bound gets faster, because the round trip is what shortened. Work that is bound by anything else does not, because nothing else changed. The processor at the edge is not faster than the processor in your region. The database is not closer. The dataset your code needs did not move. All that moved is the place the code runs, so only the delays that were caused by distance can shrink.

That gives a usable rule for what belongs there: work that decides something about the request itself, using only what the request carries, and where the decision is what the user is waiting for. Redirects and rewrites qualify. Choosing which variant of a page a visitor sees qualifies. Validating a signed token before anything expensive is started qualifies, and it is the case the zero-trust module argued for, because a request that should be refused is best refused before it crosses an ocean. Setting or reading a cookie, normalising headers, blocking an obviously abusive client, serving a maintenance page while the origin is unreachable: all of these are decisions the request already contains the inputs for.

The rule excludes more than it admits, and the exclusions are where money is wasted. Anything that has to read or write a single authoritative copy of state does not belong at the edge, because the write has to reach whichever region holds that copy and you have simply moved the code away from the data it needs. Anything working over a large dataset does not belong, for the same reason. Anything with a data-residency obligation is worse than slow, because code that runs in hundreds of locations is code that processes data in hundreds of jurisdictions, and that is a legal question rather than an engineering one.

The worst case is the one that looks like a success in the demonstration. Move a piece of application logic to the edge, keep the database in one region, and every request now travels from the user to a nearby site, from that site to the distant region and back, then back to the user. The distance was not removed. It was paid twice, with an extra hop added, and the profile of the request looks better in exactly one metric, which is the time to first byte of a response whose useful content arrives later.

Common misconception

Moving our application to the edge will make it faster.

It makes the parts of it that were waiting on distance faster, and only those. Edge compute buys latency rather than capacity: the same work is done on comparable hardware, closer to the user. If a request spends most of its time in a database query, a queue or a third-party call in one region, running the surrounding code at the edge changes none of that and adds a hop, because the code now has to reach across the distance the platform was sold as removing. The parts that genuinely gain are the decisions a request already carries the inputs for, which is why authorisation checks, redirects, rewrites and variant selection are the standard wins and a general application migration is not.

Two operational facts round the section out, and both follow from the same property that makes edge compute attractive. Code that runs in hundreds of places fails in hundreds of places independently, so an incident is normally partial: it affects the users routed to a subset of sites and looks like nothing at all from anywhere else, which is precisely the shape of failure the practice capstone is built around. And a deployment reaches those places over a short but real interval, so two users can be running different versions of your logic at the same moment. Neither fact is a reason to avoid the technique. Both are reasons to instrument it per location and to design for a request that might meet either version.

Every proxy in this module so far has been one you chose, paid for and configured. The last section is about the same machinery arriving from the other direction, put there by the user, and it is the part that changes what your logs mean.

28.5 Proxies inside the protocol

Proxies are not new and this course has met several. What is new is where they live. The proxies of the previous decade sat at a boundary somebody administered: the corporate web gateway, the reverse proxy in front of an application, the transparent cache an internet provider installed. They were infrastructure, imposed on the traffic that happened to pass through them.

MASQUE inverts that. It is proxying expressed as an ordinary request inside an ordinary HTTP connection, made by the client, to a server that agrees to act as a proxy. RFC 9298 covers the UDP case, known as CONNECT-UDP: the client asks the proxy to open a UDP association on its behalf and then exchanges HTTP datagrams with it, which is what carries and therefore what carries most modern web traffic. RFC 9484, CONNECT-IP, does the same at the IP layer, so an entire packet flow rather than a single association can be tunnelled the same way.

Notice what that means for anyone watching the connection. The tunnel runs inside a normal HTTPS conversation, to a normal HTTPS port, over the same transport as the rest of the web. There is no distinctive protocol on a distinctive port to recognise. A network that wishes to identify this traffic is reduced to identifying the proxy operator's addresses, which is a policy decision about named companies rather than a protocol control, and one that ages badly.

The story at the top of this module is the deployed example, and its two-hop structure is the part worth understanding rather than the branding. One relay knows who the user is and not where they are going. The other knows the destination and not who asked. Neither can produce the record that a single proxy would hold by default. The design is a deliberate separation of two facts that are only sensitive when combined, and it is enforced by architecture rather than by policy, which is the same argument the zero-trust module made about not trusting a component more than the design requires.

For the operator of a service, all of this arrives as one blunt change: the client address you record may belong to a relay. Work through what that breaks, because each item is a control that a lot of estates still rely on.

Geolocation by address stops describing the user and starts describing the relay egress, which may be in a different country to the person. Blocking or allowing by address stops being a statement about one network and becomes a statement about everyone sharing that egress, which is the classic way a well-intentioned block takes out a population of ordinary customers. Rate limiting by address counts a crowd as one client, so the limit either lets abuse through or throttles legitimate users, and it is not obvious from the metrics which of those you have chosen. Treating an address as a stable identifier for one person, across a session or across days, stops working because the egress can change and because two unrelated users can share one. And any fraud or abuse score that weights an address is now weighting a property of a proxy service that the user did not choose per request.

The remedy is not to detect and defeat the relay. It is to stop asking the address for information it never reliably held. Identity comes from authentication, and this course has already spent a module on why the authenticated principal, evaluated per request, is the control that survives contact with reality. Rate limits attach to accounts, sessions or tokens. Location, where you genuinely need it, comes from something the user tells you or from a business record such as a delivery or billing address, both of which are honest about being claims. The address stays useful for what it is: a network-layer fact, good for diagnosing a path, not for identifying a person.

One caveat keeps this from becoming a counsel of despair. Relayed traffic is still ordinary traffic once it arrives. Your edge still terminates TLS with the client, the request still carries whatever the application put in it, and the session is still the session. What you lost is a proxy for identity that was always weak and is now obviously so, which is the same lesson the IPv6 module reached from a completely different direction when privacy addressing made a laptop show several addresses at once.

Common misconception

The client IP address in our logs tells us which network, and which country, the user is on.

It tells you the last hop that spoke to you, which is increasingly not the user. Standardised in-protocol proxying under RFC 9298 and RFC 9484 lets a client route its traffic through relays inside an ordinary HTTPS connection, and a shipping consumer product does exactly that by default for the browsing of everybody who turns it on. Address translation and mobile carrier sharing already meant one address could stand for many people. Relaying adds that the address may describe an operator in a different country to the person, chosen for privacy rather than by their network. Treat the address as evidence about a path and not as an identity, a location or a reputation, and move every control that needs those three onto authenticated identity.

There is a measurement point hiding in all of this, and it closes the loop with a discipline this course keeps returning to. Cloudflare Radar, which this course uses as a public window on protocol adoption, publishes what it publishes because it operates one of these edges and can see the traffic that arrives there. says to name that vantage point rather than ignore it: the figure describes the population that reaches that particular network, from wherever anycast routed them, seen at the layer the edge terminates. That is a real measurement, published with its method, and it is not the same thing as a measurement of the internet. The whole of this module is a reason why: what an edge can see is exactly what did not have to travel any further.

The check below runs the module's central distinction as it appears in practice, which is somebody asking where a request ended when the answer decides who has the evidence.

28.6 Check your understanding

A user in Lisbon loads an image from a site whose origin server is in Ohio and which sits behind a content network. The image is already held in the cache at the point of presence that answered. Where does the user's connection end, and how far does this request travel?

Core distinctions

  • Distance sets a floor on how fast a request can be answered, and no server is fast enough to cross it. A content delivery network answers the question by moving copies of the answer close to users, so the largest performance lever is where the points of presence sit.
  • Anycast announces one address from many sites and lets ordinary routing deliver each client to one of them. Nearest means nearest in routing terms rather than in miles, and neither the user nor the origin operator can see which site was chosen.
  • TLS terminates at the edge. The certificate the browser validated was presented by the point of presence, a separate connection runs on to the origin, and the HTTP version, compression, headers, rate limits and error pages users experience are the intermediary's behaviour rather than the application's.
  • Four layers can answer: browser cache, edge cache, shield and origin. Only the origin is not a cache. An origin shield collapses many simultaneous edge misses into one origin fetch, and the reply fills every layer on the way back, so the first user through pays for the fill.
  • RFC 9460 HTTPS records let a client learn before connecting which protocols an endpoint speaks, which target and port to use and which encrypted client hello keys apply. DNS steers coarsely and in advance; anycast steers finely and per packet; serious deployments use both.
  • Edge compute buys latency rather than capacity, so it helps decisions a request already carries the inputs for and not work bound by a distant database. MASQUE proxying under RFC 9298 and RFC 9484 means the client address you record may belong to a relay, so identity, location and rate limits belong on the authenticated principal.

Standards and sources cited in this module

  1. RFC 9460, Service Binding and Parameter Specification via the DNS (SVCB and HTTPS Resource Records)

    The HTTPS record type and its service parameters, including alpn

    The standard behind section 28.3: a client learns from DNS, before opening a connection, which protocols an endpoint supports, which target name and port to use, address hints and encrypted client hello keys. This is the DNS-side steering mechanism the module argues content networks depend on.

  2. RFC 9298, Proxying UDP in HTTP

    Client requests to a proxy to open a UDP association, and the exchange of HTTP datagrams

    The MASQUE specification for the UDP case, used in the opening story and in section 28.5. It is the standardised form of in-protocol proxying that carries QUIC traffic through a proxy inside an ordinary HTTP connection.

  3. RFC 9484, Proxying IP in HTTP

    IP-layer proxying over HTTP

    The companion specification cited in the story and section 28.5, extending in-protocol proxying from a single UDP association to IP packet flows. Named alongside RFC 9298 as the pair that makes relaying a client request rather than an operator imposition.

  4. About iCloud Private Relay (Apple)

    How the two relays divide what each one can see

    The source for the opening case: browsing travels through two separate relays, the first seeing the address but not the destination and the second resolving and connecting without knowing who asked. Used again in section 28.5 for the consequence that a recorded client address may belong to a relay.

  5. Tiered Cache (Cloudflare Docs)

    Lower tier, upper tier and which tier may contact the origin

    The vendor documentation behind the origin shield described in section 28.2: an edge that misses asks a designated upper tier, and only that upper tier may ask the origin, which is what collapses many simultaneous misses into a single origin fetch.

  6. What is Amazon CloudFront? (Amazon Web Services)

    Edge locations, also called points of presence, and request routing

    The documentation behind the definition of a point of presence used in sections 28.1 and 28.2: geographically dispersed sites that cache copies of files, with each request routed to the location that gives the lowest latency.

  7. How Workers works (Cloudflare Workers documentation)

    Execution across many locations

    The platform documentation behind section 28.4, describing application code running across a large number of locations close to users. Used to support the argument that edge compute buys latency rather than capacity.

  8. Cloudflare Radar, adoption and usage

    Protocol adoption measured at one operator's edge

    The public measurement window named in section 28.5. It is cited here for what its vantage point is: traffic that arrived at one content network's points of presence, which is a real measurement published with its method and not a measurement of the whole internet.

This module put a machine you do not own between your users and your servers, and then established that it terminates the connection, answers most requests, holds the only log of them and may be reporting an address that belongs to a relay. The capstone that follows is the scenario where all of that arrives at once: dashboards that are green because they measure the origin, and users who are certain something is wrong. You now have the two branches the elimination walk needs, which are whether the user was authorised at the proxy and whether the failure sits at the edge or at the origin.

Module 32 of 45 · Practice