HTTP request smuggling occurs when HTTP requests pass through multiple entities that parse requests differently, allowing an attacker to smuggle a request to one entity without the other being aware. There are two main causes - using HTTP connection modifications like Keep-Alive and Pipeline, which allow multiple requests over a single connection, and message body transfer encodings like chunked encoding, which send content in chunks. An attacker can craft requests that one entity parses one way based on headers like Content-Length, while the other entity parses differently based on Transfer-Encoding, allowing a request to be smuggled through.