In an extremely rough and simplified sketch, assuming the simplest possible HTTP request, no proxies and IPv4 (this would work similarly for IPv6-only client, but I have yet to see such workstation): app
browser checks cache; if requested object is in cache and is fresh, skip to #9 less
browser asks OS for server's IP address this
OS makes a DNS lookup and replies the IP address to the browser spa
browser opens a TCP connection to server (this step is much more code
complex with HTTPS) orm
browser sends the HTTP request through TCP connection server
browser receives HTTP response and may close the TCP connection, or ip
reuse it for another request ci
browser checks if the response is a redirect (3xx result status codes), rem
authorization request (401), error (4xx and 5xx), etc.; these are handled
differently from normal responses (2xx)
if cacheable, response is stored in cache
browser decodes response (e.g. if it's gzipped)
browser determines what to do with response (e.g. is it a HTML page, is it
an image, is it a sound clip?)
browser renders response, or offers a download dialog for unrecognized
types
Again, discussion of each of these points have filled countless pages; take this as a starting point. Also, there are many other things happening in parallel to
this (processing typed-in address, adding page to browser history, displaying progress to user, notifying plugins and extensions, rendering the page while it's downloading, pipelining, connection tracking for keep-alive, etc.).