One HTTP request is a pipeline of smaller protocols, and each stage hands off to the next: the URL parse determines whether TLS is required, DNS turns the hostname into an address, TCP provides the byte stream, and TLS wraps it. Only then do HTTP bytes exist. The server's job is the reverse: read the stream, parse the request, route it, and stream the response back.
Keep-alive is what makes the ordering pay off: the expensive stages — TCP handshake and TLS setup — happen once per connection, while hundreds of requests reuse the socket. Framing matters because the stream is bytes, not messages: Content-Length and chunked encoding are how both sides know where one request or response ends and the next begins. A request is fast when every stage is a cache hit and a pool hit; it is slow when any single stage — DNS, TCP, or TLS — has to run cold.