Extensive documentation is here:
http://www.w3.org/Protocols/rfc2616/rfc2616.html
Overview is very simple. Client negotiates a connection with the server. Client sends request. Server sends response. End of story.
Well, not quite. For performance reasons, keep-alive allows the same channel to be used for multiple request/response cycles.