Anatomy of a Web Request: What Happens When You Type a URL into Your Browser?

Arpit Bhayani

Arpit Bhayani

Mar 23, 2024 • 8 min read

Play

Navigating to a web page by typing a URL into a browser address bar is one of the most common actions in modern computing. Behind this seemingly instantaneous interaction lies a coordinated orchestration across networking protocols, operating system subsystems, global infrastructure, and client-side rendering engines.

This guide breaks down each stage of the request lifecycle, starting from the anatomy of a uniform resource locator (URL) to the final execution of client-side assets.


1. Anatomy of a URL

Consider a standard URL:

https://www.google.com/api/search?q=home

Every URL is composed of distinct functional fragments:

  https :// www.google.com / api/search ? q=home
  \___/     \____________/   \________/   \_____/
 Scheme         Domain          Path       Query Params
  1. Scheme (https): Defines the application protocol used to establish communication. Common schemes include http, https (HTTP over TLS), ws (WebSocket), and wss (WebSocket Secure).
  2. Domain / Host (www.google.com): The human-readable identifier of the target server.
  3. Path (/api/search): The hierarchical path pointing to the specific resource or endpoint on the target host.
  4. Query Parameters (?q=home): Key-value pairs providing additional query-scoped metadata or filter instructions to the server.

2. Phase 1: DNS Resolution

Computers and networking gear do not route packets using domain names like google.com; they require numeric Internet Protocol (IP) addresses (such as 142.250.190.46 for IPv4 or 2607:f8b0:4005:808::200e for IPv6). Domain names exist as an abstraction layer for human memory.

The process of mapping a human-readable hostname to an IP address is called Domain Name System (DNS) Resolution.

flowchart TD
    A[Browser Navigation] --> B{Browser DNS Cache?}
    B -- Hit --> TargetIP[Obtain IP Address]
    B -- Miss --> C{OS DNS Cache?}
    C -- Hit --> TargetIP
    C -- Miss --> D[Recursive DNS Resolver / ISP]
    D --> E[Root Nameserver .]
    E --> F[TLD Nameserver .com]
    F --> G[Authoritative Nameserver google.com]
    G --> TargetIP

The Caching Hierarchy

Because resolving a domain name over the network introduces latency, caching occurs at multiple layers:

  1. Browser Cache: Modern browsers (such as Chrome, Firefox, or Safari) maintain their own in-memory DNS cache with short time-to-live (TTL) counters to eliminate inter-process and network calls for recent domains.
  2. Operating System Cache: If the browser experiences a cache miss, it issues a system call (e.g., getaddrinfo on POSIX systems). The OS consults its local resolver cache and the local static hosts file (/etc/hosts).
  3. Recursive DNS Resolver (ISP or Anycast DNS): If not present locally, the query exits the machine and reaches the configured recursive resolver (such as your ISP’s resolver, Google’s 8.8.8.8, or Cloudflare’s 1.1.1.1).

Recursive and Iterative Traversal

If the recursive resolver does not have the record cached, it performs an iterative lookup across the DNS hierarchy:

  • Root Nameservers (.): Directs the resolver to the Top-Level Domain (TLD) nameservers responsible for the target domain suffix (e.g., .com, .org, .in).
  • TLD Nameservers (.com): Directs the resolver to the authoritative nameservers specifically designated for google.com.
  • Authoritative Nameservers: Maintains the canonical record mapping google.com to its current IP address (via DNS A or AAAA records).

Once the authoritative server answers, the recursive resolver returns the IP address down the chain, caching it at each tier according to the record’s TTL.


3. Phase 2: Transport Connection (TCP & TLS)

With the IP address resolved, the browser initiates communication at the transport layer.

For http:// and https:// requests, the browser creates a stream socket and initiates a Transmission Control Protocol (TCP) three-way handshake:

Client                                Server
  |                                      |
  | ---------- SYN (seq=x) ------------> |
  | <------- SYN-ACK (seq=y, ack=x+1) -- |  (Handshake complete)
  | ---------- ACK (ack=y+1) ----------> |
  |                                      |
  | === TLS Handshake (if HTTPS) ======= |
  |                                      |
  • For HTTPS, the TCP handshake is followed immediately by a Transport Layer Security (TLS) handshake, negotiating cipher suites, validating the server’s X.509 certificate, and deriving ephemeral symmetric session keys.
  • In production architectures, the resolved IP address typically does not belong directly to an application server. Instead, it hits an edge infrastructure tier: an Anycast border router, Layer 4/Layer 7 Load Balancers, or an API Gateway, which subsequently routes traffic to downstream microservices.

4. Phase 3: The HTTP Request

Once the reliable byte-stream connection is established, the client constructs and transmits an application-layer HTTP message. Protocols provide a standardized contract so that any client and any server can exchange structured information.

When a user enters a URL into the browser bar, the browser issues an HTTP GET request by default. In HTTP/1.1, this message is serialized as plain text over the TCP connection:

GET /api/search?q=home HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Connection: keep-alive

Request Anatomy

  • Request Line: GET /api/search?q=home HTTP/1.1 defines the HTTP verb (GET), the relative resource path with query string, and the protocol version.
  • Headers: Key-value pairs providing request context.
    • Host: Specifies the target domain (mandatory in HTTP/1.1 to support virtual hosting on shared IP addresses).
    • Connection: keep-alive: Informs the server to keep the underlying TCP socket open for subsequent requests, avoiding the overhead of repeated handshakes.
  • Empty Line (\r\n\r ): Signals the termination of the header block.

5. Phase 4: Server Processing and Response

Upon reading bytes from the socket, the web server processes the request:

  1. Parsing: The server de-serializes the raw stream into structured data structures (headers, method, path, parameters).
  2. Routing and Business Logic: The server matches the path (/api/search) to an internal controller or route handler. This handler may read static files from disk, execute business logic, query a database, or invoke upstream microservices.
  3. Response Assembly: The server packs the computed output into an HTTP response format and writes it back to the socket.

An example HTTP/1.1 response:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 2092
Date: Sat, 23 Mar 2024 12:00:00 GMT
Connection: keep-alive

<!DOCTYPE html>
<html>
  <head><title>Search Results</title></head>
  <body>
    <h1>Search Query: home</h1>
    ...
  </body>
</html>

Response Elements

  • Status Line: Contains the protocol (HTTP/1.1), numeric status code (200), and human-readable reason phrase (OK).
  • Headers:
    • Content-Type: text/html: Dictates the MIME type of the payload, signaling how the client should interpret the response body.
    • Content-Length: 2092: Explicitly declares the payload size in bytes, enabling the client to know exactly when the response body ends over a persistent connection.
  • Response Body: The actual payload (e.g., HTML document, JSON payload, binary asset).

6. Phase 5: Browser Parsing and the Resource Cascade

When the client receives the response bytes, it inspects the headers before dealing with the body:

flowchart TD
    A[HTTP Response Received] --> B{Inspect Content-Type}
    B -- text/html --> C[Initialize HTML Parser & DOM]
    B -- application/pdf or unknown binary --> D[Trigger File Download Manager]
    C --> E[Encounter External Assets]
    E -- link rel='stylesheet' --> F[Fire Sub-request for CSS]
    E -- img src=... --> G[Fire Sub-request for Image]
    E -- script src=... --> H[Fire Sub-request for JS / Execute in V8]

1. MIME-Type Evaluation

The browser inspects the Content-Type header:

  • If the content is text/html, the browser hands the body to its layout and rendering engine (e.g., Blink, WebKit, Gecko).
  • If the content is application/pdf, application/octet-stream, or an unhandled binary format (and no plugin is configured to view it inline), the browser treats the payload as an attachment and delegates it to the local download manager.

2. DOM Construction and Sub-Resource Loading

For HTML documents, the rendering engine parses tokens incrementally to construct the Document Object Model (DOM):

  • Linked CSS (<link rel="stylesheet">): The browser detects external stylesheets and immediately triggers concurrent HTTP GET requests to fetch the CSS files. These stylesheets are parsed to build the CSSOM (CSS Object Model), which blocks rendering to avoid a Flash of Unstyled Content (FOUC).
  • Images (<img src="...">): The browser initiates non-blocking parallel network requests to fetch image assets and decodes them onto the paint layer once downloaded.
  • JavaScript (<script>): Scripts are downloaded and evaluated inside the browser’s JavaScript engine (e.g., Google Chrome’s V8 engine). JavaScript execution can mutate the DOM, dispatch asynchronous background HTTP requests (fetch or XMLHttpRequest), and trigger dynamic re-layouts.

Every linked asset repeats the same underlying pipeline—cache evaluation, optional DNS resolution, connection reuse or creation, and HTTP request dispatching.


Summary of the Full Lifecycle

StepPhaseCore ActionKey Protocols / Mechanisms
1URL DecompositionParse scheme, host, path, and query paramsRFC 3986 URI Specification
2Name ResolutionResolve domain to IP via hierarchical lookup & cachesDNS, UDP, Browser/OS Cache
3Connection SetupEstablish reliable transport between client and serverTCP 3-way handshake, TLS 1.3
4Request SerializationClient writes HTTP request to the socketHTTP/1.1, HTTP/2, HTTP/3
5Server ProcessingRouting, computation, and HTTP response serializationL4/L7 Load Balancer, Web Server, DB
6Client IngestionContent-Type negotiation, DOM tree constructionMIME sniffing, HTML/CSS Parsers
7Asset CascadeFetching and executing auxiliary resources (CSS, JS, images)V8 Engine, Sub-resource Fetching
Arpit Bhayani

Principal Engineer II at Razorpay - building Agent Studio, Ex-staff engg at GCP Memorystore & Dataproc, Creator of DiceDB, ex-Amazon Fast Data, ex-Director of Engg. SRE and Data Engineering at Unacademy. I spark engineering curiosity through my no-fluff engineering videos on YouTube and my courses